config.go 11 KB

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