|
|
@ -2037,3 +2037,256 @@ func (impl *CustDemandVerHeadServiceImplement) ExportCompareVersionInfoByArtcle( |
|
|
|
err = file.Save(excelfile) |
|
|
|
return filename, nil |
|
|
|
} |
|
|
|
|
|
|
|
/****************************************************************************** |
|
|
|
* |
|
|
|
* @Reference leit.com/LAPP_CHEERSSON_BACKEND/services/ap/CustDemandVerHeadService.ImportDeviationAnalysis |
|
|
|
* |
|
|
|
******************************************************************************/ |
|
|
|
func (impl *CustDemandVerHeadServiceImplement) ImportDeviationAnalysis(user *global.User, searchType string, customerId string, versionId string) (*model.CustomerDeviation, error) { |
|
|
|
|
|
|
|
grmi.Log(user, "/services/ap/implments/CustDemandVerHead.service.impl.go", "CompareVersion", "多版本比较") |
|
|
|
|
|
|
|
engine := db.Eloquent.Master() |
|
|
|
session := engine.NewSession() |
|
|
|
defer session.Close() |
|
|
|
detailDao := dal.NewCustDemandVerDetailDAO(session, user.PlantNr, user.UserId) |
|
|
|
custDao := basedal.NewCustomerDAO(session, user.PlantNr, user.UserId) |
|
|
|
artListDao := dal.NewCustArtlstDAO(session, user.PlantNr, user.UserId) |
|
|
|
result := new(model.CustomerDeviation) |
|
|
|
data := make([]model.CustomerDeviationDetailItem, 0) |
|
|
|
perData := model.PerCustomerDeviationDetailItem{} |
|
|
|
var versionIds []string |
|
|
|
if len(versionId) > 0 { |
|
|
|
versionIds = strings.Split(strings.TrimSpace(versionId), ",") |
|
|
|
} |
|
|
|
if len(versionIds) == 0 { |
|
|
|
return nil, grmi.NewBusinessError("版本不存在!") |
|
|
|
} |
|
|
|
|
|
|
|
mDao := dal.NewCustDemandModelDAO(session, user.PlantNr, user.UserId) |
|
|
|
tolDao := dal.NewDemandToleranceModelDAO(session, user.PlantNr, user.UserId) |
|
|
|
record, err := custDao.SelectOne(customerId) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
if record == nil { |
|
|
|
return nil, grmi.NewBusinessError("不存在指定记录!") |
|
|
|
} |
|
|
|
//第一步:查询对应的模型
|
|
|
|
mInfo, err := mDao.SelectOne(record.DemandModelId) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
//查询变差类型
|
|
|
|
tInfo, err := tolDao.SelectOneByCustomerId(record.CustomerId) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
if tInfo == nil { |
|
|
|
return nil, grmi.NewBusinessError("偏差模型不能为空!") |
|
|
|
} |
|
|
|
//数据长度:保存多少周的数据
|
|
|
|
lenData := mInfo.DemandWeeks |
|
|
|
//第一步:根据时间模型,计算当前周的起始位置
|
|
|
|
//计算当天是周几,
|
|
|
|
year, month, day := time.Now().Date() |
|
|
|
firstWeek := utils.ZellerFunction2Week(uint16(year), uint16(month), uint16(day)) |
|
|
|
dayLen := mInfo.WeekDemandDay - firstWeek |
|
|
|
nowDate := utils.TimeFormat(time.Now().AddDate(0, 0, dayLen), "yyyy-MM-dd") |
|
|
|
|
|
|
|
//查询客户对应的物料主数据
|
|
|
|
artIds, err := artListDao.Select([]grmi.Predicate{meta.CustArtlst_CustomerId.NewPredicate(grmi.Equal, customerId)}, nil) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
for _, info := range artIds { |
|
|
|
detailData, err := detailDao.SelectDeviation(customerId, versionIds, info.ArtId, nowDate) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
//第二步:按照条件收索,构建数组
|
|
|
|
mapDetailData := make(map[string][]model.CustDemandVerDetail) |
|
|
|
//1.先按版本分类
|
|
|
|
for _, v := range detailData { |
|
|
|
key := v.CustomerId + "_" + v.VersionId |
|
|
|
mapDetailData[key] = append(mapDetailData[key], v) |
|
|
|
} |
|
|
|
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 |
|
|
|
|
|
|
|
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 |
|
|
|
} |
|
|
|
|
|
|
|
//不足的周,用空位补齐
|
|
|
|
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) |
|
|
|
} |
|
|
|
} |
|
|
|
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 |
|
|
|
} |
|
|
|
} |
|
|
|
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 |
|
|
|
|
|
|
|
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 |
|
|
|
} |
|
|
|
|
|
|
|
//不足的周,用空位补齐
|
|
|
|
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 := make(map[string]int, 0) |
|
|
|
//排序
|
|
|
|
sort.Strings(allWeeks) |
|
|
|
for _, vvv := range allWeeks { |
|
|
|
key := vvv |
|
|
|
val, ok := mapWeeks[key] |
|
|
|
if ok { |
|
|
|
items[key] = val |
|
|
|
} else { |
|
|
|
items[key] = 0 |
|
|
|
} |
|
|
|
} |
|
|
|
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 { |
|
|
|
num := (float64(val2) - float64(val1)) / float64(val1) |
|
|
|
ItemMap[key] = utils.Decimal(num*100, 2) |
|
|
|
} |
|
|
|
} |
|
|
|
perData.Item = ItemMap |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
result.CustomerDeviationDetailItem = data |
|
|
|
result.PerCustomerDeviationDetailItem = append(result.PerCustomerDeviationDetailItem, perData) |
|
|
|
return result, nil |
|
|
|
} |