|
@@ -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 结果保存
|