main.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "strings"
  7. "sync"
  8. "unicode"
  9. "github.com/xuri/excelize/v2"
  10. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  11. "jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic"
  12. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  13. )
  14. var (
  15. // JianZhiLabel = make([]CreditLabel, 0)
  16. ZhimaMap = map[string]string{}
  17. MgoT *mongodb.MongodbSim //测试环境链接
  18. Es *elastic.Elastic
  19. )
  20. func Init() {
  21. f, err := excelize.OpenFile("./jianyu_zhima_0829.xlsx")
  22. if err != nil {
  23. fmt.Println(err)
  24. return
  25. }
  26. defer func() {
  27. f.Save()
  28. if err := f.Close(); err != nil {
  29. fmt.Println(err)
  30. }
  31. }()
  32. //2.专项债详情
  33. rows, err := f.GetRows("0829")
  34. if err != nil {
  35. fmt.Println(err)
  36. return
  37. }
  38. for i := 1; i < len(rows); i++ {
  39. // data := CreditLabel{
  40. // ZhimaToptype: rows[i][0],
  41. // ZhimaSubtype: rows[i][1],
  42. // ZhimaName: rows[i][2],
  43. // ZhimaValue: rows[i][4],
  44. // }
  45. // JianZhiLabel = append(JianZhiLabel, data)
  46. ZhimaMap[rows[i][2]] = rows[i][1]
  47. }
  48. //测试环境
  49. //MgoT = &mongodb.MongodbSim{
  50. // MongodbAddr: "192.168.3.149:27102",
  51. // //MongodbAddr: "192.168.3.206:27002",
  52. // DbName: "mixdata",
  53. // Size: 10,
  54. // UserName: "root",
  55. // Password: "root",
  56. // //Direct: true,
  57. //}
  58. //MgoT.InitPool()
  59. //
  60. ////测试环境es
  61. //Es = &elastic.Elastic{
  62. // S_esurl: "http://192.168.3.149:9201",
  63. // //S_esurl: "http://172.17.4.184:19805",
  64. // I_size: 10,
  65. // Username: "",
  66. // Password: "",
  67. //}
  68. //Es.InitElasticSize()
  69. //正式环境
  70. MgoT = &mongodb.MongodbSim{
  71. MongodbAddr: "172.17.189.140:27080",
  72. //MongodbAddr: "127.0.0.1:27083",
  73. Size: 10,
  74. DbName: "mixdata",
  75. UserName: "SJZY_RWbid_ES",
  76. Password: "SJZY@B4i4D5e6S",
  77. //Direct: true,
  78. }
  79. MgoT.InitPool()
  80. Es = &elastic.Elastic{
  81. //S_esurl: "http://127.0.0.1:19908",
  82. S_esurl: "http://172.17.4.184:19908",
  83. I_size: 10,
  84. Username: "jybid",
  85. Password: "Top2023_JEB01i@31",
  86. }
  87. Es.InitElasticSize()
  88. }
  89. func main() {
  90. Init()
  91. appID := "2021003111633206"
  92. privateKeyPEM := "-----BEGIN RSA PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCaJnmz3N1Z43jxtmZJmPkInl3FbfudxjicThHj+Hkndp+muzZXlAPcWoYTFLAfVa6xg9xAc58fWTPUGOpouh0ZDEP8TGvD784AljDNwRXPI9+afjcxN8gzsNPlqA6KVkAu5u5uEI1HHQgtdyRoCEnXgQRXj6DqAs9olbx8HrTxHjZzjPd+HXv+v4na3zAvZsvPdhLB2ggpVW6uQN7ur8C+hVpB3ZO+gGVFHy3m1t08XgscljyOA9Vpk4T8TnKZqDvnI6ehWFCGeD11yoe3ipHJJdP/+u9/tXiKhm29mJvcM9C6gab6BOQABByQPb2nPFFyfPglbRYrYxgKp/eXUQTzAgMBAAECggEAO6BCVyZJoKlycNzC+Bjpy0Gmt+Vw/HheEWfJV8sW4gLqgk3MGVgxnhyN2/eWoKg96IA+w9d1Z2TTvWjd0yCafMPX0FGnJaUuo990hUH4s6UGqvXDV5BiKkxtylmVNkFilkHRXFWesDE0ppF9TZhXJ7rJ+Syfa6UmoSe6PrCKAPG4FD8MH1ODj5b42l/TRIFM948nTtTLFAFgd77P5ULBCKVfBB5V9XdKhLRdwG9RxugWwkxuCiMOtmk45DzA/PQgvkIzEViD/2NJX67/S88B0G63zdQizJrvxsLp9fThmjhlo/+CaF+a+nfIzg81TfQHlRuTjiYc7iE9n5K0sU82wQKBgQDydI9pEjkPH+ZEixEymdx8D4workBfa+GXgobJ2UwatqCJOCYqZJR0MhjTVeDJiiTGFiemNyZHT0WFQedAQ/O9mkRf0MRhzR6ZOiMnCG5pSSOKdmQXoqjOqcMzdgWBQRol0eLB/vto8M3bpt1VautR0qQOR7BrFsj57K3asofikQKBgQCiwwie5gyCAYB1gkp4QkLmQDSTJdZaTlzzx2oa2/ZB4Pg6wWWNJIxEfSwtuGVH4jGJl0Eer2YpHzaY7f2NfOWJCpNI/aRhM/RilQsFXTox/5bqlbAfspPMqSHnry2OgbZb9CRF3jH7kt65390SKde4A4JNE+jJ0Xb07Tzcr7+pQwKBgCDJ8KcWBs9r0flNEVtVgYLpm1vZDO2aqlySE2Zy0579OcK07Dxpc8YvDDpwb8DxxL1hO6V36d5U8yLtYbfIOMtYdIy8sAJF+jBgs2ZQ9pWYhYzxK+IiZk/kl3h7Ko1rX3zj4JW5xQhRIJXnACHQHtjm8rbXrR0ebLmX738XC9dxAoGAQfUDQ1E6dFyjb/syrnU7ow8VvyOwL7xd0rRW/TdyHdRLA5Rn0MCkzwRiqMx2zqCNLpLK4uJ1ZeiuOV8IRxP7+IL+mK+gs3tYZ7K6Wpwi/yvyPnIWg2Hcny1S/g5xSbSq76yKHn4ihy5Hb8+WSMwIDRvu68lLpq1ppWuWJGBcLP0CgYAnGtHlFY887zSI0aRdzV3EYm/sPnmYy0TWIUVLuGL8kkprcSIW2yRxx1GtpB+3A7cPu61WwRbiswJA6VmQHvn8f9ds81+aiO5KQLMk4MbrTwWhWLDpP4BxjWANVzPr19ZwmDJcYkh7YUI2iLqH7dXho5k62OYCM1T53xlql6HDcg==\n-----END RSA PRIVATE KEY-----"
  93. //epCertNo := "914400007211976169" //对应企业库 credit_no
  94. sceneCode := "JIANYU_LABEL"
  95. //1.查询qyxy 数据
  96. defer util.Catch()
  97. sess := MgoT.GetMgoConn()
  98. defer MgoT.DestoryMongoConn(sess)
  99. it := sess.DB("mixdata").C("qyxy_std").Find(nil).Select(nil).Sort("_id").Iter()
  100. fmt.Println("taskRun 开始")
  101. count := 0
  102. ch := make(chan bool, 5)
  103. wg := &sync.WaitGroup{}
  104. for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
  105. if count%1000 == 0 {
  106. log.Println("current", count)
  107. }
  108. // 存在芝麻标签,直接跳过
  109. //if _, ok := tmp["zhima_labels"]; ok {
  110. // continue
  111. //}
  112. if util.ObjToString(tmp["credit_no"]) == "" {
  113. continue
  114. }
  115. ch <- true
  116. wg.Add(1)
  117. go func(tmp map[string]interface{}) {
  118. defer func() {
  119. <-ch
  120. wg.Done()
  121. }()
  122. //
  123. id := mongodb.BsonIdToSId(tmp["_id"])
  124. epCertNo := util.ObjToString(tmp["credit_no"])
  125. createLabels := getCreditLabel(appID, privateKeyPEM, epCertNo, sceneCode)
  126. if len(createLabels) > 0 {
  127. updateEs := map[string]interface{}{
  128. "zhima_labels": convertToInterfaceSliceEs(createLabels),
  129. }
  130. updateMgo := map[string]interface{}{
  131. "zhima_labels": convertToInterfaceSliceMgo(createLabels),
  132. }
  133. where := map[string]interface{}{
  134. "_id": tmp["_id"],
  135. }
  136. MgoT.Update("qyxy_std", where, map[string]interface{}{"$set": updateMgo}, true, false)
  137. err := Es.UpdateDocument("qyxy", id, updateEs)
  138. if err != nil && err.Error() != "Document not updated: noop" {
  139. log.Println("qyxy es update err", err, id)
  140. }
  141. }
  142. }(tmp)
  143. tmp = make(map[string]interface{})
  144. }
  145. wg.Wait()
  146. log.Println("企业芝麻标签结束")
  147. }
  148. // getCreditLabel 获取芝麻企业信用企业标签
  149. func getCreditLabel(appID, privateKeyPEM, certNo, sceneCode string) (createLabels []CreditLabel) {
  150. BizContent := BizContentForLabelQuery{
  151. EPCertNo: certNo,
  152. ShowFlag: true,
  153. SceneCode: sceneCode,
  154. }
  155. curl := "https://openapi.alipay.com/gateway.do"
  156. method := "zhima.credit.ep.acceptance.label.query"
  157. bizbyte, _ := json.Marshal(BizContent)
  158. priKey, err := parsePrivateKey(privateKeyPEM)
  159. if err != nil {
  160. log.Fatalln("parsePrivateKey err", err)
  161. }
  162. resMap, err := DoRequest(appID, string(bizbyte), curl, method, priKey)
  163. if err != nil {
  164. log.Fatalln("request err", err)
  165. }
  166. responseData := util.ObjToMap((*resMap)["zhima_credit_ep_acceptance_label_query_response"])
  167. if util.ObjToString(((*responseData)["code"])) == "10000" && util.ObjToString(((*responseData)["msg"])) == "Success" {
  168. if (*responseData)["label_content"] == nil {
  169. //log.Println("请求出错,没有返回企业标签内容模型", BizContent)
  170. } else {
  171. if labelContent, ok := (*responseData)["label_content"].([]interface{}); ok {
  172. for _, v := range labelContent {
  173. label := util.ObjToMap(v)
  174. labelName := util.ObjToString((*label)["label_name"]) //外显
  175. labelCategory := util.ObjToString((*label)["label_category"]) //一级分类
  176. labelCode := util.ObjToString((*label)["label_code"])
  177. labelDe := util.ObjToString((*label)["label_definition"])
  178. newName, subtype := getLabel(labelName)
  179. data := CreditLabel{}
  180. data.ZhimaCode = labelCode
  181. data.ZhimaDefinition = labelDe
  182. data.ZhimaToptype = labelCategory
  183. data.ZhimaSubtype = subtype
  184. data.ZhimaName = newName
  185. data.ZhimaValue = labelName
  186. if subtype != "" {
  187. createLabels = append(createLabels, data)
  188. }
  189. }
  190. }
  191. }
  192. } else {
  193. log.Println("请求失败", BizContent, (*responseData))
  194. }
  195. return
  196. }
  197. // getLabel 根据labelTop labelName 获取对应芝麻标签
  198. func getLabel(labelName string) (newName, subtype string) {
  199. // for _, v := range JianZhiLabel {
  200. // if v.ZhimaToptype == labelTop && v.ZhimaName == labelName {
  201. // return v
  202. // }
  203. // }
  204. newName = getNewName(labelName)
  205. subtype = ""
  206. if ZhimaMap[newName] != "" {
  207. subtype = ZhimaMap[newName]
  208. }
  209. return
  210. }
  211. func getNewName(name string) string {
  212. if strings.Contains(name, "年企业信用") {
  213. return "芝麻企业信用等级连续情况"
  214. } else if strings.Contains(name, "芝麻企业信用等级") {
  215. return "芝麻企业信用等级"
  216. } else if strings.Contains(name, "企业信用等级") {
  217. return "企业信用等级_个体"
  218. } else if strings.Contains(name, "公开项目中标") {
  219. return "年度公开项目中标"
  220. } else if ZhimaMap[name] != "" {
  221. return ZhimaMap[name]
  222. } else if strings.Contains(name, "年A级纳税人") {
  223. return "A级纳税人连续年限"
  224. } else if strings.Contains(name, "年A级纳税人") {
  225. return "A级纳税人连续年限"
  226. } else if strings.Contains(name, "融资") && strings.Contains(name, "获") {
  227. return "获得融资"
  228. } else if strings.Contains(name, "融资") && strings.Contains(name, "轮") {
  229. return "融资轮次"
  230. } else if strings.Contains(name, "年网络销量前") && strings.Contains(name, "%") {
  231. return "年度网络销量靠前_百分比"
  232. } else if strings.Contains(name, "季度网络销量前") && strings.Contains(name, "%") {
  233. return "季度网络销量靠前_百分比"
  234. } else if strings.Contains(name, "月销量全网前") && strings.Contains(name, "%") {
  235. return "月度网络销量靠前_百分比"
  236. } else if strings.Contains(name, "年网络销量前") {
  237. return "年度网络销量靠前"
  238. } else if strings.Contains(name, "季度网络销量前") {
  239. return "季度网络销量靠前"
  240. } else if strings.Contains(name, "月销量全网前") {
  241. return "月度网络销量靠前"
  242. }
  243. strs := RemoveNumbers(name)
  244. strs = RemoveSpecialChars(strs)
  245. strs = strings.ReplaceAll(strs, "前", "")
  246. for k, _ := range ZhimaMap {
  247. if strings.Contains(name, k) {
  248. return k
  249. }
  250. isOk := true
  251. for _, v := range strings.Split(strs, "年") {
  252. if !strings.Contains(k, v) && v != "" {
  253. isOk = false
  254. }
  255. }
  256. if isOk {
  257. return k
  258. }
  259. }
  260. return ""
  261. }
  262. // RemoveSpecialChars 去除字符串中的特定字符,如%、「、」
  263. func RemoveSpecialChars(s string) string {
  264. var sb strings.Builder
  265. for _, r := range s {
  266. // 检查字符是否不是%、「或」
  267. // 注意:「的Unicode码点是0x300C,」的Unicode码点是0x300D
  268. if r != '%' && r != rune(0x300C) && r != rune(0x300D) {
  269. sb.WriteRune(r)
  270. }
  271. }
  272. return sb.String()
  273. }
  274. // RemoveNumbers 从字符串中移除所有数字
  275. func RemoveNumbers(s string) string {
  276. var sb strings.Builder
  277. for _, r := range s {
  278. if !unicode.IsDigit(r) {
  279. sb.WriteRune(r)
  280. }
  281. }
  282. return sb.String()
  283. }
  284. func convertToInterfaceSliceEs(labels []CreditLabel) []map[string]interface{} {
  285. result := make([]map[string]interface{}, len(labels))
  286. for i, label := range labels {
  287. result[i] = map[string]interface{}{
  288. "zhima_toptype": label.ZhimaToptype,
  289. "zhima_subtype": label.ZhimaSubtype,
  290. "zhima_name": label.ZhimaName,
  291. "zhima_definition": label.ZhimaDefinition,
  292. "zhima_value": label.ZhimaValue,
  293. }
  294. }
  295. return result
  296. }
  297. func convertToInterfaceSliceMgo(labels []CreditLabel) []map[string]interface{} {
  298. result := make([]map[string]interface{}, len(labels))
  299. for i, label := range labels {
  300. result[i] = map[string]interface{}{
  301. "zhima_toptype": label.ZhimaToptype,
  302. "zhima_subtype": label.ZhimaSubtype,
  303. "zhima_name": label.ZhimaName,
  304. "zhima_code": label.ZhimaCode,
  305. "zhima_definition": label.ZhimaDefinition,
  306. "zhima_value": label.ZhimaValue,
  307. }
  308. }
  309. return result
  310. }