diff --git a/services/ap/implments/CustDemandVerHead.service.impl.go b/services/ap/implments/CustDemandVerHead.service.impl.go index f5969c8..11ebd1c 100644 --- a/services/ap/implments/CustDemandVerHead.service.impl.go +++ b/services/ap/implments/CustDemandVerHead.service.impl.go @@ -1268,7 +1268,7 @@ func (impl *CustDemandVerHeadServiceImplement) DeviationAnalysis(user *global.Us custDao := basedal.NewCustomerDAO(session, user.PlantNr, user.UserId) result := new(model.CustomerDeviation) data := make([]model.CustomerDeviationDetailItem, 0) - perData := make([]model.PerCustomerDeviationDetailItem, 0) + perData := model.PerCustomerDeviationDetailItem{} var versionIds []string if len(versionId) > 0 { versionIds = strings.Split(strings.TrimSpace(versionId), ",") @@ -1318,94 +1318,185 @@ func (impl *CustDemandVerHeadServiceImplement) DeviationAnalysis(user *global.Us key := v.CustomerId + "_" + v.VersionId mapDetailData[key] = append(mapDetailData[key], v) } - //第二步: 查询对应的需求数量,如果长度不够,用0补齐 - for k, details := range mapDetailData { - temLen := 0 - var allWeeks []string - var temDemandDate time.Time - info := strings.Split(k, "_") - one := model.CustomerDeviationDetailItem{} - one.CustomerId = info[0] - one.VersionId = info[1] - one.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit - one.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit + if len(versionIds) == 1 && searchType == "seq" { + //第二步: 查询对应的需求数量,如果长度不够,用0补齐 + for k, details := range mapDetailData { + temLen := 0 + var allWeeks []string + var temDemandDate time.Time + info := strings.Split(k, "_") + one := model.CustomerDeviationDetailItem{} + one.CustomerId = info[0] + one.VersionId = info[1] + one.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit + one.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit - perOne := model.PerCustomerDeviationDetailItem{} - perOne.CustomerId = info[0] - perOne.VersionId = info[1] - perOne.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit - perOne.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit + perOne := model.PerCustomerDeviationDetailItem{} + perOne.CustomerId = info[0] + perOne.VersionId = info[1] + perOne.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit + perOne.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit - mapWeeks := make(map[string]int) - for _, vv := range details { - if temLen > lenData { - continue + mapWeeks := make(map[string]int) + for _, vv := range details { + if temLen > lenData { + continue + } + key := utils.ValueToString(vv.DemandYear, "") + "." + utils.ValueToString(vv.DemandWeek, "") + val, ok := mapWeeks[key] + if !ok { + temLen++ + mapWeeks[key] = utils.ValueToInt(vv.DemandQty, 0) + allWeeks = append(allWeeks, key) + } else { + mapWeeks[key] = val + utils.ValueToInt(vv.DemandQty, 0) + } + weekDate, err := time.Parse("2006-01-02", vv.DemandDate.ToString()) + if err != nil { + return nil, err + } + temDemandDate = weekDate } - key := utils.ValueToString(vv.DemandYear, "") + "." + utils.ValueToString(vv.DemandWeek, "") - val, ok := mapWeeks[key] - if !ok { - temLen++ - mapWeeks[key] = utils.ValueToInt(vv.DemandQty, 0) - allWeeks = append(allWeeks, key) - } else { - mapWeeks[key] = val + utils.ValueToInt(vv.DemandQty, 0) + + //不足的周,用空位补齐 + lenInfo := lenData - temLen + if lenInfo > 0 { + for k := 0; k < lenInfo; k++ { + weekDate := temDemandDate.AddDate(0, 0, 7*(k+1)) + year, _, _ := weekDate.Date() + week := utils.WeekByDate(weekDate) + key := utils.ValueToString(year, "") + "." + utils.ValueToString(week, "") + allWeeks = append(allWeeks, key) + } } - weekDate, err := time.Parse("2006-01-02", vv.DemandDate.ToString()) - if err != nil { - return nil, err + pevNum := 0 + items := make(map[string]int, 0) + peritems := make(map[string]float64, 0) + //排序 + sort.Strings(allWeeks) + for kkk, vvv := range allWeeks { + key := vvv + val, ok := mapWeeks[key] + if ok { + if kkk == 0 { + pevNum = val + } + items[key] = val + if pevNum == 0 { + peritems[key] = 0 + } else { + num := (float64(val) - float64(pevNum)) / float64(pevNum) + peritems[key] = utils.Decimal(num*100, 2) + } + pevNum = val + } else { + items[key] = 0 + peritems[key] = 0 + pevNum = 0 + } } - temDemandDate = weekDate + one.Item = items + one.SortKeys = allWeeks + data = append(data, one) + perOne.Item = peritems + perOne.SortKeys = allWeeks + perData = perOne + } + } else { + if len(versionIds) != 2 { + return result, errors.New("请选择两个版本比较!") } + //第二步: 查询对应的需求数量,如果长度不够,用0补齐 + for k, details := range mapDetailData { + temLen := 0 + var allWeeks []string + var temDemandDate time.Time + info := strings.Split(k, "_") + one := model.CustomerDeviationDetailItem{} + one.CustomerId = info[0] + one.VersionId = info[1] + one.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit + one.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit - //不足的周,用空位补齐 - lenInfo := lenData - temLen - if lenInfo > 0 { - for k := 0; k < lenInfo; k++ { - weekDate := temDemandDate.AddDate(0, 0, 7*(k+1)) - year, _, _ := weekDate.Date() - week := utils.WeekByDate(weekDate) - key := utils.ValueToString(year, "") + "." + utils.ValueToString(week, "") - allWeeks = append(allWeeks, key) + mapWeeks := make(map[string]int) + for _, vv := range details { + if temLen > lenData { + continue + } + key := utils.ValueToString(vv.DemandYear, "") + "." + utils.ValueToString(vv.DemandWeek, "") + val, ok := mapWeeks[key] + if !ok { + temLen++ + mapWeeks[key] = utils.ValueToInt(vv.DemandQty, 0) + allWeeks = append(allWeeks, key) + } else { + mapWeeks[key] = val + utils.ValueToInt(vv.DemandQty, 0) + } + weekDate, err := time.Parse("2006-01-02", vv.DemandDate.ToString()) + if err != nil { + return nil, err + } + temDemandDate = weekDate } - } - pevNum := 0 - items := make(map[string]int, 0) - peritems := make(map[string]float64, 0) - //排序 - sort.Strings(allWeeks) - for kkk, vvv := range allWeeks { - key := vvv - val, ok := mapWeeks[key] - if ok { - if kkk == 0 { - pevNum = val + + //不足的周,用空位补齐 + lenInfo := lenData - temLen + if lenInfo > 0 { + for k := 0; k < lenInfo; k++ { + weekDate := temDemandDate.AddDate(0, 0, 7*(k+1)) + year, _, _ := weekDate.Date() + week := utils.WeekByDate(weekDate) + key := utils.ValueToString(year, "") + "." + utils.ValueToString(week, "") + allWeeks = append(allWeeks, key) } - items[key] = val - if pevNum == 0 { - peritems[key] = 0 + } + items := make(map[string]int, 0) + //排序 + sort.Strings(allWeeks) + for _, vvv := range allWeeks { + key := vvv + val, ok := mapWeeks[key] + if ok { + items[key] = val } else { - num := (float64(val)-float64(pevNum)) / float64(pevNum) - peritems[key] = utils.Decimal(num*100, 2) + items[key] = 0 } - pevNum = val + } + one.Item = items + one.SortKeys = allWeeks + data = append(data, one) + } + perData.SortKeys = data[0].SortKeys + perData.PeriodOverPeriodLowerLimit = data[0].PeriodOverPeriodLowerLimit + perData.PeriodOnPeriodUpperLimit = data[0].PeriodOnPeriodUpperLimit + + itemMap1 := data[0].Item + itemMap2 := data[1].Item + ItemMap := make(map[string]float64) + for _, vvvv := range perData.SortKeys { + key := vvvv + val1, ok1 := itemMap1[key] + + val2, ok2 := itemMap2[key] + if !ok1 || !ok2 { + ItemMap[key] = 0 + } + if val1 == 0 { + ItemMap[key] = 0 } else { - items[key] = 0 - peritems[key] = 0 - pevNum = 0 + num := (float64(val2) - float64(val1)) / float64(val1) + ItemMap[key] = utils.Decimal(num*100, 2) } } - one.Item = items - one.SortKeys = allWeeks - data = append(data, one) - perOne.Item = peritems - perOne.SortKeys = allWeeks - perData = append(perData, perOne) + perData.Item = ItemMap } + result.CustomerDeviationDetailItem = data - result.PerCustomerDeviationDetailItem = perData + result.PerCustomerDeviationDetailItem = append(result.PerCustomerDeviationDetailItem,perData) return result, nil } + /****************************************************************************** * * @Reference leit.com/LAPP_CHEERSSON_BACKEND/services/ap/CustDemandVerHeadService.CompareVersionInfoByArtcle