config.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. package util
  2. import (
  3. qu "app.yhyue.com/moapp/jybase/common"
  4. elastic "app.yhyue.com/moapp/jybase/es"
  5. "app.yhyue.com/moapp/jybase/mongodb"
  6. "app.yhyue.com/moapp/jybase/mysql"
  7. "app.yhyue.com/moapp/jybase/redis"
  8. "bytes"
  9. "github.com/Chain-Zhang/pinyin"
  10. "golang.org/x/text/encoding/simplifiedchinese"
  11. "golang.org/x/text/transform"
  12. "io/ioutil"
  13. "sort"
  14. "strings"
  15. )
  16. var (
  17. Sysconfig map[string]interface{} //配置文件
  18. Mgo *mongodb.MongodbSim
  19. MgoCus *mongodb.MongodbSim //企业服务库
  20. MgoEn *mongodb.MongodbSim
  21. EsIndex, EsType string
  22. InterimIndex string
  23. TotalIndex string
  24. MgoEnC string
  25. Subday float64
  26. PreviewHref string //数据预览地址
  27. CustomerApi string
  28. LatestId = "" //起始id
  29. MgoTag *mongodb.MongodbSim //标签库连接
  30. MgoSave *mongodb.MongodbSim //数据保存库连接
  31. MgoBuyer *mongodb.MongodbSim //医院等级信息
  32. MgoEnps *mongodb.MongodbSim //企业信息
  33. MgoExtract *mongodb.MongodbSim //抽取
  34. MgoBidding *mongodb.MongodbSim //bidding
  35. BiddingColl string
  36. SaveColl string
  37. HospColl string
  38. BuyerEntColl string
  39. EnpsColl string
  40. // Es *elastic.Elastic //es
  41. Es elastic.Es
  42. Index string
  43. Itype string
  44. TaskTime int64 //定时任务时间
  45. //历史数据
  46. SId string
  47. EId string
  48. CustomerName string
  49. SaveCollProject string
  50. SaveCollbid string
  51. SaveUserMail string
  52. ExtractColl string
  53. JyMysql *mysql.Mysql
  54. IsNewSql int
  55. JyResources *jyResourceCenter
  56. )
  57. var (
  58. TopTypeArr []string //公告一级分类
  59. SubTypeArr []string //公告二级分类
  60. Province []string //省
  61. ProvinceCitys map[string][]string //省:[市1,市2]
  62. CityDistricts map[string][]string //市:[区1,区2]
  63. BuyerClass []string //采购单位行业
  64. BuyerClassMap map[string][]string //采购单位行业带拼音字母
  65. MatchTypeMap *[]map[string]interface{} //匹配方式
  66. MatchTypeMap2 map[string]interface{} //匹配方式
  67. MatchTypeMap3 *[]map[string]interface{} //匹配方式
  68. ExistFiled *[]map[string]interface{} //存在的字段
  69. ScopeClassMap *[]map[string]interface{} //公告行业
  70. TagFieldMap *[]map[string]interface{} //标签属性值
  71. TaskTypeMap *[]map[string]interface{} //任务类型
  72. BuryClassType map[string]interface{}
  73. ProvinceMap map[string]interface{}
  74. )
  75. func InitMgoPool() {
  76. Mgo = &mongodb.MongodbSim{
  77. MongodbAddr: qu.ObjToString(Sysconfig["mgodb"]),
  78. Size: qu.IntAll(Sysconfig["dbsize"]),
  79. DbName: qu.ObjToString(Sysconfig["dbname"]),
  80. }
  81. Mgo.InitPool()
  82. customer := Sysconfig["customer"].(map[string]interface{})
  83. CustomerApi = qu.ObjToString(customer["api"])
  84. MgoCus = &mongodb.MongodbSim{
  85. MongodbAddr: qu.ObjToString(customer["mgodb"]),
  86. Size: qu.IntAll(customer["dbsize"]),
  87. DbName: qu.ObjToString(customer["dbname"]),
  88. }
  89. MgoCus.InitPool()
  90. }
  91. func initMgoEn() {
  92. MgoEn = &mongodb.MongodbSim{
  93. MongodbAddr: qu.ObjToString(Sysconfig["mgodben"]),
  94. Size: qu.IntAll(Sysconfig["dbsize"]),
  95. DbName: qu.ObjToString(Sysconfig["dbnameen"]),
  96. }
  97. MgoEnC = qu.ObjToString(Sysconfig["mongoenc"])
  98. MgoEn.InitPool()
  99. }
  100. func InitOther() {
  101. initCitys()
  102. initInfoType()
  103. initBuyerClass()
  104. initMatchType()
  105. initExitField()
  106. initScopeClass()
  107. initTaskType()
  108. initEs()
  109. // initMgoEn()
  110. Subday = qu.Float64All(Sysconfig["subday"])
  111. PreviewHref = qu.ObjToString(Sysconfig["preview_href"])
  112. initTagField()
  113. initdb()
  114. // initBuryClassType()
  115. // initProvince()
  116. IsNewSql = qu.IntAll(Sysconfig["isNewSql"])
  117. rpcSources := qu.ObjToMap(Sysconfig["jyResourceRpc"])
  118. JyResources = newJyResourceCenter(strings.Split(qu.ObjToString((*rpcSources)["hosts"]), ","), qu.ObjToString((*rpcSources)["key"]))
  119. }
  120. func initCitys() {
  121. //map初始化
  122. if ProvinceCitys == nil {
  123. ProvinceCitys = make(map[string][]string)
  124. }
  125. if CityDistricts == nil {
  126. CityDistricts = make(map[string][]string)
  127. }
  128. datas, ok := Mgo.Find("code_city", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  129. if !ok || datas == nil || len(*datas) == 0 {
  130. return
  131. }
  132. for k, data := range *datas {
  133. brief := data["brief"].(string)
  134. if k != 0 {
  135. Province = append(Province, brief)
  136. }
  137. if data["citys"] != nil {
  138. citys := data["citys"].([]interface{})
  139. citytmp := []string{}
  140. for _, city := range citys {
  141. cityMap := city.(map[string]interface{})
  142. for cname, districts := range cityMap {
  143. citytmp = append(citytmp, cname)
  144. tmp := districts.([]interface{})
  145. districtarr := qu.ObjArrToStringArr(tmp)
  146. CityDistricts[cname] = districtarr
  147. }
  148. }
  149. ProvinceCitys[brief] = citytmp
  150. }
  151. }
  152. Province = append(Province, qu.ObjToString((*datas)[0]["brief"]))
  153. }
  154. func initInfoType() {
  155. datas, ok := Mgo.Find("code_infotype", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  156. if !ok || datas == nil || len(*datas) == 0 {
  157. return
  158. }
  159. for _, data := range *datas {
  160. name := data["name"].(string)
  161. TopTypeArr = append(TopTypeArr, name)
  162. child := qu.ObjArrToStringArr(data["child"].([]interface{}))
  163. SubTypeArr = append(SubTypeArr, child...)
  164. }
  165. //qu.Debug(InfoTypeArr, InfoTypeMap)
  166. }
  167. func initBuyerClass() {
  168. if BuyerClassMap == nil {
  169. BuyerClassMap = make(map[string][]string)
  170. }
  171. datas, ok := Mgo.Find("code_buyerclass", `{}`, `{"name":1}`, `{}`, false, -1, -1)
  172. if !ok || datas == nil || len(*datas) == 0 {
  173. return
  174. }
  175. for _, data := range *datas {
  176. name := data["name"].(string)
  177. BuyerClass = append(BuyerClass, name)
  178. }
  179. sort.Sort(ByPinyin(BuyerClass))
  180. for _, name := range BuyerClass {
  181. str, _ := pinyin.New(name).Mode(pinyin.InitialsInCapitals).Convert()
  182. //fmt.Println(str, err)
  183. zimu := str[0:1]
  184. BuyerClassMap[zimu] = append(BuyerClassMap[zimu], name)
  185. }
  186. }
  187. func initMatchType() {
  188. //map初始化
  189. if MatchTypeMap2 == nil {
  190. MatchTypeMap2 = make(map[string]interface{})
  191. }
  192. MatchTypeMap, _ = Mgo.Find("code_matchtype", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  193. MatchTypeMap3, _ = Mgo.Find("code_matchtype", `{"type": 1}`, nil, nil, false, -1, -1)
  194. for _, d := range *MatchTypeMap {
  195. code := qu.ObjToString(d["code"])
  196. name := qu.ObjToString(d["name"])
  197. MatchTypeMap2[code] = name
  198. }
  199. }
  200. func initExitField() {
  201. ExistFiled, _ = Mgo.Find("code_field", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  202. for _, data := range *ExistFiled {
  203. str, _ := pinyin.New(data["name"].(string)).Mode(pinyin.InitialsInCapitals).Convert()
  204. //fmt.Println(str, err)
  205. //zimu := str[0:1]
  206. data["zimu"] = str
  207. }
  208. for i := 0; i < len(*ExistFiled); i++ {
  209. for j := 0; j < len(*ExistFiled)-i-1; j++ {
  210. if (*ExistFiled)[j]["zimu"].(string) > (*ExistFiled)[j+1]["zimu"].(string) {
  211. (*ExistFiled)[j], (*ExistFiled)[j+1] = (*ExistFiled)[j+1], (*ExistFiled)[j]
  212. }
  213. }
  214. }
  215. //for _, data := range *datas {
  216. // name := data["name"].(string)
  217. // ExistFiled = append(ExistFiled, name)
  218. //}
  219. }
  220. func initScopeClass() {
  221. ScopeClassMap, _ = Mgo.Find("code_scopeclass", `{}`, `{"_id": 1}`, `{}`, false, -1, -1)
  222. }
  223. func initTaskType() {
  224. TaskTypeMap, _ = Mgo.Find("code_task", `{}`, `{"_id": 1}`, `{}`, false, -1, -1)
  225. }
  226. func initEs() {
  227. EsIndex, EsType = qu.ObjToString(Sysconfig["elasticsearch_index"]), qu.ObjToString(Sysconfig["elasticsearch_type"])
  228. TotalIndex = qu.ObjToString(Sysconfig["elasticsearch_total_index"])
  229. InterimIndex = qu.ObjToString(Sysconfig["elasticsearch_interim_index"])
  230. // elastic.InitElasticSize(qu.ObjToString(Sysconfig["elasticsearch"]), qu.IntAllDef(qu.Int64All(Sysconfig["elasticPoolSize"]), 30))
  231. es := Sysconfig["es"].(map[string]interface{})
  232. Es = elastic.NewEs(qu.ObjToString(es["version"]), qu.ObjToString(es["addr"]), qu.IntAllDef(es["pool"], 15), qu.ObjToString(es["userName"]), qu.ObjToString(es["password"]))
  233. Index = qu.ObjToString(es["index"])
  234. Itype = qu.ObjToString(es["itype"])
  235. }
  236. func initTagField() {
  237. TagFieldMap, _ = Mgo.Find("code_tagfield", `{}`, `{"_id": 1}`, `{}`, false, -1, -1)
  238. }
  239. // func initBuryClassType() {
  240. // infoType := JyMysql.SelectBySql("SELECT id,name FROM infotype")
  241. // BuryClassType = make(map[string]interface{})
  242. // for _, val := range *infoType {
  243. // k := qu.ObjToString(val["name"])
  244. // BuryClassType[k] = val["id"]
  245. // }
  246. // }
  247. // func initProvince() {
  248. // proArr := JyMysql.SelectBySql("SELECT id,name FROM province")
  249. // ProvinceMap = make(map[string]interface{})
  250. // for _, val := range *proArr {
  251. // k := qu.ObjToString(val["name"])
  252. // ProvinceMap[k] = val["id"]
  253. // }
  254. // }
  255. func initdb() {
  256. //mgo save
  257. save := Sysconfig["save"].(map[string]interface{})
  258. SaveColl = qu.ObjToString(save["coll"])
  259. SaveCollProject = qu.ObjToString(save["coll_project"])
  260. SaveCollbid = qu.ObjToString(save["coll_bid"])
  261. SaveUserMail = qu.ObjToString(save["coll_usermail"])
  262. MgoSave = &mongodb.MongodbSim{
  263. MongodbAddr: qu.ObjToString(save["addr"]),
  264. DbName: qu.ObjToString(save["db"]),
  265. Size: qu.IntAllDef(save["size"], 15),
  266. }
  267. MgoSave.InitPool()
  268. //mgo buyerinfo
  269. buyerinfo := Sysconfig["buyerinfo"].(map[string]interface{})
  270. HospColl = qu.ObjToString(buyerinfo["hospcoll"])
  271. BuyerEntColl = qu.ObjToString(buyerinfo["buyerentcoll"])
  272. MgoBuyer = &mongodb.MongodbSim{
  273. MongodbAddr: qu.ObjToString(buyerinfo["addr"]),
  274. DbName: qu.ObjToString(buyerinfo["db"]),
  275. Size: qu.IntAllDef(buyerinfo["size"], 15),
  276. UserName: qu.ObjToString(buyerinfo["username"]),
  277. Password: qu.ObjToString(buyerinfo["password"]),
  278. ReplSet: qu.ObjToString(buyerinfo["replSet"]),
  279. }
  280. MgoBuyer.InitPool()
  281. //mgo enterprise
  282. enterprise := Sysconfig["enterprise"].(map[string]interface{})
  283. EnpsColl = qu.ObjToString(enterprise["coll"])
  284. MgoEnps = &mongodb.MongodbSim{
  285. MongodbAddr: qu.ObjToString(enterprise["addr"]),
  286. DbName: qu.ObjToString(enterprise["db"]),
  287. Size: qu.IntAllDef(enterprise["size"], 15),
  288. UserName: qu.ObjToString(enterprise["username"]),
  289. Password: qu.ObjToString(enterprise["password"]),
  290. ReplSet: qu.ObjToString(enterprise["replSet"]),
  291. }
  292. MgoEnps.InitPool()
  293. //bidding库
  294. bidding := Sysconfig["bidding_mgo"].(map[string]interface{})
  295. BiddingColl = qu.ObjToString(bidding["coll"])
  296. MgoBidding = &mongodb.MongodbSim{
  297. MongodbAddr: qu.ObjToString(bidding["addr"]),
  298. DbName: qu.ObjToString(bidding["db"]),
  299. Size: qu.IntAll(bidding["size"]),
  300. UserName: qu.ObjToString(bidding["username"]),
  301. Password: qu.ObjToString(bidding["password"]),
  302. ReplSet: qu.ObjToString(bidding["replSet"]),
  303. }
  304. MgoBidding.InitPool()
  305. extract := Sysconfig["extract"].(map[string]interface{})
  306. ExtractColl = qu.ObjToString(extract["coll"])
  307. MgoExtract = &mongodb.MongodbSim{
  308. MongodbAddr: qu.ObjToString(extract["addr"]),
  309. DbName: qu.ObjToString(extract["db"]),
  310. Size: qu.IntAllDef(extract["size"], 15),
  311. }
  312. MgoExtract.InitPool()
  313. //es
  314. // es := Sysconfig["es"].(map[string]interface{})
  315. // Es = &elastic.Elastic{
  316. // S_esurl: qu.ObjToString(es["addr"]),
  317. // I_size: qu.IntAllDef(es["pool"], 15),
  318. // }
  319. // Es.InitElasticSize()
  320. redis.InitRedisBySize(qu.ObjToString(Sysconfig["redis_addrs"]), 100, 30, 300)
  321. // Index = qu.ObjToString(es["index"])
  322. // Itype = qu.ObjToString(es["itype"])
  323. jyMysql := qu.ObjToMap(Sysconfig["jyMysql"])
  324. JyMysql = &mysql.Mysql{
  325. Address: (*jyMysql)["address"].(string),
  326. UserName: (*jyMysql)["username"].(string),
  327. PassWord: (*jyMysql)["password"].(string),
  328. DBName: (*jyMysql)["dbName"].(string),
  329. }
  330. JyMysql.Init()
  331. }
  332. type ByPinyin []string
  333. func (s ByPinyin) Len() int { return len(s) }
  334. func (s ByPinyin) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
  335. func (s ByPinyin) Less(i, j int) bool {
  336. a, _ := UTF82GBK(s[i])
  337. b, _ := UTF82GBK(s[j])
  338. bLen := len(b)
  339. for idx, chr := range a {
  340. if idx > bLen-1 {
  341. return false
  342. }
  343. if chr != b[idx] {
  344. return chr < b[idx]
  345. }
  346. }
  347. return true
  348. }
  349. // UTF82GBK : transform UTF8 rune into GBK byte array
  350. func UTF82GBK(src string) ([]byte, error) {
  351. GB18030 := simplifiedchinese.All[0]
  352. return ioutil.ReadAll(transform.NewReader(bytes.NewReader([]byte(src)), GB18030.NewEncoder()))
  353. }