check_city.go 8.0 KB

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