|
|
@ -3725,10 +3725,11 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("读取Sheet1页失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
today, _ := time.ParseInLocation(grmi.DateTimeOutFormat, time.Now().Format(grmi.DateOutFormat) + " 00:00:00", utils.TimezoneLocation) |
|
|
|
rowIndex := 0 |
|
|
|
projectMap := make(map[string]*meModel.Project) |
|
|
|
productFamilyMap := make(map[string]*meModel.ProductFamily) |
|
|
|
custOrderLi := make([]model.CustOrder, 0) |
|
|
|
planDateCustOrderMap := make(map[string][]model.CustOrder, 0) |
|
|
|
for rowsIterator.Next() { |
|
|
|
rowIndex++ |
|
|
|
// 第一行标题行
|
|
|
@ -3744,7 +3745,7 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("去读excel行数据失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
if len(row) != 3 { |
|
|
|
if len(row) != 4 { |
|
|
|
return grmi.NewBusinessError("excel数据列数不合规, 行数:" + strconv.Itoa(rowIndex)) |
|
|
|
} |
|
|
|
productFamilyId := row[0] |
|
|
@ -3756,6 +3757,14 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, |
|
|
|
if qty == 0 { |
|
|
|
return grmi.NewBusinessError("需求数量为0, 行数:" + strconv.Itoa(rowIndex)) |
|
|
|
} |
|
|
|
planDateStr := row[3] |
|
|
|
planDate, err := time.ParseInLocation(grmi.DateOutFormat, planDateStr, utils.TimezoneLocation) |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("解析计划日期失败, 行数:" + strconv.Itoa(rowIndex)) |
|
|
|
} |
|
|
|
if planDate.Before(today) { |
|
|
|
return grmi.NewBusinessError("计划日期不能早于今天") |
|
|
|
} |
|
|
|
productFamily, exist := productFamilyMap[productFamilyId] |
|
|
|
if !exist { |
|
|
|
productFamily, err = productFamilyDao.SelectOne(productFamilyId) |
|
|
@ -3791,35 +3800,128 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, |
|
|
|
PlanQty: qty, |
|
|
|
WorkLineId: productFamily.WorkLineId, |
|
|
|
QuantityPerHour: int(productFamily.Jph), |
|
|
|
PlanStartDate: grmi.Date(planDate), |
|
|
|
PlanEndDate: grmi.Date(planDate), |
|
|
|
} |
|
|
|
planDateCustOrderMap[planDate.Format(grmi.DateOutFormat)] = append(planDateCustOrderMap[planDate.Format(grmi.DateOutFormat)], custOrder) |
|
|
|
} |
|
|
|
// 计算计划时间
|
|
|
|
// 如果根据所有的jph当天时间够用 根据jph进行分配时间 如果不够根据数量占用所有时间
|
|
|
|
// 查询当天是否有计划客户订单
|
|
|
|
for planDate, custOrderLi := range planDateCustOrderMap { |
|
|
|
dayStartTime := planDate + " 00:00:00" |
|
|
|
dayEndTime := planDate + " 23:59:59" |
|
|
|
existCustOrderLi, err := custOrderDao.SelectCrossDayCustOrder(dayEndTime) |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("查询已存在的客户订单数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
if len(existCustOrderLi) != 0 { |
|
|
|
return grmi.NewBusinessError("计划日期中存在跨天的客户订单,无法计划客户订单, 日期:" + planDate) |
|
|
|
} |
|
|
|
existCustOrderLi, err = custOrderDao.SelectCurrentDayCustOrder(dayStartTime, dayEndTime) |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("查询已存在的客户订单数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
var startPlanTime time.Time |
|
|
|
// 如果当天没有客户订单 使用的开始时间从0点开始
|
|
|
|
if len(existCustOrderLi) == 0 { |
|
|
|
startPlanTime, _ = time.ParseInLocation(grmi.DateTimeOutFormat, dayStartTime, utils.TimezoneLocation) |
|
|
|
} else { |
|
|
|
startPlanTime = existCustOrderLi[0].PlanEndTime.Restore() |
|
|
|
} |
|
|
|
if startPlanTime.Before(time.Now()) { |
|
|
|
startPlanTime = time.Now() |
|
|
|
} |
|
|
|
// 按照jph计算当时的时间
|
|
|
|
useTimeMap := make(map[int]int) |
|
|
|
var allUsedSeconds int |
|
|
|
var allQty int |
|
|
|
for index, custOrder := range custOrderLi { |
|
|
|
jph := productFamilyMap[custOrder.ProductFamilyId].Jph |
|
|
|
planQty := custOrder.PlanQty |
|
|
|
useSeconds := 3600 / int(jph) * planQty |
|
|
|
useTimeMap[index] = useSeconds |
|
|
|
allUsedSeconds += useSeconds |
|
|
|
allQty += custOrder.PlanQty |
|
|
|
} |
|
|
|
endPlanTme := startPlanTime.Add(time.Second * time.Duration(allUsedSeconds)) |
|
|
|
// 如果计算结束时间大于当天则时间剩余时间分配 如果没有大于当天则时间计划时间
|
|
|
|
endDayTime, _ := time.ParseInLocation(grmi.DateTimeOutFormat, dayEndTime, utils.TimezoneLocation) |
|
|
|
prePlanEndTime := startPlanTime |
|
|
|
if endPlanTme.After(endDayTime) { |
|
|
|
// 当天还可以使用的时间
|
|
|
|
CanUsedTime := endDayTime.Sub(startPlanTime).Seconds() |
|
|
|
// 没台套使用的时间 单位s
|
|
|
|
perCarUsedTime := int(CanUsedTime) / allQty |
|
|
|
if perCarUsedTime < 60 { |
|
|
|
return grmi.NewBusinessError("分配给每个台套的时间已不足一分钟, 日期:" + planDate) |
|
|
|
} |
|
|
|
for index, custOrder := range custOrderLi { |
|
|
|
custOrder.PlanStartTime = grmi.DateTime(prePlanEndTime) |
|
|
|
custOrder.PlanEndTime = grmi.DateTime(prePlanEndTime.Add(time.Duration(custOrder.PlanQty * perCarUsedTime) * time.Second)) |
|
|
|
prePlanEndTime = custOrder.PlanEndTime.Restore() |
|
|
|
custOrderLi[index] = custOrder |
|
|
|
} |
|
|
|
} else { |
|
|
|
for index, custOrder := range custOrderLi { |
|
|
|
custOrder.PlanStartTime = grmi.DateTime(prePlanEndTime) |
|
|
|
usedTime := useTimeMap[index] |
|
|
|
custOrder.PlanEndTime = grmi.DateTime(prePlanEndTime.Add(time.Duration(usedTime) * time.Second)) |
|
|
|
prePlanEndTime = custOrder.PlanEndTime.Restore() |
|
|
|
custOrderLi[index] = custOrder |
|
|
|
} |
|
|
|
} |
|
|
|
custOrderLi = append(custOrderLi, custOrder) |
|
|
|
planDateCustOrderMap[planDate] = custOrderLi |
|
|
|
} |
|
|
|
if err = session.Begin(); err != nil { |
|
|
|
return grmi.NewBusinessError("开启事务失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
custOrderStatusLi := make([]model.CustOrderStatus, 0, 20) |
|
|
|
custOrderQtyLi := make([]model.CustOrderQty, 0, 20) |
|
|
|
tempCustOrderLi := make([]model.CustOrder, 0, 20) |
|
|
|
for index, custOrder := range custOrderLi { |
|
|
|
project := projectMap[custOrder.ProjectId] |
|
|
|
custOrderId, err := snrDao.GetNextSnr(project.CustOrderSnr) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("获取客户订单流水号失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
custOrder.CustOrderId = custOrderId |
|
|
|
custOrderStatus := model.CustOrderStatus{ |
|
|
|
CustOrderId: custOrderId, |
|
|
|
Status: baseModel.WO_STATUS_UNPLANNED, |
|
|
|
} |
|
|
|
custOrderStatusLi = append(custOrderStatusLi, custOrderStatus) |
|
|
|
custOrderQty := model.CustOrderQty{ |
|
|
|
CustOrderId: custOrderId, |
|
|
|
PlanQty: custOrder.PlanQty, |
|
|
|
|
|
|
|
for _, custOrderLi := range planDateCustOrderMap { |
|
|
|
custOrderStatusLi := make([]model.CustOrderStatus, 0, 20) |
|
|
|
custOrderQtyLi := make([]model.CustOrderQty, 0, 20) |
|
|
|
tempCustOrderLi := make([]model.CustOrder, 0, 20) |
|
|
|
for index, custOrder := range custOrderLi { |
|
|
|
project := projectMap[custOrder.ProjectId] |
|
|
|
custOrderId, err := snrDao.GetNextSnr(project.CustOrderSnr) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("获取客户订单流水号失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
custOrder.CustOrderId = custOrderId |
|
|
|
custOrderStatus := model.CustOrderStatus{ |
|
|
|
CustOrderId: custOrderId, |
|
|
|
Status: baseModel.WO_STATUS_PLANNED, |
|
|
|
} |
|
|
|
custOrderStatusLi = append(custOrderStatusLi, custOrderStatus) |
|
|
|
custOrderQty := model.CustOrderQty{ |
|
|
|
CustOrderId: custOrderId, |
|
|
|
PlanQty: custOrder.PlanQty, |
|
|
|
} |
|
|
|
custOrderQtyLi = append(custOrderQtyLi, custOrderQty) |
|
|
|
tempCustOrderLi = append(tempCustOrderLi, custOrder) |
|
|
|
if index != 0 && index % 20 == 0 { |
|
|
|
err = custOrderDao.Insert(&tempCustOrderLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
err = custOrderStatusDao.Insert(&custOrderStatusLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单状态数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
err = custOrderQtyDao.Insert(&custOrderQtyLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单数据量数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
custOrderStatusLi = make([]model.CustOrderStatus, 0, 20) |
|
|
|
custOrderQtyLi = make([]model.CustOrderQty, 0, 20) |
|
|
|
tempCustOrderLi = make([]model.CustOrder, 0, 20) |
|
|
|
} |
|
|
|
} |
|
|
|
custOrderQtyLi = append(custOrderQtyLi, custOrderQty) |
|
|
|
tempCustOrderLi = append(tempCustOrderLi, custOrder) |
|
|
|
if index != 0 && index % 20 == 0 { |
|
|
|
if len(tempCustOrderLi) != 0 { |
|
|
|
err = custOrderDao.Insert(&tempCustOrderLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
@ -3835,26 +3937,6 @@ func (impl *CustOrderServiceImplement) AnalysisPlanFromExcel(user *global.User, |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单数据量数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
custOrderStatusLi = make([]model.CustOrderStatus, 0, 20) |
|
|
|
custOrderQtyLi = make([]model.CustOrderQty, 0, 20) |
|
|
|
tempCustOrderLi = make([]model.CustOrder, 0, 20) |
|
|
|
} |
|
|
|
} |
|
|
|
if len(tempCustOrderLi) != 0 { |
|
|
|
err = custOrderDao.Insert(&tempCustOrderLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
err = custOrderStatusDao.Insert(&custOrderStatusLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单状态数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
err = custOrderQtyDao.Insert(&custOrderQtyLi) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("保存客户订单数据量数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
} |
|
|
|
_ = session.Commit() |
|
|
|