config.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. package util
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. elastic "app.yhyue.com/moapp/jybase/es"
  5. "app.yhyue.com/moapp/jybase/log"
  6. "app.yhyue.com/moapp/jybase/mongodb"
  7. "app.yhyue.com/moapp/jybase/mysql"
  8. "app.yhyue.com/moapp/jybase/redis"
  9. "bytes"
  10. "fmt"
  11. "github.com/Chain-Zhang/pinyin"
  12. "golang.org/x/text/encoding/simplifiedchinese"
  13. "golang.org/x/text/transform"
  14. "io"
  15. "os"
  16. "sort"
  17. )
  18. var (
  19. Sysconfig map[string]interface{} //配置文件
  20. Mgo *mongodb.MongodbSim
  21. MgoCus *mongodb.MongodbSim //企业服务库
  22. MgoEn *mongodb.MongodbSim
  23. EsIndex, EsType string
  24. EsAllIndex string
  25. InterimIndex string
  26. TotalIndex string
  27. MgoEnC string
  28. Subday float64
  29. PreviewHref string //数据预览地址
  30. CustomerApi string
  31. LatestId = "" //起始id
  32. MgoTag *mongodb.MongodbSim //标签库连接
  33. MgoSave *mongodb.MongodbSim //数据保存库连接
  34. MgoBuyer *mongodb.MongodbSim //医院等级信息
  35. MgoEnps *mongodb.MongodbSim //企业信息
  36. MgoExtract *mongodb.MongodbSim //抽取
  37. MgoBidding *mongodb.MongodbSim //bidding
  38. BiddingColl string
  39. SaveColl string
  40. HospColl string
  41. BuyerEntColl string
  42. EnpsColl string
  43. Es, EsCus elastic.Es //es
  44. Index string
  45. Itype string
  46. IndexCus string
  47. TaskTime int64 //定时任务时间
  48. //历史数据
  49. SId string
  50. EId string
  51. CustomerName string
  52. SaveCollProject string
  53. SaveCollbid string
  54. SaveUserMail string
  55. ExtractColl string
  56. JyMysql *mysql.Mysql
  57. JyPushMysql *mysql.Mysql
  58. JyMysqls *mysql.Mysql
  59. EntMysql *mysql.Mysql
  60. MgoSite *mongodb.MongodbSim
  61. SiteColl string
  62. IsNewSql int
  63. RpcJyServer, RpcProServer string
  64. )
  65. var (
  66. TopTypeArr []string //公告一级分类
  67. SubTypeArr []string //公告二级分类
  68. Province []string //省
  69. ProvinceCitys map[string][]string //省:[市1,市2]
  70. CityDistricts map[string][]string //市:[区1,区2]
  71. BuyerClass []string //采购单位行业
  72. BuyerClassMap map[string][]string //采购单位行业带拼音字母
  73. MatchTypeMap *[]map[string]interface{} //匹配方式
  74. MatchTypeMap2 map[string]interface{} //匹配方式
  75. MatchTypeMap3 *[]map[string]interface{} //匹配方式
  76. ExistFiled *[]map[string]interface{} //存在的字段
  77. ScopeClassMap *[]map[string]interface{} //公告行业
  78. TagFieldMap *[]map[string]interface{} //标签属性值
  79. TaskTypeMap *[]map[string]interface{} //任务类型
  80. BuryClassType map[string]interface{}
  81. ProvinceMap map[string]interface{}
  82. SiteArr []string //网站名称
  83. )
  84. func InitMgoPool() {
  85. Mgo = &mongodb.MongodbSim{
  86. MongodbAddr: common.ObjToString(Sysconfig["mgodb"]),
  87. Size: common.IntAll(Sysconfig["dbsize"]),
  88. DbName: common.ObjToString(Sysconfig["dbname"]),
  89. }
  90. Mgo.InitPool()
  91. customer := Sysconfig["customer"].(map[string]interface{})
  92. CustomerApi = common.ObjToString(customer["api"])
  93. MgoCus = &mongodb.MongodbSim{
  94. MongodbAddr: common.ObjToString(customer["mgodb"]),
  95. Size: common.IntAll(customer["dbsize"]),
  96. DbName: common.ObjToString(customer["dbname"]),
  97. }
  98. MgoCus.InitPool()
  99. }
  100. func initMgoEn() {
  101. MgoEn = &mongodb.MongodbSim{
  102. MongodbAddr: common.ObjToString(Sysconfig["mgodben"]),
  103. Size: common.IntAll(Sysconfig["dbsize"]),
  104. DbName: common.ObjToString(Sysconfig["dbnameen"]),
  105. }
  106. MgoEnC = common.ObjToString(Sysconfig["mongoenc"])
  107. MgoEn.InitPool()
  108. }
  109. func InitOther() {
  110. initCitys()
  111. initInfoType()
  112. initBuyerClass()
  113. initMatchType()
  114. initExitField()
  115. initScopeClass()
  116. initTaskType()
  117. initEs()
  118. InitLog()
  119. // initMgoEn()
  120. Subday = common.Float64All(Sysconfig["subday"])
  121. PreviewHref = common.ObjToString(Sysconfig["preview_href"])
  122. initTagField()
  123. initdb()
  124. initBuryClassType()
  125. initProvince()
  126. initSite()
  127. IsNewSql = common.IntAll(Sysconfig["isNewSql"])
  128. RpcJyServer = common.ObjToString(Sysconfig["rpcServer_jy"])
  129. RpcProServer = common.ObjToString(Sysconfig["rpcServer_project"])
  130. }
  131. func initCitys() {
  132. //map初始化
  133. if ProvinceCitys == nil {
  134. ProvinceCitys = make(map[string][]string)
  135. }
  136. if CityDistricts == nil {
  137. CityDistricts = make(map[string][]string)
  138. }
  139. datas, _ := Mgo.Find("code_city", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  140. for k, data := range *datas {
  141. brief := data["brief"].(string)
  142. if k != 0 {
  143. Province = append(Province, brief)
  144. }
  145. if data["citys"] != nil {
  146. citys := data["citys"].([]interface{})
  147. citytmp := []string{}
  148. for _, city := range citys {
  149. cityMap := city.(map[string]interface{})
  150. for cname, districts := range cityMap {
  151. citytmp = append(citytmp, cname)
  152. tmp := districts.([]interface{})
  153. districtarr := common.ObjArrToStringArr(tmp)
  154. CityDistricts[cname] = districtarr
  155. }
  156. }
  157. ProvinceCitys[brief] = citytmp
  158. }
  159. }
  160. Province = append(Province, common.ObjToString((*datas)[0]["brief"]))
  161. }
  162. func initSite() {
  163. if SiteArr == nil {
  164. SiteArr = []string{}
  165. }
  166. datas, _ := MgoSite.Find("site", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  167. for _, data := range *datas {
  168. name := data["site"].(string)
  169. SiteArr = append(SiteArr, name)
  170. }
  171. //log.Println("网站名称", SiteArr)
  172. }
  173. func initInfoType() {
  174. datas, _ := Mgo.Find("code_infotype", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  175. for _, data := range *datas {
  176. name := data["name"].(string)
  177. TopTypeArr = append(TopTypeArr, name)
  178. child := common.ObjArrToStringArr(data["child"].([]interface{}))
  179. SubTypeArr = append(SubTypeArr, child...)
  180. }
  181. //common.Debug(InfoTypeArr, InfoTypeMap)
  182. }
  183. func initBuyerClass() {
  184. if BuyerClassMap == nil {
  185. BuyerClassMap = make(map[string][]string)
  186. }
  187. datas, _ := Mgo.Find("code_buyerclass", `{}`, `{"name":1}`, `{}`, false, -1, -1)
  188. for _, data := range *datas {
  189. name := data["name"].(string)
  190. BuyerClass = append(BuyerClass, name)
  191. }
  192. sort.Sort(ByPinyin(BuyerClass))
  193. for _, name := range BuyerClass {
  194. str, _ := pinyin.New(name).Mode(pinyin.InitialsInCapitals).Convert()
  195. //fmt.Println(str, err)
  196. zimu := str[0:1]
  197. BuyerClassMap[zimu] = append(BuyerClassMap[zimu], name)
  198. }
  199. }
  200. func initMatchType() {
  201. //map初始化
  202. if MatchTypeMap2 == nil {
  203. MatchTypeMap2 = make(map[string]interface{})
  204. }
  205. MatchTypeMap, _ = Mgo.Find("code_matchtype", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  206. MatchTypeMap3, _ = Mgo.Find("code_matchtype", `{"type": 1}`, nil, nil, false, -1, -1)
  207. for _, d := range *MatchTypeMap {
  208. code := common.ObjToString(d["code"])
  209. name := common.ObjToString(d["name"])
  210. MatchTypeMap2[code] = name
  211. }
  212. }
  213. func initExitField() {
  214. ExistFiled, _ = Mgo.Find("code_field", `{}`, `{"_id":1}`, `{}`, false, -1, -1)
  215. for _, data := range *ExistFiled {
  216. str, _ := pinyin.New(data["name"].(string)).Mode(pinyin.InitialsInCapitals).Convert()
  217. //fmt.Println(str, err)
  218. //zimu := str[0:1]
  219. data["zimu"] = str
  220. }
  221. for i := 0; i < len(*ExistFiled); i++ {
  222. for j := 0; j < len(*ExistFiled)-i-1; j++ {
  223. if (*ExistFiled)[j]["zimu"].(string) > (*ExistFiled)[j+1]["zimu"].(string) {
  224. (*ExistFiled)[j], (*ExistFiled)[j+1] = (*ExistFiled)[j+1], (*ExistFiled)[j]
  225. }
  226. }
  227. }
  228. //for _, data := range *datas {
  229. // name := data["name"].(string)
  230. // ExistFiled = append(ExistFiled, name)
  231. //}
  232. }
  233. func initScopeClass() {
  234. ScopeClassMap, _ = Mgo.Find("code_scopeclass", `{}`, `{"_id": 1}`, `{}`, false, -1, -1)
  235. }
  236. func initTaskType() {
  237. TaskTypeMap, _ = Mgo.Find("code_task", `{}`, `{"_id": 1}`, `{}`, false, -1, -1)
  238. }
  239. func initEs() {
  240. EsIndex, EsType = common.ObjToString(Sysconfig["elasticsearch_index"]), common.ObjToString(Sysconfig["elasticsearch_type"])
  241. EsAllIndex = common.ObjToString(Sysconfig["elasticsearch_all_index"])
  242. TotalIndex = common.ObjToString(Sysconfig["elasticsearch_total_index"])
  243. InterimIndex = common.ObjToString(Sysconfig["elasticsearch_interim_index"])
  244. // elastic.InitElasticSize(common.ObjToString(Sysconfig["elasticsearch"]), common.IntAllDef(common.Int64All(Sysconfig["elasticPoolSize"]), 30))
  245. es := Sysconfig["es"].(map[string]interface{})
  246. Es = elastic.NewEs(common.ObjToString(es["version"]), common.ObjToString(es["addr"]), common.IntAllDef(es["pool"], 15), common.ObjToString(es["userName"]), common.ObjToString(es["password"]))
  247. Index = common.ObjToString(es["index"])
  248. Itype = common.ObjToString(es["itype"])
  249. esCm := Sysconfig["es_customer"].(map[string]interface{})
  250. EsCus = elastic.NewEs(common.ObjToString(esCm["version"]), common.ObjToString(esCm["addr"]), common.IntAllDef(esCm["pool"], 15), common.ObjToString(esCm["userName"]), common.ObjToString(esCm["password"]))
  251. IndexCus = common.ObjToString(esCm["index"])
  252. }
  253. func initTagField() {
  254. TagFieldMap, _ = Mgo.Find("code_tagfield", `{}`, `{"_id": 1}`, `{}`, false, -1, -1)
  255. }
  256. func initBuryClassType() {
  257. infoType := JyMysql.SelectBySql("SELECT id,name FROM infotype")
  258. BuryClassType = make(map[string]interface{})
  259. for _, val := range *infoType {
  260. k := common.ObjToString(val["name"])
  261. BuryClassType[k] = val["id"]
  262. }
  263. }
  264. func initProvince() {
  265. proArr := JyMysql.SelectBySql("SELECT id,name FROM province")
  266. ProvinceMap = make(map[string]interface{})
  267. for _, val := range *proArr {
  268. k := common.ObjToString(val["name"])
  269. ProvinceMap[k] = val["id"]
  270. }
  271. }
  272. func initdb() {
  273. //mgo save
  274. save := Sysconfig["save"].(map[string]interface{})
  275. SaveColl = common.ObjToString(save["coll"])
  276. SaveCollProject = common.ObjToString(save["coll_project"])
  277. SaveCollbid = common.ObjToString(save["coll_bid"])
  278. SaveUserMail = common.ObjToString(save["coll_usermail"])
  279. MgoSave = &mongodb.MongodbSim{
  280. MongodbAddr: common.ObjToString(save["addr"]),
  281. DbName: common.ObjToString(save["db"]),
  282. Size: common.IntAllDef(save["size"], 15),
  283. }
  284. MgoSave.InitPool()
  285. //mgo buyerinfo
  286. buyerinfo := Sysconfig["buyerinfo"].(map[string]interface{})
  287. HospColl = common.ObjToString(buyerinfo["hospcoll"])
  288. BuyerEntColl = common.ObjToString(buyerinfo["buyerentcoll"])
  289. MgoBuyer = &mongodb.MongodbSim{
  290. MongodbAddr: common.ObjToString(buyerinfo["addr"]),
  291. DbName: common.ObjToString(buyerinfo["db"]),
  292. Size: common.IntAllDef(buyerinfo["size"], 15),
  293. UserName: common.ObjToString(buyerinfo["username"]),
  294. Password: common.ObjToString(buyerinfo["password"]),
  295. ReplSet: common.ObjToString(buyerinfo["replSet"]),
  296. }
  297. MgoBuyer.InitPool()
  298. //mgo enterprise
  299. enterprise := Sysconfig["enterprise"].(map[string]interface{})
  300. EnpsColl = common.ObjToString(enterprise["coll"])
  301. MgoEnps = &mongodb.MongodbSim{
  302. MongodbAddr: common.ObjToString(enterprise["addr"]),
  303. DbName: common.ObjToString(enterprise["db"]),
  304. Size: common.IntAllDef(enterprise["size"], 15),
  305. UserName: common.ObjToString(buyerinfo["username"]),
  306. Password: common.ObjToString(buyerinfo["password"]),
  307. ReplSet: common.ObjToString(buyerinfo["replSet"]),
  308. }
  309. MgoEnps.InitPool()
  310. extract := Sysconfig["extract"].(map[string]interface{})
  311. ExtractColl = common.ObjToString(extract["coll"])
  312. MgoExtract = &mongodb.MongodbSim{
  313. MongodbAddr: common.ObjToString(extract["addr"]),
  314. DbName: common.ObjToString(extract["db"]),
  315. Size: common.IntAllDef(extract["size"], 15),
  316. }
  317. MgoExtract.InitPool()
  318. //bidding库
  319. bidding := Sysconfig["bidding_mgo"].(map[string]interface{})
  320. BiddingColl = common.ObjToString(bidding["coll"])
  321. MgoBidding = &mongodb.MongodbSim{
  322. MongodbAddr: common.ObjToString(bidding["addr"]),
  323. DbName: common.ObjToString(bidding["db"]),
  324. Size: common.IntAll(bidding["size"]),
  325. UserName: common.ObjToString(bidding["username"]),
  326. Password: common.ObjToString(bidding["password"]),
  327. ReplSet: common.ObjToString(bidding["replSet"]),
  328. }
  329. MgoBidding.InitPool()
  330. site := Sysconfig["site_mgo"].(map[string]interface{})
  331. SiteColl = common.ObjToString(site["coll"])
  332. MgoSite = &mongodb.MongodbSim{
  333. MongodbAddr: common.ObjToString(site["addr"]),
  334. Size: common.IntAll(site["size"]),
  335. DbName: common.ObjToString(site["db"]),
  336. }
  337. MgoSite.InitPool()
  338. //es
  339. // Es = &elastic.Elastic{
  340. // S_esurl: common.ObjToString(es["addr"]),
  341. // I_size: common.IntAllDef(es["pool"], 15),
  342. // }
  343. redis.InitRedis(common.ObjToString(Sysconfig["redis_addrs"]))
  344. jyMysql := common.ObjToMap(Sysconfig["jyPushMysql"])
  345. JyMysql = &mysql.Mysql{
  346. Address: (*jyMysql)["address"].(string),
  347. UserName: (*jyMysql)["username"].(string),
  348. PassWord: (*jyMysql)["password"].(string),
  349. DBName: (*jyMysql)["dbName"].(string),
  350. }
  351. JyMysql.Init()
  352. jyPushMysql := common.ObjToMap(Sysconfig["pushMysql"])
  353. JyPushMysql = &mysql.Mysql{
  354. Address: (*jyPushMysql)["address"].(string),
  355. UserName: (*jyPushMysql)["username"].(string),
  356. PassWord: (*jyPushMysql)["password"].(string),
  357. DBName: (*jyPushMysql)["dbName"].(string),
  358. }
  359. JyPushMysql.Init()
  360. jyMysqls := common.ObjToMap(Sysconfig["jyMysql"])
  361. JyMysqls = &mysql.Mysql{
  362. Address: (*jyMysqls)["address"].(string),
  363. UserName: (*jyMysqls)["username"].(string),
  364. PassWord: (*jyMysqls)["password"].(string),
  365. DBName: (*jyMysqls)["dbName"].(string),
  366. }
  367. JyMysqls.Init()
  368. entMysql := common.ObjToMap(Sysconfig["entMysql"])
  369. EntMysql = &mysql.Mysql{
  370. Address: (*entMysql)["address"].(string),
  371. UserName: (*entMysql)["username"].(string),
  372. PassWord: (*entMysql)["password"].(string),
  373. DBName: (*entMysql)["dbName"].(string),
  374. }
  375. EntMysql.Init()
  376. }
  377. func InitLog() {
  378. err := log.InitLog(
  379. log.Path(common.ObjToString(Sysconfig["logpath"])),
  380. log.Level("debug"),
  381. log.Compress(true),
  382. log.MaxSize(10), // M
  383. log.MaxBackups(10),
  384. log.MaxAge(7),
  385. log.Format("text"), // text or json output
  386. )
  387. if err != nil {
  388. fmt.Printf("InitLog failed: %v\n", err)
  389. os.Exit(1)
  390. }
  391. }
  392. type ByPinyin []string
  393. func (s ByPinyin) Len() int { return len(s) }
  394. func (s ByPinyin) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
  395. func (s ByPinyin) Less(i, j int) bool {
  396. a, _ := UTF82GBK(s[i])
  397. b, _ := UTF82GBK(s[j])
  398. bLen := len(b)
  399. for idx, chr := range a {
  400. if idx > bLen-1 {
  401. return false
  402. }
  403. if chr != b[idx] {
  404. return chr < b[idx]
  405. }
  406. }
  407. return true
  408. }
  409. // UTF82GBK : transform UTF8 rune into GBK byte array
  410. func UTF82GBK(src string) ([]byte, error) {
  411. GB18030 := simplifiedchinese.All[0]
  412. return io.ReadAll(transform.NewReader(bytes.NewReader([]byte(src)), GB18030.NewEncoder()))
  413. }
  414. // 字段与释义对应关系
  415. var FieldMap = map[string]interface{}{
  416. "title": "公告标题",
  417. "content": "公告内容",
  418. "href": "公告地址",
  419. "jybxhref": "剑鱼标讯地址",
  420. "detail": "公告正文",
  421. "area": "省份",
  422. "city": "城市",
  423. "publishtime": "发布时间",
  424. "projectname": "项目名称",
  425. "projectcode": "项目编号",
  426. "buyer": "采购单位",
  427. "buyerperson": "采购单位联系人",
  428. "buyertel": "采购单位联系电话",
  429. "budget": "预算(元)",
  430. "bidopentime": "开标日期",
  431. "s_winner": "中标单位",
  432. "bidamount": "中标金额(元)",
  433. "agency": "招标代理机构",
  434. "projectscope": "项目范围",
  435. "currency": "币种",
  436. "subtype": "公告类别",
  437. "toptype": "公告类别一级",
  438. "industry": "行业",
  439. "matchkey": "信息匹配词",
  440. "matchtype": "匹配字段",
  441. "priority": "信息重要程度",
  442. "department": "部门名称",
  443. "excludetype": "排除类型",
  444. "winner_organcode": "中标单位征信代码",
  445. "subscopeclass": "信息二级分类",
  446. "bid2017": "2017年中标数",
  447. "bid2018": "2018年中标数",
  448. "bid2019": "2019年中标数",
  449. "bid2020": "2020年中标数",
  450. "winner_credit_no": "中标单位统一社会信用代码",
  451. "buyer_credit_no": "采购单位统一社会信用代码",
  452. "stock_name": "股东名单",
  453. "business_scope": "经营范围",
  454. "establish_date": "注册时间",
  455. "capital": "注册资金",
  456. "winneraddr": "中标单位地址",
  457. "purchasing": "中标产品信息",
  458. "rank": "医院等级",
  459. "winnertel": "中标单位联系电话",
  460. "winnerperson": "中标单位联系人",
  461. "district": "区县",
  462. "legal_person": "中标企业联系人",
  463. "company_phone": "中标企业联系电话",
  464. "company_email": "中标企业联系邮箱",
  465. "company_address": "中标企业注册地址",
  466. "tagname": "标签",
  467. "filetext": "附件内容",
  468. "buyerclass": "采购单位类型",
  469. "rulename": "规则名称",
  470. "departname": "部门名称",
  471. "projectId": "项目标识",
  472. "item": "分类",
  473. "winner_type": "中标人模型",
  474. "buyer_type": "行业归属",
  475. "purchasinglist": "产品信息",
  476. "ruleid": "规则标识",
  477. "filehref": "附件链接",
  478. "winner_style": "中标类型",
  479. "agency_fee": "中标服务费",
  480. "bidway": "投标方式",
  481. "docamount": "招标文件购买金额",
  482. "bidtype": "采购方式",
  483. "bidendtime": "投标截止日期",
  484. "yewu_type": "业务类型",
  485. "agencyrate": "招标代理费率",
  486. "s_subscopeclass": "公告行业二级",
  487. "s_topscopeclass": "公告行业一级",
  488. "createtime": "创建时间",
  489. "buyeraddr": "采购单位地址",
  490. "agencyperson": "招标代理机构联系人",
  491. "agencytel": "招标代理机构联系方式",
  492. "agencyaddr": "招标代理机构地址",
  493. "company_area": "中标单位省份",
  494. "company_city": "中标单位城市",
  495. "company_district": "中标单位区县",
  496. "agency_credit_no": "招标代理机构统一社会信用代码",
  497. "contact": "中标单位历史联系信息",
  498. "id": "唯一标识",
  499. }