bidding.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package bidding
  2. import (
  3. "data_tidb/config"
  4. u "data_tidb/util"
  5. "fmt"
  6. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  7. "jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
  8. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  9. "reflect"
  10. "regexp"
  11. "sort"
  12. "strings"
  13. "sync"
  14. "time"
  15. )
  16. var (
  17. regLetter = regexp.MustCompile("[a-z]*")
  18. )
  19. func TaskBidding() {
  20. sess := u.MongoB.GetMgoConn()
  21. defer u.MongoB.DestoryMongoConn(sess)
  22. ch := make(chan bool, 10)
  23. wg := &sync.WaitGroup{}
  24. q := map[string]interface{}{
  25. "_id": map[string]interface{}{
  26. "$gt": mongodb.StringTOBsonId("6558df800000000000000000"),
  27. "$lte": mongodb.StringTOBsonId("655a31000000000000000000"),
  28. },
  29. }
  30. query := sess.DB(config.Conf.DB.MongoB.Dbname).C("bidding").Find(q).Sort("_id").Iter()
  31. count := 0
  32. for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
  33. if count%10000 == 0 {
  34. log.Info(fmt.Sprintf("current --- %d", count))
  35. }
  36. ch <- true
  37. wg.Add(1)
  38. go func(tmp map[string]interface{}) {
  39. defer func() {
  40. <-ch
  41. wg.Done()
  42. }()
  43. if util.IntAll(tmp["extracttype"]) != -1 {
  44. taskBase(tmp) //基础标讯数据
  45. taskExpand(tmp) //扩展数据
  46. taskDetail(tmp) //正文信息
  47. taskAtts(tmp) //附件信息
  48. taskIntent(tmp) //采购意向
  49. taskPackage(tmp) //分包
  50. }
  51. }(tmp)
  52. tmp = make(map[string]interface{})
  53. }
  54. wg.Wait()
  55. log.Info(fmt.Sprintf("is over --- %d", count))
  56. }
  57. func taskBase(tmp map[string]interface{}) {
  58. tmpid := mongodb.BsonIdToSId(tmp["_id"])
  59. info := map[string]interface{}{}
  60. info["s_info_id"] = tmpid
  61. area, city, district := util.ObjToString(tmp["area"]), util.ObjToString(tmp["city"]), util.ObjToString(tmp["district"])
  62. if area != "" {
  63. info["s_area_code"] = u.RegionCode[area]
  64. if city != "" {
  65. info["s_city_code"] = u.RegionCode[area+","+city]
  66. if district != "" {
  67. info["s_district_code"] = u.RegionCode[area+","+city+","+district]
  68. }
  69. }
  70. }
  71. if buyerclass := util.ObjToString(tmp["buyerclass"]); buyerclass != "" {
  72. info["s_buyerclass_code"] = u.BuyerClassCode[buyerclass]
  73. }
  74. info["s_toptype_code"], info["s_subtype_code"] = u.GetTopSubCode(util.ObjToString(tmp["toptype"]), util.ObjToString(tmp["subtype"]))
  75. //特别结构
  76. info["i_isValidFile"] = util.IntAll(tmp["isValidFile"])
  77. info["i_multipackage"] = util.IntAll(tmp["multipackage"])
  78. //文本相关
  79. u.TransferTextInfo(tmp, &info, []string{"title", "projectname", "projectcode", "purchasing", "site", "href"}, []int{})
  80. //金额相关
  81. u.TransferMoneyRateInfo(tmp, &info, []string{"budget", "bidamount", "biddiscount"}, []float64{1000000000.0, 1000000000.0, 100.0})
  82. //时间相关
  83. u.TransferDateTimeInfo(tmp, &info, []string{"comeintime", "publishtime", "bidopentime", "bidendtime"})
  84. //主体相关
  85. if code := u.GetNameId(util.ObjToString(tmp["buyer"])); code != "" {
  86. info["s_buyer_id"] = code
  87. }
  88. if code := u.GetNameId(util.ObjToString(tmp["agency"])); code != "" {
  89. info["s_agency_id"] = code
  90. }
  91. info["d_updatetime"] = time.Now().Format(util.Date_Full_Layout)
  92. info["d_createtime"] = time.Now().Format(util.Date_Full_Layout)
  93. u.InsertGlobalMysqlData(u.T_dwd_f_bid_baseinfo, info, mongodb.BsonIdToSId(tmp["_id"]))
  94. }
  95. func taskExpand(tmp map[string]interface{}) {
  96. tmpid := mongodb.BsonIdToSId(tmp["_id"])
  97. info := map[string]interface{}{}
  98. info["s_info_id"] = tmpid
  99. //文本相关
  100. u.TransferTextInfo(tmp, &info, []string{"projectperiod", "project_scale", "project_timeunit", "bidmethod", "getdocmethod", "currency", "funds", "payway", "bid_bond", "contract_bond", "contractcode", "buyerzipcode", "bidopenaddress", "buyeraddr", "agencyaddr", "projectaddr", "enterprise_qualification", "personnel_qualification", "performance_qualification", "enterprise_credit"}, []int{1000, 5000, 50, 255, 500, 20, 5000, 500, 1000, 500, 100, 100, 1000, 1000, 1000, 1000, 20000, 20000, 20000, 20000})
  101. //时间相关
  102. u.TransferDateTimeInfo(tmp, &info, []string{"project_startdate", "project_completedate", "signstarttime", "bidendtime", "bidstarttime", "docstarttime", "docendtime", "signaturedate", "signendtime"})
  103. //布尔相关
  104. u.TransferBoolInfo(tmp, &info, []string{"bid_guarantee", "contract_guarantee"})
  105. //金额相关
  106. u.TransferMoneyRateInfo(tmp, &info, []string{"docamount", "agencyfee", "agencyrate"}, []float64{10000000.0, 10000000.0, 10000000.0})
  107. //投标方式
  108. bidway := util.ObjToString(tmp["bidway"])
  109. if bidway == "电子投标" {
  110. info["i_bidway"] = 1
  111. } else if bidway == "纸质投标" {
  112. info["i_bidway"] = 0
  113. } else {
  114. }
  115. //评审专家
  116. if tmp["review_experts"] != nil {
  117. if reflect.TypeOf(tmp["review_experts"]).String() == "string" {
  118. info["s_review_experts"] = tmp["review_experts"]
  119. } else if reflect.TypeOf(tmp["review_experts"]).String() == "[]interface {}" {
  120. if arr, ok := tmp["review_experts"].([]interface{}); ok {
  121. info["s_review_experts"] = strings.Join(util.ObjArrToStringArr(arr), ",")
  122. }
  123. }
  124. }
  125. //工期时长
  126. if tmp["project_duration"] != nil {
  127. info["i_project_duration"] = util.IntAll(tmp["project_duration"])
  128. }
  129. info["d_updatetime"] = time.Now().Format(util.Date_Full_Layout)
  130. info["d_createtime"] = time.Now().Format(util.Date_Full_Layout)
  131. u.InsertGlobalMysqlData(u.T_dwd_f_bid_expand_baseinfo, info, tmpid)
  132. }
  133. func taskDetail(tmp map[string]interface{}) {
  134. tmpid := mongodb.BsonIdToSId(tmp["_id"])
  135. s_detail := util.ObjToString(tmp["detail"])
  136. s_contenthtml := util.ObjToString(tmp["contenthtml"])
  137. info := map[string]interface{}{
  138. "s_info_id": tmpid,
  139. "s_detail": s_detail,
  140. "s_contenthtml": s_contenthtml,
  141. "d_createtime": time.Now().Format(util.Date_Full_Layout),
  142. "d_updatetime": time.Now().Format(util.Date_Full_Layout),
  143. }
  144. u.InsertGlobalMysqlData(u.T_dwd_f_bid_detail, info, tmpid)
  145. }
  146. func taskAtts(tmp map[string]interface{}) {
  147. tmpid := mongodb.BsonIdToSId(tmp["_id"])
  148. f_baseInfo := map[string]interface{}{}
  149. attach_text := util.ObjToMap(tmp["attach_text"])
  150. if projectinfo := util.ObjToMap(tmp["projectinfo"]); projectinfo != nil {
  151. attachments := util.ObjToMap((*projectinfo)["attachments"])
  152. for index, attr := range *attachments {
  153. if at, ok := attr.(map[string]interface{}); ok {
  154. if util.ObjToString(at["fid"]) != "" {
  155. //ftype := ""
  156. //for _, s := range FileTypeArr {
  157. // ft := strings.ToLower(util.ObjToString(tmp["ftype"]))
  158. // if strings.Contains(ft, s) {
  159. // ftype = s
  160. // break
  161. // }
  162. //}
  163. f_baseInfo["s_info_id"] = tmpid
  164. f_baseInfo["s_file_name"] = util.ObjToString(at["filename"])
  165. f_baseInfo["s_file_url"] = util.ObjToString(at["org_url"])
  166. f_baseInfo["s_file_size"] = util.ObjToString(at["size"])
  167. f_baseInfo["s_file_suffix"] = util.ObjToString(at["ftype"])
  168. f_baseInfo["s_file_oss_url"] = util.ObjToString(at["fid"])
  169. f_baseInfo["d_createtime"] = time.Now().Format(util.Date_Full_Layout)
  170. f_id := u.InsertGlobalMysqlData(u.T_dwd_f_bid_file_baseinfo, f_baseInfo, tmpid)
  171. if f_id > 0 && util.IntAll(index) > 0 && attach_text != nil {
  172. att_key := fmt.Sprintf("%d", util.IntAll(index)-1)
  173. if att_info := util.ObjToMap((*attach_text)[att_key]); att_info != nil {
  174. taskAttsAttach(*att_info, tmpid, f_id)
  175. }
  176. }
  177. }
  178. }
  179. }
  180. }
  181. }
  182. func taskAttsAttach(att_info map[string]interface{}, tmpid string, f_id int64) {
  183. for _, v := range att_info {
  184. if att, b := v.(map[string]interface{}); b {
  185. info := map[string]interface{}{}
  186. info["s_info_id"] = tmpid
  187. info["s_file_id"] = f_id
  188. info["d_createtime"] = time.Now().Format(util.Date_Full_Layout)
  189. attach_url := util.ObjToString(att["attach_url"])
  190. if attach_url != "" {
  191. //bs := OssGetObject(attach_url)
  192. //if utf8.RuneCountInString(bs) > 100000 {
  193. // bs = string(([]rune(bs))[:100000])
  194. //}
  195. //info["s_file_text"] = bs
  196. }
  197. u.InsertGlobalMysqlData(u.T_dwd_f_bid_file_text, info, tmpid)
  198. }
  199. }
  200. }
  201. func taskIntent(tmp map[string]interface{}) {
  202. procurementlist := u.IsMarkInterfaceMap(tmp["procurementlist"])
  203. tmpid := mongodb.BsonIdToSId(tmp["_id"])
  204. for _, p1 := range procurementlist {
  205. info := map[string]interface{}{}
  206. info["s_info_id"] = tmpid
  207. if p1["itemname"] != nil {
  208. info["s_intention_name"] = p1["itemname"]
  209. }
  210. if p1["projectscope"] != nil {
  211. info["s_intention_demand"] = p1["projectscope"]
  212. }
  213. if p1["item"] != nil {
  214. info["s_item"] = p1["item"]
  215. }
  216. if p1["totalprice"] != nil {
  217. info["f_totalprice"] = p1["totalprice"]
  218. }
  219. if p1["expurasingtime"] != nil {
  220. info["s_expurasingtime"] = p1["expurasingtime"]
  221. }
  222. if p1["reserved_amount"] != nil {
  223. info["s_reserved_amount"] = p1["reserved_amount"]
  224. }
  225. if b := util.ObjToString(tmp["buyer"]); b != "" {
  226. if code := u.GetNameId(b); code != "" {
  227. info["s_buyer_id"] = code
  228. }
  229. }
  230. info["d_createtime"] = time.Now().Format(util.Date_Full_Layout)
  231. u.InsertGlobalMysqlData(u.T_dwd_f_bid_intention_baseinfo, info, tmpid)
  232. }
  233. }
  234. func taskPackage(tmp map[string]interface{}) {
  235. tmpid := mongodb.BsonIdToSId(tmp["_id"])
  236. //筛选分包
  237. packages := FilterPackageInfos(tmp)
  238. if len(packages) <= 1 { //单包···标讯本身
  239. baseInfo := CPBaseInfoFromBidding(tmp, tmpid)
  240. pid := u.InsertGlobalMysqlData(u.T_dwd_f_bid_package_baseinfo, baseInfo, tmpid)
  241. if pid > 0 {
  242. //投标人信息
  243. CPBidderBiddingBaseInfo(tmp, tmpid, pid)
  244. //标的物信息
  245. new_purlist := CPBiddingPackageGoodsBaseInfo(tmp, tmpid, pid)
  246. for _, v := range new_purlist {
  247. u.InsertGlobalMysqlData(u.T_dwd_f_bid_package_goods_baseinfo, v, tmpid)
  248. }
  249. }
  250. } else { //多包...具体源信息
  251. for k, v := range packages {
  252. baseInfo := CPBaseInfoFromPackage(v, tmpid)
  253. pid := u.InsertGlobalMysqlData(u.T_dwd_f_bid_package_baseinfo, baseInfo, tmpid)
  254. if pid > 0 { //投标人信息
  255. if k == 0 { //标的物信息
  256. CPBidderPackageBaseInfo(v, tmp, tmpid, pid, true)
  257. new_purlist := CPBiddingPackageGoodsBaseInfo(tmp, tmpid, pid)
  258. for _, v1 := range new_purlist {
  259. u.InsertGlobalMysqlData(u.T_dwd_f_bid_package_goods_baseinfo, v1, tmpid)
  260. }
  261. } else {
  262. CPBidderPackageBaseInfo(v, tmp, tmpid, pid, false)
  263. }
  264. }
  265. }
  266. }
  267. }
  268. func BinarySearch(s []string, k string) int {
  269. sort.Strings(s)
  270. lo, hi := 0, len(s)-1
  271. for lo <= hi {
  272. m := (lo + hi) >> 1
  273. if s[m] < k {
  274. lo = m + 1
  275. } else if s[m] > k {
  276. hi = m - 1
  277. } else {
  278. return m
  279. }
  280. }
  281. return -1
  282. }