check_city.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package main
  2. import (
  3. "fmt"
  4. qu "qfw/util"
  5. "regexp"
  6. "strings"
  7. )
  8. var cityEndReg *regexp.Regexp = regexp.MustCompile("(区|县|市)$")
  9. var ErrBuyerReg *regexp.Regexp = regexp.MustCompile("^(成都东部新区)")
  10. func getCheckDataCity(tmp map[string]interface{}, update_check *map[string]interface{}) {
  11. area := qu.ObjToString(tmp["area"])
  12. city := qu.ObjToString(tmp["city"])
  13. district := qu.ObjToString(tmp["district"])
  14. buyer := qu.ObjToString(tmp["buyer"])
  15. if buyer != "" && ErrBuyerReg.MatchString(buyer) && area == "浙江" {
  16. (*update_check)["area"] = "四川"
  17. (*update_check)["city"] = "成都市"
  18. (*update_check)["district"] = ""
  19. return
  20. }
  21. if (district != "" && city != "" && area != "" && area != "全国") || buyer == "" {
  22. //标准城市-校验
  23. rdata := standardCheckCity(area, city, district)
  24. if len(rdata) > 0 {
  25. umap := updateLogging(tmp, rdata, "标准信息")
  26. copyUpdateData(umap, update_check)
  27. }
  28. return
  29. }
  30. rdata := cityMarshal(tmp) //企业表-补城市
  31. if len(rdata) > 0 {
  32. new_area, new_city, new_district := area, city, district
  33. if rdata["area"] != "" {
  34. new_area = qu.ObjToString(rdata["area"])
  35. }
  36. if rdata["city"] != "" {
  37. new_city = qu.ObjToString(rdata["city"])
  38. }
  39. if rdata["district"] != "" {
  40. new_district = qu.ObjToString(rdata["district"])
  41. }
  42. umap := updateLogging(tmp, rdata, "企业信息")
  43. n_rdata := standardCheckCity(new_area, new_city, new_district)
  44. if len(n_rdata) > 0 {
  45. for rk, rv := range n_rdata {
  46. umap[rk] = rv
  47. umap["modifycheck"].(map[string]interface{})[rk] = fmt.Sprintf("企业标准信息~%s~%s", qu.ObjToString(tmp[rk]), rv)
  48. }
  49. }
  50. copyUpdateData(umap, update_check)
  51. } else {
  52. n_rdata := standardCheckCity(area, city, district)
  53. if len(n_rdata) > 0 {
  54. umap := updateLogging(tmp, n_rdata, "标准信息")
  55. copyUpdateData(umap, update_check)
  56. }
  57. }
  58. }
  59. //企业表校验
  60. func cityMarshal(data map[string]interface{}) map[string]string {
  61. buyer := qu.ObjToString(data["buyer"])
  62. bidarea := qu.ObjToString(data["area"])
  63. bidcity := qu.ObjToString(data["city"])
  64. biddistrict := qu.ObjToString(data["district"])
  65. rdata := make(map[string]string)
  66. query_name := map[string]interface{}{
  67. "company_name": buyer,
  68. }
  69. tmp := qy_mgo.FindOne(qy_coll_name, query_name)
  70. if tmp == nil || len(tmp) < 2 {
  71. return rdata
  72. }
  73. company_code := fmt.Sprint(tmp["company_code"])
  74. if len(company_code) > 5 {
  75. province_city_district := qy_mgo.FindOne("address", map[string]interface{}{
  76. "code": company_code[:6],
  77. })
  78. remarks := fmt.Sprint((province_city_district)["Remarks"])
  79. if remarks == "" || remarks == "废除" || remarks == "已作废" {
  80. } else if province_city_district != nil {
  81. codeprovince := qu.ObjToString((province_city_district)["province"])
  82. codecity := qu.ObjToString((province_city_district)["city"])
  83. codedistrict := qu.ObjToString((province_city_district)["district"])
  84. if bidarea == "" || bidarea == "全国" {
  85. if codeprovince != "" {
  86. rdata["area"] = codeprovince
  87. if codecity != "" && codecity != codeprovince {
  88. rdata["city"] = codecity
  89. if codedistrict != "" && codedistrict != codecity {
  90. rdata["district"] = codedistrict
  91. }
  92. }
  93. }
  94. } else if bidcity == "" && codecity != "" && bidarea == codeprovince {
  95. if codecity != bidarea {
  96. rdata["city"] = codecity
  97. if codedistrict != "" && codecity != codedistrict {
  98. rdata["district"] = codedistrict
  99. }
  100. }
  101. } else if biddistrict == "" && codedistrict != "" && bidarea == codeprovince && codecity == bidcity {
  102. rdata["district"] = codedistrict
  103. }
  104. if rdata["city"] != "" || rdata["district"] != "" {
  105. return rdata
  106. }
  107. }
  108. }
  109. entprovince := qu.ObjToString(tmp["company_area"])
  110. entcity := qu.ObjToString(tmp["company_city"])
  111. entdistrict := qu.ObjToString(tmp["company_district"])
  112. //新增特殊处理-港澳台数据
  113. if bidarea == "" || bidarea == "香港" || bidarea == "澳门" || bidarea == "台湾" || bidarea == "全国" {
  114. if entprovince != "" {
  115. rdata["area"] = entprovince
  116. if entcity != "" && entcity != entprovince {
  117. rdata["city"] = entcity
  118. if entdistrict != "" && entdistrict != entcity {
  119. rdata["district"] = entdistrict
  120. }
  121. }
  122. }
  123. } else if bidcity == "" && entcity != "" && entprovince == bidarea {
  124. rdata["city"] = entcity
  125. if entdistrict != "" && entcity != entdistrict {
  126. rdata["district"] = entdistrict
  127. }
  128. } else if biddistrict == "" && entdistrict != "" && entprovince == bidarea && bidcity == entcity {
  129. rdata["district"] = entdistrict
  130. }
  131. return rdata
  132. }
  133. //标准校验
  134. func standardCheckCity(area string, city string, district string) map[string]string {
  135. rdata := make(map[string]string, 0)
  136. if area == "香港" || area == "澳门" || area == "台湾" || (area == "全国" && (city == "" && district == "")) {
  137. return rdata
  138. }
  139. //第一步:区校验
  140. if district != "" {
  141. districtArr := S_DistrictDict[district]
  142. if districtArr == nil { //涉及了 个别别名相关的数据
  143. trim_arr := aliasDataDistrict(district) //拆分后缀
  144. if len(trim_arr) > 0 {
  145. for _, alias_district := range trim_arr {
  146. alias_districtArr := S_DistrictDict[alias_district]
  147. for _, v := range alias_districtArr {
  148. if city == v.C_Name && area == v.P_Name {
  149. rdata["district"] = alias_district
  150. return rdata
  151. }
  152. }
  153. }
  154. }
  155. rdata["district"] = ""
  156. } else {
  157. isTrue := false
  158. for _, v := range districtArr {
  159. if city == v.C_Name && area == v.P_Name {
  160. isTrue = true
  161. break
  162. }
  163. }
  164. if isTrue { //完全匹配
  165. return rdata
  166. } else { //未完全匹配
  167. if len(districtArr) == 1 {
  168. rdata["area"] = districtArr[0].P_Name
  169. rdata["city"] = districtArr[0].C_Name
  170. rdata["district"] = districtArr[0].D_Name
  171. return rdata
  172. } else {
  173. rdata["district"] = ""
  174. }
  175. }
  176. }
  177. }
  178. //第二步:区校验-失败 市-校验
  179. if city != "" {
  180. cityArr := S_CityDict[city]
  181. if cityArr == nil {
  182. //把市当成区,匹配三级 - 存在优化空间- city:郑州 别名
  183. districtArr := S_DistrictDict[city]
  184. for _, v := range districtArr {
  185. if city == v.C_Name && area == v.P_Name {
  186. rdata["area"] = districtArr[0].P_Name
  187. rdata["city"] = districtArr[0].C_Name
  188. rdata["district"] = districtArr[0].D_Name
  189. return rdata
  190. }
  191. }
  192. rdata["city"] = ""
  193. } else {
  194. isTrue := false
  195. for _, v := range cityArr {
  196. if area == v.P_Name {
  197. isTrue = true
  198. break
  199. }
  200. }
  201. if isTrue { //完全匹配
  202. return rdata
  203. } else { //未完全匹配
  204. if len(cityArr) == 1 {
  205. rdata["area"] = cityArr[0].P_Name
  206. rdata["city"] = cityArr[0].C_Name
  207. rdata["district"] = ""
  208. return rdata
  209. } else {
  210. rdata["city"] = ""
  211. }
  212. }
  213. }
  214. }
  215. //第三步:省份校验
  216. if S_ProvinceDict[area] == nil {
  217. rdata["area"] = "全国"
  218. rdata["city"] = ""
  219. rdata["district"] = ""
  220. }
  221. return rdata
  222. }
  223. //更新日志
  224. func updateLogging(tmp map[string]interface{}, rdata map[string]string, desc string) map[string]interface{} {
  225. umap := make(map[string]interface{})
  226. if tmp["modifycheck"] == nil {
  227. umap["modifycheck"] = make(map[string]interface{})
  228. } else {
  229. umap["modifycheck"] = tmp["modifycheck"]
  230. }
  231. for rk, rv := range rdata {
  232. umap[rk] = rv
  233. umap["modifycheck"].(map[string]interface{})[rk] = fmt.Sprintf("%s~%s~%s", desc, qu.ObjToString(tmp[rk]), rv)
  234. }
  235. return umap
  236. }
  237. func copyUpdateData(tmp map[string]interface{}, update_check *map[string]interface{}) {
  238. for k, v := range tmp {
  239. (*update_check)[k] = v
  240. }
  241. }
  242. //拆分三级县
  243. func aliasDataDistrict(district string) []string {
  244. arr := []string{}
  245. if cityEndReg.MatchString(district) {
  246. str := cityEndReg.FindString(district)
  247. strings.TrimRight(district, str)
  248. if str == "县" {
  249. arr = append(arr, fmt.Sprintf("%s区", strings.TrimRight(district, str)))
  250. arr = append(arr, fmt.Sprintf("%s市", strings.TrimRight(district, str)))
  251. } else if str == "区" {
  252. arr = append(arr, fmt.Sprintf("%s县", strings.TrimRight(district, str)))
  253. arr = append(arr, fmt.Sprintf("%s市", strings.TrimRight(district, str)))
  254. } else if str == "市" {
  255. arr = append(arr, fmt.Sprintf("%s县", strings.TrimRight(district, str)))
  256. arr = append(arr, fmt.Sprintf("%s区", strings.TrimRight(district, str)))
  257. } else {
  258. }
  259. } else { //未找到 district- 区县市 例: district : 金水
  260. arr = append(arr, fmt.Sprintf("%s区", district))
  261. arr = append(arr, fmt.Sprintf("%s县", district))
  262. arr = append(arr, fmt.Sprintf("%s市", district))
  263. }
  264. return arr
  265. }