Browse Source

feat:并发优化1

wangshan 1 năm trước cách đây
mục cha
commit
4d95360a1d
1 tập tin đã thay đổi với 144 bổ sung31 xóa
  1. 144 31
      internal/dao/internal/userTask.go

+ 144 - 31
internal/dao/internal/userTask.go

@@ -36,7 +36,6 @@ type UserTask struct {
 	MonthDistributionKey []entity.DateSpan            //月度分配key
 	YearDistributionKey  []entity.DateSpan            //年度分配key
 	JudgmentMap          map[string]bool              //地区分布|城市分布|客户 项目规模  地区top3|订阅分类|一个就行
-	CalculateChan        chan bool
 	CalculateWG          sync.WaitGroup
 }
 
@@ -56,6 +55,7 @@ func NewUserInfo() *UserTask {
 		Ticker:        time.NewTicker(time.Duration(10000) * time.Second),
 		Result:        &CalculateResult{},
 		JudgmentMap:   make(map[string]bool),
+		CalculateWG:   sync.WaitGroup{},
 	}
 }
 
@@ -269,7 +269,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 				scale.MonthDistribution.ProjectCount = append(scale.MonthDistribution.ProjectCount, eDCount)
 			}
 		}
-		//度分配
+		//度分配
 		if len(ut.YearDistributionKey) > 0 {
 			for ydk, ydv := range ut.YearDistributionKey {
 				eDAmount := entity.Distribution{} //金额
@@ -290,10 +290,12 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 			}
 		}
 	}
-	scaleFunc()
 	//项目规模TOP10 集合
 	topProject := ut.Result.TopProject
 	var topProjectFunc = func() {
+		defer func() {
+			ut.CalculateWG.Done()
+		}()
 		if utility.DateIsIn(ut.StartTime, ut.EndTime, pt.JgTime, 0) && pt.Sortprice > 0 {
 			var (
 				entIdList = pt.Entidlist
@@ -314,6 +316,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 				WinnerS:     strings.Split(pt.Winners, ","),
 			})
 		}
+		/*-------------排序----------------*/
 		if len(topProject.ProjectTop10) > 1 {
 			sort.Slice(topProject.ProjectTop10, func(i, j int) bool {
 				return topProject.ProjectTop10[i].Sortprice > topProject.ProjectTop10[j].Sortprice // 根据 price 字段进行倒序排序
@@ -323,10 +326,12 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 			}
 		}
 	}
-	topProjectFunc()
 	///* 项目规模 地区分布 客户分布 地区客户top3*/
 	pad := ut.Result.ProjectAllData
 	var projectAllFunc = func() {
+		defer func() {
+			ut.CalculateWG.Done()
+		}()
 		//地区分布
 		var areaInfoFunc = func() {
 			areaInfoKey := utility.GetJudgmentPrevKey(consts.JudgmentPrev1, pt.Area)
@@ -361,6 +366,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 								if ci.City == pt.City {
 									ci.Amount += pt.Sortprice
 									ci.Total += 1
+									break
 								}
 							}
 						}
@@ -404,6 +410,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							if csm.Buyclass == bc {
 								csm.Amount += pt.Sortprice
 								csm.Total += 1
+								break
 							}
 						}
 					}
@@ -432,11 +439,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							sbct.BuyclassCount += 1
 							sbct.BuyclassScale = utility.Formula(float64(sbct.BuyclassCount), float64(scale.MarketProfile.ProjectCount))
 							if len(sbct.Winner) > 0 {
-								var wnMap = map[string]int{}
+								var (
+									wnMap     = map[string]int{}
+									winners   = strings.Split(pt.Winners, ",")
+									winnerNum int
+								)
 								for wi, wn := range sbct.Winner {
-									wnMap[wn.Winner] = wi + 1
+									if strings.Contains(pt.Winners, wn.Winner) {
+										winnerNum++
+										wnMap[wn.Winner] = wi + 1
+									}
+									if winnerNum == len(winners) {
+										break
+									}
 								}
-								for wk, wd := range strings.Split(pt.Winners, ",") {
+								for wk, wd := range winners {
 									if wnMap[wd] > 0 {
 										sbct.Winner[wnMap[wd]-1].WinnerTotal += 1
 									} else {
@@ -450,6 +467,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							} else {
 								sbct.Winner = utility.GetWinnerInfoOfCount(pt)
 							}
+							/*-------------排序----------------*/
 							if len(sbct.Winner) > 1 {
 								sort.Slice(sbct.Winner, func(i, j int) bool {
 									return sbct.Winner[i].WinnerTotal > sbct.Winner[j].WinnerTotal
@@ -460,6 +478,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							}
 						}
 					}
+					/*-------------排序----------------*/
 					if len(pad.ScaleBuyclassCountTop) > 1 {
 						sort.Slice(pad.ScaleBuyclassCountTop, func(i, j int) bool {
 							return pad.ScaleBuyclassCountTop[i].BuyclassCount > pad.ScaleBuyclassCountTop[j].BuyclassCount
@@ -474,11 +493,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							sbat.BuyclassAmount += pt.Sortprice
 							sbat.BuyclassScale = utility.Formula(sbat.BuyclassAmount, float64(scale.MarketProfile.ProjectCount))
 							if len(sbat.Winner) > 0 {
-								var wnMap = map[string]int{}
+								var (
+									wnMap     = map[string]int{}
+									winners   = strings.Split(pt.Winners, ",")
+									winnerNum int
+								)
 								for wi, wn := range sbat.Winner {
-									wnMap[wn.Winner] = wi + 1
+									if strings.Contains(pt.Winners, wn.Winner) {
+										winnerNum++
+										wnMap[wn.Winner] = wi + 1
+									}
+									if winnerNum == len(winners) {
+										break
+									}
 								}
-								for wk, wd := range strings.Split(pt.Winners, ",") {
+								for wk, wd := range winners {
 									if wnMap[wd] > 0 {
 										sbat.Winner[wnMap[wd]-1].WinnerAmount += pt.Sortprice
 									} else {
@@ -492,6 +521,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							} else {
 								sbat.Winner = utility.GetWinnerInfoOfAmount(pt)
 							}
+							/*-------------排序----------------*/
 							if len(sbat.Winner) > 1 {
 								sort.Slice(sbat.Winner, func(i, j int) bool {
 									return sbat.Winner[i].WinnerAmount > sbat.Winner[j].WinnerAmount
@@ -502,6 +532,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							}
 						}
 					}
+					/*-------------排序----------------*/
 					if len(pad.ScaleBuyclassCountTop) > 1 {
 						sort.Slice(pad.ScaleBuyclassCountTop, func(i, j int) bool {
 							return pad.ScaleBuyclassCountTop[i].BuyclassCount > pad.ScaleBuyclassCountTop[j].BuyclassCount
@@ -573,11 +604,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						saat.AreaAmount += pt.Sortprice
 						saat.AreaScale = utility.Formula(saat.AreaAmount, scale.MarketProfile.Projctamout)
 						if len(saat.Winner) > 0 {
-							var wnMap = map[string]int{}
+							var (
+								wnMap     = map[string]int{}
+								winners   = strings.Split(pt.Winners, ",")
+								winnerNum int
+							)
 							for wi, wn := range saat.Winner {
-								wnMap[wn.Winner] = wi + 1
+								if strings.Contains(pt.Winners, wn.Winner) {
+									winnerNum++
+									wnMap[wn.Winner] = wi + 1
+								}
+								if winnerNum == len(winners) {
+									break
+								}
 							}
-							for wk, wd := range strings.Split(pt.Winners, ",") {
+							for wk, wd := range winners {
 								if wnMap[wd] > 0 {
 									saat.Winner[wnMap[wd]-1].WinnerAmount += pt.Sortprice
 								} else {
@@ -591,6 +632,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						} else {
 							saat.Winner = utility.GetWinnerInfoOfAmount(pt)
 						}
+						/*-------------排序----------------*/
 						if len(saat.Winner) > 1 {
 							sort.Slice(saat.Winner, func(i, j int) bool {
 								return saat.Winner[i].WinnerAmount > saat.Winner[j].WinnerAmount
@@ -601,6 +643,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						}
 					}
 				}
+				/*-------------排序----------------*/
 				if len(pad.ScaleAreaAmountTop) > 1 {
 					sort.Slice(pad.ScaleAreaAmountTop, func(i, j int) bool {
 						return pad.ScaleAreaAmountTop[i].AreaAmount > pad.ScaleAreaAmountTop[j].AreaAmount
@@ -615,11 +658,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						sact.AreaCount += 1
 						sact.AreaScale = utility.Formula(float64(sact.AreaCount), scale.MarketProfile.Projctamout)
 						if len(sact.Winner) > 0 {
-							var wnMap = map[string]int{}
+							var (
+								wnMap     = map[string]int{}
+								winners   = strings.Split(pt.Winners, ",")
+								winnerNum int
+							)
 							for wi, wn := range sact.Winner {
-								wnMap[wn.Winner] = wi + 1
+								if strings.Contains(pt.Winners, wn.Winner) {
+									winnerNum++
+									wnMap[wn.Winner] = wi + 1
+								}
+								if winnerNum == len(winners) {
+									break
+								}
 							}
-							for wk, wd := range strings.Split(pt.Winners, ",") {
+							for wk, wd := range winners {
 								if wnMap[wd] > 0 {
 									sact.Winner[wnMap[wd]-1].WinnerTotal += 1
 								} else {
@@ -633,6 +686,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						} else {
 							sact.Winner = utility.GetWinnerInfoOfCount(pt)
 						}
+						/*-------------排序----------------*/
 						if len(sact.Winner) > 1 {
 							sort.Slice(sact.Winner, func(i, j int) bool {
 								return sact.Winner[i].WinnerTotal > sact.Winner[j].WinnerTotal
@@ -643,6 +697,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						}
 					}
 				}
+				/*-------------排序----------------*/
 				if len(pad.ScaleAreaCountTop) > 1 {
 					sort.Slice(pad.ScaleAreaCountTop, func(i, j int) bool {
 						return pad.ScaleAreaCountTop[i].AreaCount > pad.ScaleAreaCountTop[j].AreaCount
@@ -656,10 +711,12 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 		scaleAreaAmountAndCountTopFunc()
 		//
 	}
-	projectAllFunc()
 	//细化市场
 	sr := ut.Result.ScaleRefine
 	var scaleRefineFunc = func() {
+		defer func() {
+			ut.CalculateWG.Done()
+		}()
 		//订阅分类|重点中标单位-项目数量|重点中标单位-项目金额
 		var scaleRefineAllAndAmountAndTotalFunc = func() {
 			for _, keysItems := range ut.FormatParam.KeysItems {
@@ -694,6 +751,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 							if sra.Name == itemName {
 								sra.Total += 1
 								sra.Amount += pt.Sortprice
+								break
 							}
 						}
 						//重点中标单位-项目数量
@@ -702,11 +760,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 								srtt.Value += 1
 								srtt.Prop = utility.Formula(float64(srtt.Value), float64(scale.MarketProfile.ProjectCount))
 								if len(srtt.TopList) > 0 {
-									var wnMap = map[string]int{}
+									var (
+										wnMap     = map[string]int{}
+										winners   = strings.Split(pt.Winners, ",")
+										winnerNum int
+									)
 									for wi, wn := range srtt.TopList {
-										wnMap[wn.Name] = wi + 1
+										if strings.Contains(pt.Winners, wn.Name) {
+											winnerNum++
+											wnMap[wn.Name] = wi + 1
+										}
+										if winnerNum == len(winners) {
+											break
+										}
 									}
-									for wk, wd := range strings.Split(pt.Winners, ",") {
+									for wk, wd := range winners {
 										if wnMap[wd] > 0 {
 											srtt.TopList[wnMap[wd]-1].Value += 1
 											srtt.TopList[wnMap[wd]-1].Prop = utility.Formula(srtt.TopList[wnMap[wd]-1].Value, float64(scale.MarketProfile.ProjectCount))
@@ -722,6 +790,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 								} else {
 									srtt.TopList = utility.GetWinnerInfoTopList(pt, 1, float64(scale.MarketProfile.ProjectCount))
 								}
+								/*-------------排序----------------*/
 								if len(srtt.TopList) > 1 {
 									sort.Slice(srtt.TopList, func(i, j int) bool {
 										return srtt.TopList[i].Value > srtt.TopList[j].Value
@@ -738,11 +807,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 								srat.Value += pt.Sortprice
 								srat.Prop = utility.Formula(srat.Value, float64(scale.MarketProfile.ProjectCount))
 								if len(srat.TopList) > 0 {
-									var wnMap = map[string]int{}
+									var (
+										wnMap     = map[string]int{}
+										winners   = strings.Split(pt.Winners, ",")
+										winnerNum int
+									)
 									for wi, wn := range srat.TopList {
-										wnMap[wn.Name] = wi + 1
+										if strings.Contains(pt.Winners, wn.Name) {
+											winnerNum++
+											wnMap[wn.Name] = wi + 1
+										}
+										if winnerNum == len(winners) {
+											break
+										}
 									}
-									for wk, wd := range strings.Split(pt.Winners, ",") {
+									for wk, wd := range winners {
 										if wnMap[wd] > 0 {
 											srat.TopList[wnMap[wd]-1].Value += pt.Sortprice
 											srat.TopList[wnMap[wd]-1].Prop = utility.Formula(srat.TopList[wnMap[wd]-1].Value, float64(scale.MarketProfile.ProjectCount))
@@ -758,6 +837,7 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 								} else {
 									srat.TopList = utility.GetWinnerInfoTopList(pt, pt.Sortprice, float64(scale.MarketProfile.ProjectCount))
 								}
+								/*-------------排序----------------*/
 								if len(srat.TopList) > 1 {
 									sort.Slice(srat.TopList, func(i, j int) bool {
 										return srat.TopList[i].Value > srat.TopList[j].Value
@@ -775,10 +855,12 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 		}
 		scaleRefineAllAndAmountAndTotalFunc()
 	}
-	scaleRefineFunc()
 	///* 市场-采购单位&&中标企业*/
 	baw := ut.Result.BuyerAndWinner
 	var buyerAndWinnerFunc = func() {
+		defer func() {
+			ut.CalculateWG.Done()
+		}()
 		//采购单位
 		var buyerAmountAndTotalTop30 = func() {
 			baaattKey := utility.GetJudgmentPrevKey(consts.JudgmentPrev7, pt.Buyer)
@@ -804,11 +886,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						if len(bct.Winnertop3) == 0 {
 							bct.Winnertop3 = utility.GetWinnerInfoOfBuyerCount(pt)
 						} else {
-							var wnMap = map[string]int{}
+							var (
+								wnMap     = map[string]int{}
+								winners   = strings.Split(pt.Winners, ",")
+								winnerNum int
+							)
 							for wi, wn := range bct.Winnertop3 {
-								wnMap[wn.Name] = wi + 1
+								if strings.Contains(pt.Winners, wn.Name) {
+									winnerNum++
+									wnMap[wn.Name] = wi + 1
+								}
+								if winnerNum == len(winners) {
+									break
+								}
 							}
-							for wk, wd := range strings.Split(pt.Winners, ",") {
+							for wk, wd := range winners {
 								if wnMap[wd] > 0 {
 									bct.Winnertop3[wnMap[wd]-1].Number += 1
 								} else {
@@ -830,11 +922,21 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 						if len(bat.Winnertop3) == 0 {
 							bat.Winnertop3 = utility.GetWinnerInfoOfBuyerAmount(pt)
 						} else {
-							var wnMap = map[string]int{}
+							var (
+								wnMap     = map[string]int{}
+								winners   = strings.Split(pt.Winners, ",")
+								winnerNum int
+							)
 							for wi, wn := range bat.Winnertop3 {
-								wnMap[wn.Name] = wi + 1
+								if strings.Contains(pt.Winners, wn.Name) {
+									winnerNum++
+									wnMap[wn.Name] = wi + 1
+								}
+								if winnerNum == len(winners) {
+									break
+								}
 							}
-							for wk, wd := range strings.Split(pt.Winners, ",") {
+							for wk, wd := range winners {
 								if wnMap[wd] > 0 {
 									bat.Winnertop3[wnMap[wd]-1].Amount += pt.Sortprice
 								} else {
@@ -987,7 +1089,18 @@ func (ut *UserTask) Calculate(pt *entity.ProjectInfo) {
 			winnerAmountAndTotalTop30()
 		}
 	}
-	buyerAndWinnerFunc()
+	//
+	var nextFunc = func() {
+		ut.CalculateWG.Add(4)
+		go topProjectFunc()
+		go projectAllFunc()
+		go scaleRefineFunc()
+		go buyerAndWinnerFunc()
+		ut.CalculateWG.Wait()
+	}
+	scaleFunc()
+	nextFunc()
+
 }
 
 // ResultSave  结果保存