medical_bidding.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package main
  2. import (
  3. "fmt"
  4. log "github.com/donnie4w/go-logger/logger"
  5. "go.mongodb.org/mongo-driver/bson/primitive"
  6. qu "qfw/util"
  7. "strings"
  8. "time"
  9. "unicode/utf8"
  10. )
  11. var proNameDict = map[string]string{}
  12. //生成两个 mysql 表
  13. func saveBiddingPurMysql() {
  14. log.Debug("分析数据-保存两个mysql表...")
  15. sess := save_mgo.GetMgoConn()
  16. defer save_mgo.DestoryMongoConn(sess)
  17. q, total, isok := map[string]interface{}{}, 0, 0
  18. it := sess.DB(save_mgo.DbName).C(o_bidding_coll).Find(&q).Iter()
  19. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  20. if total%1000 == 0 {
  21. log.Debug("curent index ", total, isok)
  22. }
  23. tmpid := BsonTOStringId(tmp["_id"])
  24. repeat := qu.IntAll(tmp["repeat"])
  25. subtype := qu.ObjToString(tmp["subtype"])
  26. if repeat != 1 {
  27. if subtype == "单一" || subtype == "中标" || subtype == "成交" || subtype == "合同" {
  28. isok++
  29. dealWithBidData(tmp, tmpid)
  30. dealWithPurData(tmp, tmpid)
  31. }
  32. }
  33. tmp = make(map[string]interface{})
  34. }
  35. log.Debug("is over ", total, isok)
  36. }
  37. //构建-招投标数据-无异常
  38. func dealWithBidData(tmp map[string]interface{}, tmpid string) {
  39. data := map[string]interface{}{}
  40. data["info_id"] = tmp["info_id"]
  41. data["projectname"] = tmp["projectname"]
  42. publishtime := qu.Int64All(tmp["publishtime"])
  43. new_publishtime := "" //转日期
  44. if publishtime > 0 {
  45. new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
  46. data["publishtime"] = new_publishtime
  47. }
  48. data["buyer_name"] = qu.ObjToString(tmp["buyer"])
  49. data["buyer_depart"] = ""
  50. if tmp["budget"] != nil && qu.Float64All(tmp["budget"]) < 1000000000.0 {
  51. data["budget"] = qu.Float64All(tmp["budget"])
  52. }
  53. if tmp["bidamount"] != nil && qu.Float64All(tmp["bidamount"]) < 1000000000.0 {
  54. data["bidamount"] = qu.Float64All(tmp["bidamount"])
  55. }
  56. data["agency_name"] = qu.ObjToString(tmp["agency"])
  57. data["winner_name"] = qu.ObjToString(tmp["s_winner"])
  58. data["jy_href"] = qu.ObjToString(tmp["jyhref"])
  59. updatetime := time.Unix(time.Now().Unix(), 0).Format(timeLayout)
  60. data["updatetime"] = updatetime
  61. // info_type buyer_classcode area_code industry_code
  62. info_type_key := qu.ObjToString(tmp["toptype"]) + "_" + qu.ObjToString(tmp["subtype"])
  63. data["info_type"] = bidclass_dict[info_type_key]
  64. buyerclass := qu.ObjToString(tmp["buyerclass"])
  65. data["buyer_classcode"] = buyerclass_dict[buyerclass]
  66. area_key := qu.ObjToString(tmp["area"]) + "_" + qu.ObjToString(tmp["city"]) + "_" + qu.ObjToString(tmp["district"])
  67. data["area_code"] = area_dict[area_key]
  68. subscopeclass := []string{}
  69. if res, ok := tmp["subscopeclass"].(primitive.A); ok {
  70. subscopeclass = qu.ObjArrToStringArr(res)
  71. } else {
  72. if res, ok := tmp["subscopeclass"].([]interface{}); ok {
  73. subscopeclass = qu.ObjArrToStringArr(res)
  74. }
  75. }
  76. industry_code, industry_code_other := "", ""
  77. for _, v := range subscopeclass {
  78. if strings.Contains(v, "医疗卫生") {
  79. industry_code = industry_dict[v]
  80. } else {
  81. if industry_code_other != "" {
  82. industry_code_other = industry_code_other + "," + industry_dict[v]
  83. } else {
  84. industry_code_other = industry_dict[v]
  85. }
  86. }
  87. }
  88. data["industry_code"] = industry_code
  89. data["industry_code_other"] = industry_code_other
  90. insertMysqlData("f_bidding", data, tmpid)
  91. }
  92. //构建-标的物信息-关联企业信息
  93. func dealWithPurData(tmp map[string]interface{}, tmpid string) {
  94. p_list := []map[string]interface{}{}
  95. if yl_purchasinglist, ok := tmp["yl_purchasinglist"].(primitive.A); ok {
  96. p_list = qu.ObjArrToMapArr(yl_purchasinglist)
  97. } else {
  98. if yl_purchasinglist, ok := tmp["yl_purchasinglist"].([]interface{}); ok {
  99. p_list = qu.ObjArrToMapArr(yl_purchasinglist)
  100. }
  101. }
  102. info_id := qu.ObjToString(tmp["info_id"])
  103. s_winner := qu.ObjToString(tmp["s_winner"])
  104. for _, v := range p_list {
  105. data := map[string]interface{}{}
  106. product_name := qu.ObjToString(v["product_name"])
  107. brandname := qu.ObjToString(v["brandname"])
  108. data["info_id"] = info_id
  109. data["bid_name"] = qu.ObjToString(v["itemname"])
  110. data["product_name"] = product_name
  111. data["product_brand"] = brandname
  112. data["product_specs"] = ""
  113. product_model := qu.ObjToString(v["model"])
  114. if utf8.RuneCountInString(product_model) > 100 {
  115. product_model = ""
  116. }
  117. data["product_model"] = product_model
  118. if v["unitprice"] != nil {
  119. data["product_price"] = qu.Float64All(v["unitprice"])
  120. }
  121. if v["number"] != nil {
  122. data["product_num"] = qu.Float64All(v["number"])
  123. }
  124. if v["totalprice"] != nil {
  125. data["product_totalprice"] = qu.Float64All(v["totalprice"])
  126. }
  127. if v["unitname"] != nil {
  128. data["product_unit"] = qu.ObjToString(v["unitname"])
  129. }
  130. //涉及-bid_company_name bid_company_id bid_company_ysname -关联f_company
  131. if s_winner != "" {
  132. if strings.Contains(s_winner, ",") {
  133. data["bid_company_id"] = ""
  134. data["bid_company_name"] = ""
  135. data["bid_company_ysname"] = s_winner
  136. } else { //查询f_company...
  137. query := map[string]interface{}{"company_name": s_winner}
  138. find_data := MysqlTool.FindOne("f_company", query, "company_id", "")
  139. if find_data == nil {
  140. data["bid_company_id"] = ""
  141. data["bid_company_name"] = s_winner
  142. data["bid_company_ysname"] = ""
  143. } else {
  144. data["bid_company_id"] = qu.ObjToString((*find_data)["company_id"])
  145. data["bid_company_name"] = s_winner
  146. data["bid_company_ysname"] = ""
  147. }
  148. }
  149. } else {
  150. data["bid_company_id"] = ""
  151. data["bid_company_name"] = ""
  152. data["bid_company_ysname"] = ""
  153. }
  154. //涉及-make_company_id make_company_name make_company_ysname -关联f_product
  155. query := "SELECT company_id,company_name FROM f_product WHERE product_name = ? and (business_type = ? or business_type = ?)"
  156. proinfo := MysqlTool.SelectBySql(query, product_name, "1", "3")
  157. if len(*proinfo) == 1 { //查询到多条-同产品信息
  158. info := (*proinfo)[0]
  159. data["make_company_id"] = qu.ObjToString(info["company_id"])
  160. data["make_company_name"] = qu.ObjToString(info["company_name"])
  161. data["make_company_ysname"] = ""
  162. } else if len(*proinfo) > 1 { //如果有多个企业-生产信息
  163. isUse, c_name, c_id := matchedManufacturer(brandname, *proinfo)
  164. if isUse {
  165. data["make_company_id"] = c_id
  166. data["make_company_name"] = c_name
  167. data["make_company_ysname"] = ""
  168. } else {
  169. data["make_company_id"] = ""
  170. data["make_company_name"] = ""
  171. data["make_company_ysname"] = c_name
  172. }
  173. } else {
  174. data["make_company_id"] = ""
  175. data["make_company_name"] = ""
  176. data["make_company_ysname"] = ""
  177. }
  178. //product_code分类
  179. product_class_1 := qu.ObjToString(v["product_class_1"])
  180. product_class_2 := qu.ObjToString(v["product_class_2"])
  181. product_class_3 := qu.ObjToString(v["product_class_3"])
  182. key_4 := "四级_" + product_name
  183. if proclass_name_dict[key_4] != "" {
  184. data["product_code"] = proclass_name_dict[key_4]
  185. } else {
  186. pro_key := fmt.Sprintf("%s_%s_%s", product_class_1, product_class_2, product_class_3)
  187. data["product_code"] = proclass_name_dict[pro_key]
  188. }
  189. insertMysqlData("f_bidproduct", data, tmpid)
  190. }
  191. }
  192. //根据品牌字段匹配-有效生产企业-过多10条
  193. func matchedManufacturer(brandName string, infoArr []map[string]interface{}) (bool, string, string) {
  194. c_name := ""
  195. namedict := map[string]string{}
  196. for i := 0; i < len(infoArr); i++ {
  197. info := infoArr[i]
  198. company_name := qu.ObjToString(info["company_name"])
  199. company_id := qu.ObjToString(info["company_id"])
  200. if brandName != "" { //品牌匹配
  201. if strings.
  202. Contains(company_name, brandName) {
  203. return true, company_name, company_id
  204. }
  205. }
  206. if len(namedict) < 10 {
  207. if c_name == "" {
  208. c_name = company_name
  209. namedict[company_name] = company_id
  210. } else {
  211. if namedict[company_name] == "" {
  212. c_name += "," + company_name
  213. namedict[company_name] = company_id
  214. }
  215. }
  216. }
  217. }
  218. if len(namedict) == 1 {
  219. return true, c_name, namedict[c_name]
  220. }
  221. return false, c_name, ""
  222. }
  223. //准备工作-导出源数据很重要... 163
  224. func exportUsefulPurBidData() {
  225. sess := qy_mgo.GetMgoConn()
  226. defer qy_mgo.DestoryMongoConn(sess)
  227. //构建标准产品数据
  228. dataArr, _ := save_mgo.Find("zktest_mairui", nil, nil, nil)
  229. for _, v := range dataArr {
  230. name := qu.ObjToString(v["name"])
  231. proNameDict[name] = name
  232. }
  233. log.Debug("迈瑞产品...", len(proNameDict))
  234. q, total := map[string]interface{}{
  235. "publishtime": map[string]interface{}{
  236. "$gte": 1546272000,
  237. },
  238. }, 0
  239. isok := 0
  240. it := sess.DB("qfw").C(s_bidding_coll).Find(&q).Sort("_id").Iter()
  241. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  242. if total%10000 == 0 {
  243. log.Debug("curent index ", total, tmp["_id"], "~", isok)
  244. }
  245. p_list := []map[string]interface{}{}
  246. new_data := map[string]interface{}{}
  247. if yl_purchasinglist, ok := tmp["yl_purchasinglist"].(primitive.A); ok {
  248. p_list = qu.ObjArrToMapArr(yl_purchasinglist)
  249. } else {
  250. if yl_purchasinglist, ok := tmp["yl_purchasinglist"].([]interface{}); ok {
  251. p_list = qu.ObjArrToMapArr(yl_purchasinglist)
  252. }
  253. }
  254. //临时-匹配是不是含有-有效迈瑞-产品
  255. if len(p_list) > 0 {
  256. new_p_list := matchUsefulMrBidProduct(p_list)
  257. if len(new_p_list) > 0 {
  258. isok++
  259. s_winner := qu.ObjToString(tmp["s_winner"])
  260. new_data["yl_purchasinglist"] = p_list
  261. tmpid := BsonTOStringId(tmp["_id"])
  262. new_data["info_id"] = tmpid
  263. new_data["_id"] = tmp["_id"]
  264. new_data["subtype"] = qu.ObjToString(tmp["subtype"])
  265. new_data["toptype"] = qu.ObjToString(tmp["toptype"])
  266. new_data["projectname"] = qu.ObjToString(tmp["projectname"])
  267. new_data["publishtime"] = qu.IntAll(tmp["publishtime"])
  268. new_data["buyer"] = qu.ObjToString(tmp["buyer"])
  269. new_data["buyerclass"] = qu.ObjToString(tmp["buyerclass"])
  270. if tmp["budget"] != nil {
  271. new_data["budget"] = tmp["budget"]
  272. }
  273. if tmp["bidamount"] != nil {
  274. new_data["bidamount"] = tmp["bidamount"]
  275. }
  276. new_data["s_winner"] = s_winner
  277. new_data["agency"] = qu.ObjToString(tmp["agency"])
  278. new_data["area"] = qu.ObjToString(tmp["area"])
  279. new_data["city"] = qu.ObjToString(tmp["city"])
  280. new_data["district"] = qu.ObjToString(tmp["district"])
  281. new_data["jyhref"] = fmt.Sprintf(Url, qu.CommonEncodeArticle("content", tmpid))
  282. if tmp["subscopeclass"] != nil {
  283. new_data["subscopeclass"] = tmp["subscopeclass"]
  284. }
  285. save_mgo.Save(o_bidding_coll, new_data)
  286. save_mgo.Save("zktest_mysql_bidding_repeat", tmp) //业务判重需要-
  287. }
  288. }
  289. tmp = make(map[string]interface{})
  290. }
  291. log.Debug("is bidding over ", total, isok)
  292. }
  293. func matchUsefulMrBidProduct(p_list []map[string]interface{}) (new_p_list []map[string]interface{}) {
  294. for _, v := range p_list {
  295. product_name := qu.ObjToString(v["product_name"])
  296. if proNameDict[product_name] != "" {
  297. new_p_list = append(new_p_list, v)
  298. }
  299. }
  300. return new_p_list
  301. }
  302. //根据目标数据,去掉重复 - 重新导出数据
  303. func exportNewPurBidData() {
  304. sess := save_mgo.GetMgoConn()
  305. defer save_mgo.DestoryMongoConn(sess)
  306. q, total := map[string]interface{}{}, 0
  307. isok := 0
  308. it := sess.DB(save_mgo.DbName).C("zktest_mysql_bidding_repeat").Find(&q).Sort("_id").Select(map[string]interface{}{
  309. "repeat": 1,
  310. }).Iter()
  311. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  312. if total%1000 == 0 {
  313. log.Debug("curent index ", total, tmp["_id"], "~", isok)
  314. }
  315. tmpid := BsonTOStringId(tmp["_id"])
  316. repeat := tmp["repeat"].(bool)
  317. if repeat {
  318. isok++
  319. save_mgo.UpdateById(o_bidding_coll, tmpid, map[string]interface{}{
  320. "$set": map[string]interface{}{
  321. "repeat": 1,
  322. },
  323. })
  324. }
  325. tmp = make(map[string]interface{})
  326. }
  327. log.Debug("is over ", total, isok)
  328. }
  329. //导出指定-迈瑞相关数据-已弃用
  330. func exportMaiRuiInfoId() {
  331. query := "SELECT product_name FROM f_product WHERE company_name LIKE CONCAT('%',?,'%')"
  332. proinfo := MysqlTool.SelectBySql(query, "迈瑞")
  333. log.Debug(len(*proinfo))
  334. proNameArr := []string{}
  335. proNameDict := map[string]string{}
  336. for _, v := range *proinfo {
  337. product_name := qu.ObjToString(v["product_name"])
  338. if proNameDict[product_name] == "" {
  339. proNameDict[product_name] = product_name
  340. proNameArr = append(proNameArr, product_name)
  341. }
  342. }
  343. //812个产品名称 - -
  344. bid_infoDict := map[string]string{}
  345. for k, v := range proNameArr {
  346. if k%100 == 0 {
  347. log.Debug("当前:", len(bid_infoDict))
  348. }
  349. q := "SELECT info_id FROM f_bidproduct WHERE product_name=?"
  350. infoArr := MysqlTool.SelectBySql(q, v)
  351. for _, info := range *infoArr {
  352. info_id := qu.ObjToString(info["info_id"])
  353. if bid_infoDict[info_id] == "" {
  354. bid_infoDict[info_id] = info_id
  355. save_mgo.Save("a_mairui", map[string]interface{}{
  356. "info_id": info_id,
  357. })
  358. }
  359. }
  360. }
  361. }