main.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/xuri/excelize/v2"
  6. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  7. "jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic"
  8. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  9. "log"
  10. "sync"
  11. )
  12. var (
  13. JianZhiLabel = make([]CreditLabel, 0)
  14. MgoT *mongodb.MongodbSim //测试环境链接
  15. Es *elastic.Elastic
  16. )
  17. func Init() {
  18. f, err := excelize.OpenFile("./jianyu_zhima_0829.xlsx")
  19. if err != nil {
  20. fmt.Println(err)
  21. return
  22. }
  23. defer func() {
  24. f.Save()
  25. if err := f.Close(); err != nil {
  26. fmt.Println(err)
  27. }
  28. }()
  29. //2.专项债详情
  30. rows, err := f.GetRows("0829")
  31. if err != nil {
  32. fmt.Println(err)
  33. return
  34. }
  35. for i := 1; i < len(rows); i++ {
  36. data := CreditLabel{
  37. ZhimaToptype: rows[i][0],
  38. ZhimaSubtype: rows[i][1],
  39. ZhimaName: rows[i][2],
  40. }
  41. JianZhiLabel = append(JianZhiLabel, data)
  42. }
  43. //测试环境
  44. //MgoT = &mongodb.MongodbSim{
  45. // MongodbAddr: "192.168.3.149:27102",
  46. // //MongodbAddr: "192.168.3.206:27002",
  47. // DbName: "mixdata",
  48. // Size: 10,
  49. // UserName: "root",
  50. // Password: "root",
  51. // //Direct: true,
  52. //}
  53. //MgoT.InitPool()
  54. //
  55. ////测试环境es
  56. //Es = &elastic.Elastic{
  57. // S_esurl: "http://192.168.3.149:9201",
  58. // //S_esurl: "http://172.17.4.184:19805",
  59. // I_size: 10,
  60. // Username: "",
  61. // Password: "",
  62. //}
  63. //Es.InitElasticSize()
  64. //正式环境
  65. MgoT = &mongodb.MongodbSim{
  66. MongodbAddr: "172.17.189.140:27080",
  67. //MongodbAddr: "127.0.0.1:27083",
  68. Size: 10,
  69. DbName: "mixdata",
  70. UserName: "SJZY_RWbid_ES",
  71. Password: "SJZY@B4i4D5e6S",
  72. //Direct: true,
  73. }
  74. MgoT.InitPool()
  75. Es = &elastic.Elastic{
  76. //S_esurl: "http://127.0.0.1:19908",
  77. S_esurl: "http://172.17.4.184:19908",
  78. I_size: 10,
  79. Username: "jybid",
  80. Password: "Top2023_JEB01i@31",
  81. }
  82. Es.InitElasticSize()
  83. }
  84. func main() {
  85. Init()
  86. appID := "2021003111633206"
  87. 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-----"
  88. //epCertNo := "914400007211976169" //对应企业库 credit_no
  89. sceneCode := "JIANYU_LABEL"
  90. //1.查询qyxy 数据
  91. defer util.Catch()
  92. sess := MgoT.GetMgoConn()
  93. defer MgoT.DestoryMongoConn(sess)
  94. it := sess.DB("mixdata").C("qyxy_std").Find(nil).Select(nil).Sort("_id").Iter()
  95. fmt.Println("taskRun 开始")
  96. count := 0
  97. ch := make(chan bool, 5)
  98. wg := &sync.WaitGroup{}
  99. for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
  100. if count%1000 == 0 {
  101. log.Println("current", count, tmp["company_name"], tmp["credit_no"], tmp["_id"])
  102. }
  103. // 存在芝麻标签,直接跳过
  104. //if _, ok := tmp["zhima_labels"]; ok {
  105. // continue
  106. //}
  107. if util.ObjToString(tmp["credit_no"]) == "" {
  108. continue
  109. }
  110. ch <- true
  111. wg.Add(1)
  112. go func(tmp map[string]interface{}) {
  113. defer func() {
  114. <-ch
  115. wg.Done()
  116. }()
  117. //
  118. id := mongodb.BsonIdToSId(tmp["_id"])
  119. epCertNo := util.ObjToString(tmp["credit_no"])
  120. createLabels := getCreditLabel(appID, privateKeyPEM, epCertNo, sceneCode)
  121. if len(createLabels) > 0 {
  122. updateEs := map[string]interface{}{
  123. "zhima_labels": convertToInterfaceSliceEs(createLabels),
  124. }
  125. updateMgo := map[string]interface{}{
  126. "zhima_labels": convertToInterfaceSliceMgo(createLabels),
  127. }
  128. where := map[string]interface{}{
  129. "_id": tmp["_id"],
  130. }
  131. MgoT.Update("qyxy_std", where, map[string]interface{}{"$set": updateMgo}, true, false)
  132. err := Es.UpdateDocument("qyxy", id, updateEs)
  133. if err != nil && err.Error() != "Document not updated: noop" {
  134. log.Println("qyxy es update err", err, id)
  135. }
  136. }
  137. }(tmp)
  138. tmp = make(map[string]interface{})
  139. }
  140. wg.Wait()
  141. log.Println("企业芝麻标签结束")
  142. }
  143. // getCreditLabel 获取芝麻企业信用企业标签
  144. func getCreditLabel(appID, privateKeyPEM, certNo, sceneCode string) (createLabels []CreditLabel) {
  145. BizContent := BizContentForLabelQuery{
  146. EPCertNo: certNo,
  147. ShowFlag: true,
  148. SceneCode: sceneCode,
  149. }
  150. curl := "https://openapi.alipay.com/gateway.do"
  151. method := "zhima.credit.ep.acceptance.label.query"
  152. //createLabels := make([]CreditLabel, 0)
  153. bizbyte, _ := json.Marshal(BizContent)
  154. priKey, err := parsePrivateKey(privateKeyPEM)
  155. if err != nil {
  156. log.Fatalln("parsePrivateKey err", err)
  157. }
  158. resMap, err := DoRequest(appID, string(bizbyte), curl, method, priKey)
  159. if err != nil {
  160. log.Fatalln("request err", err)
  161. }
  162. responseData := util.ObjToMap((*resMap)["zhima_credit_ep_acceptance_label_query_response"])
  163. if util.ObjToString(((*responseData)["code"])) == "10000" && util.ObjToString(((*responseData)["msg"])) == "Success" {
  164. if (*responseData)["label_content"] == nil {
  165. //log.Println("请求出错,没有返回企业标签内容模型", BizContent)
  166. } else {
  167. if labelContent, ok := (*responseData)["label_content"].([]interface{}); ok {
  168. for _, v := range labelContent {
  169. label := util.ObjToMap(v)
  170. labelName := util.ObjToString((*label)["label_name"])
  171. labelCategory := util.ObjToString((*label)["label_category"])
  172. labelCode := util.ObjToString((*label)["label_code"])
  173. labelDe := util.ObjToString((*label)["label_definition"])
  174. data := getLabel(labelCategory, labelName)
  175. data.ZhimaCode = labelCode
  176. data.ZhimaDefinition = labelDe
  177. if data.ZhimaSubtype != "" {
  178. createLabels = append(createLabels, data)
  179. }
  180. }
  181. }
  182. }
  183. } else {
  184. log.Println("请求失败", BizContent, (*responseData))
  185. }
  186. return
  187. }
  188. // getLabel 根据labelTop labelName 获取对应芝麻标签
  189. func getLabel(labelTop, labelName string) (data CreditLabel) {
  190. for _, v := range JianZhiLabel {
  191. if v.ZhimaToptype == labelTop && v.ZhimaName == labelName {
  192. return v
  193. }
  194. }
  195. return
  196. }
  197. func convertToInterfaceSliceEs(labels []CreditLabel) []map[string]interface{} {
  198. result := make([]map[string]interface{}, len(labels))
  199. for i, label := range labels {
  200. result[i] = map[string]interface{}{
  201. "zhima_toptype": label.ZhimaToptype,
  202. "zhima_subtype": label.ZhimaSubtype,
  203. "zhima_name": label.ZhimaName,
  204. "zhima_definition": label.ZhimaDefinition,
  205. }
  206. }
  207. return result
  208. }
  209. func convertToInterfaceSliceMgo(labels []CreditLabel) []map[string]interface{} {
  210. result := make([]map[string]interface{}, len(labels))
  211. for i, label := range labels {
  212. result[i] = map[string]interface{}{
  213. "zhima_toptype": label.ZhimaToptype,
  214. "zhima_subtype": label.ZhimaSubtype,
  215. "zhima_name": label.ZhimaName,
  216. "zhima_code": label.ZhimaCode,
  217. "zhima_definition": label.ZhimaDefinition,
  218. }
  219. }
  220. return result
  221. }