|
|
@ -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 |
|
|
|