weightFusion.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. package main
  2. import (
  3. "fmt"
  4. "go.mongodb.org/mongo-driver/bson/primitive"
  5. qu "qfw/util"
  6. "time"
  7. )
  8. //处理融合数据-返回,融合新数据数据-新增
  9. func (weight *weightDataMap) dealWithAddFusionStruct ()(map[string]interface{},map[string]interface{}){
  10. //指定模板数据dict-单条数据
  11. dict :=weight.data[weight.templateid].data
  12. //最早发布时间 (小)
  13. dict["early_publishtime"] = qu.IntAll(dict["publishtime"])
  14. //最近发布时间 (大)
  15. dict["lately_publishtime"] = qu.IntAll(dict["publishtime"])
  16. //最早入库时间 (小)
  17. dict["early_comeintime"] = qu.IntAll(dict["comeintime"])
  18. //最近入库时间 (大)
  19. dict["lately_comeintime"] = qu.IntAll(dict["comeintime"])
  20. //当前更新时间
  21. dict["current_updatetime"] = qu.IntAll(time.Now().Unix())
  22. //融合生成时间
  23. dict["current_updatetime"] = qu.IntAll(time.Now().Unix())
  24. //所有相关联ids
  25. dict["fusion_allids"] = weight.allids
  26. //融合保存相关联ids
  27. dict["fusion_saveids"] = weight.saveids
  28. //标准id
  29. dict["fusion_templateid"] = weight.templateid
  30. //站点,质量分
  31. dict["fusion_score"] = weight.saveLevelAndScoreRecord()
  32. //记录所有href
  33. dict["fusion_all_hrefs"] = weight.allhrefs
  34. //当前融合源id
  35. dict["fusion_sourceid"] = weight.sourceid
  36. //采用新增id
  37. delete(dict,"_id")
  38. //日志相关处理
  39. recordDict := map[string]interface{}{
  40. "1":map[string]interface{}{
  41. "data":map[string]interface{}{},
  42. "sourceid":weight.sourceid,
  43. "templateid":weight.templateid,
  44. "allids":weight.allids,
  45. "snapshot":map[string]interface{}{},
  46. },
  47. "number":qu.Int64All(1),
  48. }
  49. return dict,recordDict
  50. }
  51. //处理多条融合数据 - 多组新增类
  52. func (weight *weightDataMap) dealWithMultipleAddFusionStruct ()(map[string]interface{},map[string]interface{}){
  53. //指定模板数据dict
  54. dict :=weight.data[weight.templateid].data
  55. //最早|近发布时间
  56. dict["early_publishtime"],dict["lately_publishtime"] = weight.dealWithTimeData("publishtime")
  57. //最早|近入库时间
  58. dict["early_comeintime"],dict["lately_comeintime"] = weight.dealWithTimeData("comeintime")
  59. //所有相关联ids
  60. dict["fusion_allids"] = weight.allids
  61. //融合保存相关联ids
  62. dict["fusion_saveids"] = weight.saveids
  63. //融合模板
  64. dict["fusion_templateid"] = weight.templateid
  65. //站点,质量分
  66. dict["fusion_score"] = weight.saveLevelAndScoreRecord()
  67. //当前更新时间
  68. dict["fusion_time"] = qu.IntAll(time.Now().Unix())
  69. //融合生成时间
  70. dict["fusion_updatetime"] = qu.IntAll(time.Now().Unix())
  71. //记录所有href
  72. dict["fusion_all_hrefs"] = weight.allhrefs
  73. //当前融合源id
  74. dict["fusion_sourceid"] = weight.sourceid
  75. //采用新增id
  76. delete(dict,"_id")
  77. //发生融合的数据
  78. new_data := weight.dealWithAllFusionFieldData()
  79. for k,v:=range new_data {
  80. value:= *qu.ObjToMap(v)
  81. dict[k] = value["value"]
  82. }
  83. //日志记录
  84. recordDict := map[string]interface{}{
  85. "1":map[string]interface{}{
  86. "data":new_data,
  87. "sourceid":weight.sourceid,
  88. "templateid":weight.templateid,
  89. "allids":weight.allids,
  90. "snapshot":map[string]interface{}{},
  91. },
  92. "number":qu.Int64All(1),
  93. }
  94. //融合表记录的字段
  95. dict["fusion_fields"] = weight.saveChangeFields(new_data)
  96. //返回,更新数据,日志记录数据
  97. return dict,recordDict
  98. }
  99. //处理多条融合数据-返回融合新数据,融合更新细节数据
  100. func (weight *weightDataMap) dealWithMultipleUpdateFusionStruct (fusion string)(map[string]interface{},map[string]interface{}){
  101. //指定模板数据dict
  102. dict :=weight.data[weight.templateid].data
  103. //最早|近发布时间
  104. dict["early_publishtime"],dict["lately_publishtime"] = weight.dealWithTimeData("publishtime")
  105. //最早|近入库时间
  106. dict["early_comeintime"],dict["lately_comeintime"] = weight.dealWithTimeData("comeintime")
  107. //所有相关联ids
  108. dict["fusion_allids"] = weight.allids
  109. //融合保存相关联ids
  110. dict["fusion_saveids"] = weight.saveids
  111. //融合模板
  112. dict["fusion_templateid"] = weight.templateid
  113. //记录所有href
  114. dict["fusion_all_hrefs"] = weight.allhrefs
  115. //站点,质量分
  116. dict["fusion_score"] = weight.saveLevelAndScoreRecord()
  117. //融合生成时间-取融合表第一次融合时间
  118. dict["fusion_time"] = tmpData["fusion_time"]
  119. //当前更新时间
  120. dict["fusion_updatetime"] = qu.IntAll(time.Now().Unix())
  121. //当前融合源id
  122. dict["fusion_sourceid"] = weight.sourceid
  123. //删除_id
  124. delete(dict,"_id")
  125. //发生融合的数据
  126. new_data := weight.dealWithAllFusionFieldData()
  127. for k,v:=range new_data {
  128. value:= *qu.ObjToMap(v)
  129. dict[k] = value["value"]
  130. }
  131. //日志记录-更新
  132. recordData := mgo.FindById(record_coll_name,BsonTOStringId(tmpData["_id"]))
  133. number:=qu.Int64All(recordData["number"])
  134. number++
  135. key:=fmt.Sprintf("%d",number)
  136. recordDict := map[string]interface{}{
  137. key:map[string]interface{}{
  138. "data":new_data,
  139. "snapshot":tmpData, //快照页面... ...
  140. "sourceid":weight.sourceid,
  141. "templateid":weight.templateid,
  142. "allids":weight.allids,
  143. },
  144. "number":qu.Int64All(1),
  145. }
  146. //融合表记录的字段
  147. dict["fusion_fields"] = weight.saveChangeFields(new_data)
  148. //返回,更新数据,日志记录数据
  149. return dict,recordDict
  150. }
  151. /*字段处理方法*/
  152. func (weight *weightDataMap)dealWithAllFusionFieldData()map[string]interface{} {
  153. //模板id 数据
  154. templateid := weight.templateid
  155. templateTmp := weight.data[templateid].data
  156. modifyData := make(map[string]interface{}, 0) //返回修改的数据
  157. //前置处理 - 结构化数据 - Arr
  158. structArrData := *qu.ObjToMap(fusionAllKey["Arr"])
  159. for key,_ := range structArrData {
  160. count:=qu.IntAll(0)
  161. arr,b,isOK,arr_id:=make(primitive.A,0),false,false,templateid
  162. if arr,b = templateTmp[key].([]interface{});b {
  163. count = qu.IntAll(len(arr))
  164. }
  165. for _,cur_id:=range weight.saveids {
  166. if templateid == cur_id {
  167. continue
  168. }
  169. tmp:=weight.data[cur_id].data
  170. if arr_1,isTrue := tmp[key].(primitive.A);isTrue {
  171. count_1:=qu.IntAll(len(arr_1))
  172. if count_1 > count {
  173. count = count_1
  174. arr = arr_1
  175. isOK = true
  176. arr_id = cur_id
  177. }
  178. }
  179. }
  180. if len(arr)>0 && arr!=nil && isOK { //有改变的值
  181. modifyData[key] = map[string]interface{}{
  182. "id":arr_id,
  183. "value":arr,
  184. }
  185. }
  186. }
  187. //第一步融合模板无效值
  188. invalidKeyArr := make([]string,0) //无效
  189. for key,value:=range templateTmp {
  190. if judgeIsFusionKey(key) {
  191. if !judgeIsEffectiveData(value,key) { //存在key且无效
  192. invalidKeyArr = append(invalidKeyArr,key)
  193. }
  194. }
  195. }
  196. if invalidKeyArr!=nil && len(invalidKeyArr)>0 {
  197. for _,key:=range invalidKeyArr {
  198. isRank := 2
  199. L: for {
  200. for _,v:=range weight.saveids {
  201. if v == templateid {
  202. continue
  203. }
  204. dataInfo:=weight.data[v]
  205. if dataInfo.ranking==isRank { //找到指定排名-字段数据
  206. value:=dataInfo.data[key]
  207. if value !=nil && judgeIsEffectiveData(value,key) {
  208. templateTmp[key] = value
  209. modifyData[key] = map[string]interface{}{
  210. "id":v,
  211. "value":value,
  212. }
  213. break L
  214. }
  215. break
  216. }
  217. }
  218. isRank++
  219. if isRank > len(weight.saveids) {
  220. break L
  221. }
  222. }
  223. }
  224. }
  225. //第二步-集合最大化
  226. isRank := 2
  227. for { //不断遍历,找到其他排名数据
  228. for _,v:=range weight.saveids {
  229. if v == templateid {
  230. continue
  231. }
  232. dataInfo:=weight.data[v]
  233. if dataInfo.ranking==isRank { //找到指定排名数据
  234. for key,newValue:=range dataInfo.data{
  235. if key!="_id" && judgeIsFusionKey(key) && templateTmp[key]==nil {
  236. if judgeIsEffectiveData(newValue,key) {
  237. templateTmp[key] = newValue
  238. modifyData[key] = map[string]interface{}{
  239. "id":v,
  240. "value":newValue,
  241. }
  242. }
  243. }
  244. }
  245. break
  246. }
  247. }
  248. isRank++
  249. if isRank > len(weight.saveids) {
  250. break
  251. }
  252. }
  253. return modifyData
  254. }
  255. /*
  256. 以下方法-记录统计
  257. ******************************
  258. ******************************
  259. */
  260. func (weight *weightDataMap) saveLevelAndScoreRecord () map[string]interface{}{
  261. dict := make(map[string]interface{},0)
  262. saveids:= weight.saveids
  263. for _,v:=range saveids{
  264. dict[v] = map[string]interface{}{
  265. "score":weight.data[v].qualityScore,
  266. "level":weight.data[v].siteLevel,
  267. }
  268. }
  269. return dict
  270. }
  271. //处理-融合的哪些字段记录
  272. func (weight *weightDataMap)saveChangeFields(data map[string]interface{}) map[string]interface{} {
  273. fieldCal := make(map[string]interface{},0)
  274. for k,v:=range data{
  275. if k=="attach_text" {
  276. if attachArr,b := v.([]map[string]interface{});b {
  277. for _,v1:=range attachArr {
  278. dict := *qu.ObjToMap(v1)
  279. tmp_id := qu.ObjToString(dict["id"])
  280. if fieldCal[tmp_id]==nil {
  281. href:=qu.ObjToString(weight.data[tmp_id].data["href"])
  282. fieldCal[tmp_id] = []interface{}{href,k}
  283. }else {
  284. arr := fieldCal[tmp_id].([]interface{})
  285. arr = append(arr,k)
  286. fieldCal[tmp_id] = arr
  287. }
  288. }
  289. }
  290. }else {
  291. dict := *qu.ObjToMap(v)
  292. tmp_id := qu.ObjToString(dict["id"])
  293. if fieldCal[tmp_id]==nil {
  294. href:=qu.ObjToString(weight.data[tmp_id].data["href"])
  295. fieldCal[tmp_id] = []interface{}{href,k}
  296. }else {
  297. arr := fieldCal[tmp_id].([]interface{})
  298. arr = append(arr,k)
  299. fieldCal[tmp_id] = arr
  300. }
  301. }
  302. }
  303. return fieldCal
  304. }