replenish.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package tool
  2. import (
  3. "data_ai/ul"
  4. qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  5. "regexp"
  6. "strings"
  7. "unicode/utf8"
  8. )
  9. var ruleReg1 = regexp.MustCompile("^(中部|西部)管道公司$")
  10. var ruleReg2 = regexp.MustCompile("^(东北|华南|华北|华中|苏北)[分]?公司$")
  11. var ruleReg3 = regexp.MustCompile("([分]?公司)$")
  12. // 补充规则大全···
  13. func getReplenishRules(tmp map[string]interface{}, update map[string]interface{}) {
  14. for _, v := range ul.ReplensihRules {
  15. rule_name := qu.ObjToString(v["rule"])
  16. switch rule_name {
  17. case "补充前缀地域":
  18. RuleInfo1(tmp, update, v)
  19. case "省市映射规则":
  20. RuleInfo2(tmp, update, v)
  21. case "省市前缀规则":
  22. RuleInfo2(tmp, update, v)
  23. case "单位全称映射":
  24. RuleInfo3(tmp, update, v)
  25. case "地域修正规则":
  26. RuleInfo4(tmp, update, v)
  27. case "省级简称拼接":
  28. RuleInfo5(tmp, update, v)
  29. case "市级全称拼接":
  30. RuleInfo5(tmp, update, v)
  31. default:
  32. }
  33. }
  34. }
  35. // 核对采购单位
  36. func RuleInfo1(tmp map[string]interface{}, update map[string]interface{}, info map[string]interface{}) {
  37. if qu.ObjToString(tmp["buyer"]) != "" || qu.ObjToString(update["buyer"]) != "" {
  38. return
  39. }
  40. site := qu.ObjToString(tmp["site"])
  41. if qu.ObjToString(info[site]) != site {
  42. return
  43. }
  44. area := qu.ObjToString(tmp["area"])
  45. if qu.ObjToString(update["area"]) != "" && qu.ObjToString(update["area"]) != "全国" {
  46. area = qu.ObjToString(update["area"])
  47. }
  48. buyer := qu.ObjToString(info["buyer"])
  49. if buyer == "" {
  50. return
  51. }
  52. //是否补前缀
  53. prefix := qu.IntAll(info["prefix"])
  54. if prefix == 1 {
  55. if area == "" || area == "全国" {
  56. update["buyer"] = buyer
  57. } else {
  58. if area == "内蒙古" {
  59. update["buyer"] = buyer + area + "自治区" + "分公司"
  60. } else {
  61. update["buyer"] = buyer + area + "分公司"
  62. }
  63. }
  64. } else {
  65. update["buyer"] = buyer
  66. }
  67. }
  68. // 采购单位补充
  69. func RuleInfo2(tmp map[string]interface{}, update map[string]interface{}, info map[string]interface{}) {
  70. area := qu.ObjToString(tmp["area"])
  71. city := qu.ObjToString(tmp["city"])
  72. buyer := qu.ObjToString(tmp["buyer"])
  73. if utf8.RuneCountInString(buyer) != 3 { //简称长度···
  74. return
  75. }
  76. if u_area := qu.ObjToString(update["area"]); u_area != "" {
  77. area = u_area
  78. }
  79. if u_city := qu.ObjToString(update["city"]); u_city != "" {
  80. city = u_city
  81. }
  82. if u_buyer := qu.ObjToString(update["buyer"]); u_buyer != "" {
  83. buyer = u_buyer
  84. }
  85. rule := qu.ObjToString(info["rule"])
  86. name := qu.ObjToString(info["name"])
  87. if rule == "省市映射规则" {
  88. key := area + "-" + city + "-" + buyer
  89. if key == name {
  90. if s_name := qu.ObjToString(info["s_name"]); s_name != "" {
  91. update["buyer"] = s_name
  92. }
  93. }
  94. }
  95. if rule == "省市前缀规则" {
  96. if buyer == name {
  97. if city != "" {
  98. update["buyer"] = city + buyer
  99. } else if area != "" && area != "全国" {
  100. update["buyer"] = area + buyer
  101. } else {
  102. }
  103. }
  104. }
  105. }
  106. // 采购单位映射逻辑
  107. func RuleInfo3(tmp map[string]interface{}, update map[string]interface{}, info map[string]interface{}) {
  108. buyer := qu.ObjToString(tmp["buyer"])
  109. if u_buyer := qu.ObjToString(update["buyer"]); u_buyer != "" {
  110. buyer = u_buyer
  111. }
  112. site := qu.ObjToString(tmp["site"])
  113. if site == qu.ObjToString(info["site"]) && buyer == qu.ObjToString(info["buyer"]) {
  114. if name := qu.ObjToString(info["name"]); name != "" {
  115. update["buyer"] = name
  116. }
  117. }
  118. }
  119. // 双向验证地域
  120. func RuleInfo4(tmp map[string]interface{}, update map[string]interface{}, info map[string]interface{}) {
  121. flash_key := qu.ObjToString(update["area"]) + "-" + qu.ObjToString(update["city"])
  122. rule_key := qu.ObjToString(tmp["area"]) + "-" + qu.ObjToString(tmp["city"]) + "-" + qu.ObjToString(tmp["district"])
  123. flash := qu.ObjToString(info["s_name"])
  124. rule := qu.ObjToString(info["name"])
  125. if flash_key == flash && rule_key == rule {
  126. delete(update, "area")
  127. delete(update, "city")
  128. delete(update, "district")
  129. }
  130. }
  131. func RuleInfo5(tmp map[string]interface{}, update map[string]interface{}, info map[string]interface{}) {
  132. buyer := qu.ObjToString(tmp["buyer"])
  133. if u_buyer := qu.ObjToString(update["buyer"]); u_buyer != "" {
  134. buyer = u_buyer
  135. }
  136. site := qu.ObjToString(tmp["site"])
  137. name := qu.ObjToString(info["name"])
  138. if buyer == "" || site != qu.ObjToString(info["site"]) {
  139. return
  140. }
  141. //规则名字···
  142. rule := qu.ObjToString(info["rule"])
  143. prefix := qu.IntAll(info["prefix"])
  144. if rule == "省级简称拼接" {
  145. if ruleReg1.MatchString(buyer) || ruleReg2.MatchString(buyer) {
  146. update["buyer"] = name + buyer
  147. return
  148. }
  149. if suffix := ruleReg3.FindString(buyer); suffix != "" {
  150. str := strings.TrimSuffix(buyer, suffix)
  151. if ul.S_ProvinceDict[str] != nil {
  152. update["buyer"] = name + buyer
  153. return
  154. }
  155. }
  156. }
  157. if rule == "市级全称拼接" {
  158. if suffix := ruleReg3.FindString(buyer); suffix != "" {
  159. str := strings.TrimSuffix(buyer, suffix)
  160. if ul.S_CityDict[str] != nil {
  161. if citys := ul.S_CityDict[str]; len(citys) == 1 {
  162. if prefix == 1 {
  163. update["buyer"] = name + citys[0].P_Name + "有限公司" + buyer
  164. } else {
  165. update["buyer"] = name + buyer
  166. }
  167. return
  168. }
  169. } else {
  170. str = str + "市"
  171. if ul.S_CityDict[str] != nil {
  172. if citys := ul.S_CityDict[str]; len(citys) == 1 {
  173. if prefix == 1 {
  174. update["buyer"] = name + citys[0].P_Name + "有限公司" + buyer
  175. } else {
  176. update["buyer"] = name + buyer
  177. }
  178. return
  179. }
  180. }
  181. }
  182. }
  183. }
  184. }
  185. /*******************************************
  186. *******************************************
  187. *******************************************
  188. *******************************************
  189. *******************************************/
  190. // 校验金额与折扣率···
  191. func getVerifyBidDiscount(tmp map[string]interface{}, update map[string]interface{}) bool {
  192. bidamount, biddiscount := qu.Float64All(tmp["bidamount"]), qu.Float64All(tmp["biddiscount"])
  193. if f1 := qu.Float64All(update["bidamount"]); f1 > 0 {
  194. bidamount = f1
  195. }
  196. if f2 := qu.Float64All(update["biddiscount"]); f2 > 0 {
  197. biddiscount = f2
  198. }
  199. if biddiscount > 0 && bidamount > 0 && bidamount == biddiscount {
  200. //删除金额
  201. delete(update, "bidamount")
  202. if qu.Float64All(tmp["bidamount"]) > 0 {
  203. return true
  204. }
  205. }
  206. return false
  207. }
  208. // 最终单位选取校验
  209. func getTheBestUnit(tmp map[string]interface{}, update_info map[string]interface{}) {
  210. buyer := qu.ObjToString(update_info["buyer"])
  211. s_winner := qu.ObjToString(update_info["s_winner"])
  212. agency := qu.ObjToString(update_info["agency"])
  213. if buyer == "" {
  214. buyer = qu.ObjToString(tmp["buyer"])
  215. }
  216. if s_winner == "" {
  217. s_winner = qu.ObjToString(tmp["s_winner"])
  218. }
  219. if agency == "" {
  220. agency = qu.ObjToString(tmp["agency"])
  221. }
  222. if buyer == s_winner && buyer != "" {
  223. if strings.Contains(buyer, "公司") {
  224. update_info["buyer"] = ""
  225. } else {
  226. update_info["s_winner"] = ""
  227. update_info["winner"] = ""
  228. }
  229. }
  230. if agency != "" {
  231. if agency == buyer || agency == s_winner {
  232. update_info["agency"] = ""
  233. }
  234. }
  235. }
  236. // 可续计数法修正
  237. func getScientificNotation(tmp map[string]interface{}, update map[string]interface{}) {
  238. subtype := qu.ObjToString(tmp["subtype"])
  239. bidamount := qu.Float64All(tmp["bidamount"])
  240. budget := qu.Float64All(tmp["budget"])
  241. if u_s := qu.ObjToString(update["subtype"]); u_s != "" {
  242. subtype = u_s
  243. }
  244. if u_b := qu.Float64All(update["bidamount"]); u_b > 0.0 {
  245. bidamount = u_b
  246. }
  247. if u_t := qu.Float64All(update["budget"]); u_t > 0.0 {
  248. budget = u_t
  249. }
  250. e_bidamount := qu.Float64All(tmp["e_bidamount"])
  251. if e_bidamount <= 0.0 {
  252. return
  253. }
  254. //用科学计数法的金额-替换中标金额
  255. if subtype == "合同" || subtype == "中标" || subtype == "成交" || subtype == "单一" {
  256. if bidamount > 0.0 && bidamount < 50.0 {
  257. update["bidamount"] = e_bidamount
  258. }
  259. } else {
  260. if budget > 0.0 && budget < 50.0 {
  261. update["budget"] = e_bidamount
  262. }
  263. }
  264. }