|
|
@ -11,12 +11,14 @@ import ( |
|
|
|
"LAPP_ACURA_MOM_BACKEND/grmi" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/infra/logger" |
|
|
|
meMeta "LAPP_ACURA_MOM_BACKEND/meta/me" |
|
|
|
omMeta "LAPP_ACURA_MOM_BACKEND/meta/om" |
|
|
|
baseModel "LAPP_ACURA_MOM_BACKEND/models/base" |
|
|
|
meModel "LAPP_ACURA_MOM_BACKEND/models/me" |
|
|
|
omModel "LAPP_ACURA_MOM_BACKEND/models/om" |
|
|
|
model "LAPP_ACURA_MOM_BACKEND/models/pln" |
|
|
|
omSvr "LAPP_ACURA_MOM_BACKEND/services/om" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/utils" |
|
|
|
"fmt" |
|
|
|
"github.com/360EntSecGroup-Skylar/excelize/v2" |
|
|
|
uuid "github.com/iris-contrib/go.uuid" |
|
|
|
"sort" |
|
|
@ -79,8 +81,14 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
itemJ := custOrderLi[j] |
|
|
|
return itemJ.PlanStartTime.Restore().Before(itemI.PlanStartTime.Restore()) |
|
|
|
}) |
|
|
|
plantNr := user.PlantNr |
|
|
|
channel, exist := common.ReleaseTaskChannel[plantNr] |
|
|
|
if !exist { |
|
|
|
common.ReleaseTaskChannel[plantNr] = make(chan model.CustOrder, 50) |
|
|
|
channel = common.ReleaseTaskChannel[plantNr] |
|
|
|
} |
|
|
|
for _, custOrder := range custOrderLi { |
|
|
|
common.ReleaseTaskChannel <- custOrder |
|
|
|
channel <- custOrder |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
@ -260,7 +268,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("生成任务id失败,错误:" + err.Error()) |
|
|
|
} |
|
|
|
log, _ := logger.NewLogger("客户订单派工,id:" + releaseId.String(), "PLN") |
|
|
|
log, _ := logger.NewLogger("客户订单派工,id:"+releaseId.String(), "PLN") |
|
|
|
engine := db.Eloquent.Master() |
|
|
|
session := engine.NewSession() |
|
|
|
defer session.Close() |
|
|
@ -281,12 +289,14 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
serialOrderPoDao := omDal.NewSerialOrderPOLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
serialOrderStepDao := omDal.NewSerialOrderStepLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
serialOrderOPDetailDao := omDal.NewSerialOrderOPDetailDAO(session, user.PlantNr, user.UserId) |
|
|
|
serialOrderStatusRecDao := omDal.NewSerialOrderStatusRecLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
// 创建serialOrder service接口
|
|
|
|
serialOrderSvr := omSvr.NewSerialOrderService() |
|
|
|
// 查询当前是否有需要派工的custOrder
|
|
|
|
needReleaseQty := custOrderData.OrderQty.PlanQty - custOrderData.OrderQty.ReleasedQty - custOrderData.OrderQty.CancelQty |
|
|
|
log.Info("开始派工, 当前派工客户订单ID:" + custOrderData.CustOrderId + ", 需要派工数量:" + strconv.Itoa(needReleaseQty)) |
|
|
|
// 获取客户订单的车型配置下的所有座椅
|
|
|
|
fmt.Println("---------------------------custOrderId:", custOrderData.CustOrderId) |
|
|
|
productLi, err := productFamilyRelateDao.SelectProductByFamilyIdForCreateSerialOrder(custOrderData.ProjectId, custOrderData.ProductFamilyId) |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("通过车型配置查询关联座椅产品失败, error:" + err.Error()) |
|
|
@ -305,6 +315,163 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
duration := custOrderData.PlanEndTime.Restore().Sub(custOrderData.PlanStartTime.Restore()) |
|
|
|
totalQty := custOrderData.PlanQty * len(productLi) |
|
|
|
perDuration := duration.Seconds() / float64(totalQty) |
|
|
|
|
|
|
|
if custOrderData.CtrlPara1 == 1 { |
|
|
|
var current int |
|
|
|
// 如果客户订单是拆分出来的客户订单 则只是重置所归属的工单及工艺状态
|
|
|
|
serialOrderDataLi, err := serialOrderDao.Select([]grmi.Predicate{ |
|
|
|
omMeta.SerialOrder_CustOrderId.NewPredicate(grmi.Equal, custOrderData.CustOrderId), |
|
|
|
omMeta.SerialOrder_OrderType.NewPredicate(grmi.Equal, baseModel.ODER_TYPE_SEQ), |
|
|
|
}, []grmi.Field{omMeta.SerialOrder_PlanStartTime}) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("查询客户订单下的工单失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
for _, serialOrder := range serialOrderDataLi { |
|
|
|
planStartTime := custOrderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*current) * time.Second) |
|
|
|
planEndTime := custOrderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(current+1)) * time.Second) |
|
|
|
current++ |
|
|
|
planStartDate := grmi.Date(planStartTime) |
|
|
|
planEndDate := grmi.Date(planEndTime) |
|
|
|
timeInt, err := strconv.Atoi(planStartTime.Format("060102150405")) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("通过时间获取工单调度Key失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
//dealedSchedKey := int64(todayInt*1000000 + schedKey*100)
|
|
|
|
var dealedSchedKey = int64(timeInt * 100) |
|
|
|
serialOrder.PlanStartTime = grmi.DateTime(planStartTime) |
|
|
|
serialOrder.PlanEndTime = grmi.DateTime(planEndTime) |
|
|
|
serialOrder.PlanStartDate = planStartDate |
|
|
|
serialOrder.PlanEndDate = planEndDate |
|
|
|
serialOrder.SchedKey = dealedSchedKey |
|
|
|
err = serialOrderDao.UpdateOne(&serialOrder) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新工单数据失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
serialOrderStatusRec := omModel.SerialOrderStatusRecLst{ |
|
|
|
SerialOrderId: serialOrder.SerialOrderId, |
|
|
|
PrevStatus: serialOrder.SerialOrderStatus.Status, |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderStatusRecDao.InsertOne(&serialOrderStatusRec) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("写入工单状态变更历史失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
serialOrder.SerialOrderStatus.Status = baseModel.WO_STATUS_RELEASED |
|
|
|
err = serialOrderStatusDao.UpdateOne(&serialOrder.SerialOrderStatus) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新工单状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
poUpdateData := omModel.SerialOrderPOLst{ |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderPoDao.UpdateWhere([]grmi.Predicate{omMeta.SerialOrderPOLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrderId)}, &poUpdateData, []string{omMeta.SerialOrderPOLst_Status.Name}...) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新工单工序状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
stepUpdateData := omModel.SerialOrderStepLst{ |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderStepDao.UpdateWhere([]grmi.Predicate{omMeta.SerialOrderStepLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrderId)}, &stepUpdateData, []string{omMeta.SerialOrderStepLst_Status.Name}...) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新工单工步状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
opDetailUpdateData := omModel.SerialOrderOPDetail{ |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderOPDetailDao.UpdateWhere([]grmi.Predicate{omMeta.SerialOrderOPDetail_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrderId)}, &opDetailUpdateData, []string{omMeta.SerialOrderOPDetail_Status.Name}...) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新工单详细操作状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
// 对预装工单的处理
|
|
|
|
preSerialOrderLi, err := serialOrderDao.Select([]grmi.Predicate{ |
|
|
|
omMeta.SerialOrder_OrderType.NewPredicate(grmi.Equal, baseModel.ORDER_TYPE_PRE), |
|
|
|
omMeta.SerialOrder_GenerateFlag.NewPredicate(grmi.Equal, 0), |
|
|
|
omMeta.SerialOrder_MainOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrderId), |
|
|
|
}, nil) |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("查询工单下的预装工单失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
for _, preOrder := range preSerialOrderLi { |
|
|
|
preOrder.PlanStartTime = grmi.DateTime(planStartTime) |
|
|
|
preOrder.PlanEndTime = grmi.DateTime(planEndTime) |
|
|
|
preOrder.PlanStartDate = grmi.Date(planStartTime) |
|
|
|
preOrder.PlanEndDate = grmi.Date(planEndTime) |
|
|
|
preOrder.SchedKey = dealedSchedKey |
|
|
|
err = serialOrderDao.UpdateOne(&preOrder) |
|
|
|
if err != nil { |
|
|
|
return grmi.NewBusinessError("更新预装工单数据失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
|
statusRec := omModel.SerialOrderStatusRecLst{ |
|
|
|
SerialOrderId: preOrder.SerialOrderId, |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
PrevStatus: preOrder.SerialOrderStatus.Status, |
|
|
|
} |
|
|
|
preOrder.SerialOrderStatus.Status = baseModel.WO_STATUS_RELEASED |
|
|
|
err = serialOrderStatusRecDao.InsertOne(&statusRec) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("插入预装工单状态变更记录失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
err = serialOrderStatusDao.UpdateOneWithStatus(&preOrder.SerialOrderStatus, baseModel.WO_STATUS_UNPLANNED) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新预装工单状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
poUpdateData := &omModel.SerialOrderPOLst{ |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderPoDao.UpdateWhere([]grmi.Predicate{omMeta.SerialOrderPOLst_SerialOrderId.NewPredicate(grmi.Equal, preOrder.SerialOrderId)}, poUpdateData, omMeta.SerialOrderPOLst_Status.Name) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新预装工单工序状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
stepUpdateData := &omModel.SerialOrderStepLst{ |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderStepDao.UpdateWhere([]grmi.Predicate{omMeta.SerialOrderStepLst_SerialOrderId.NewPredicate(grmi.Equal, preOrder.SerialOrderId)}, stepUpdateData, omMeta.SerialOrderStepLst_Status.Name) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新预装工单工步状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
opDetailUpdateData := &omModel.SerialOrderOPDetail{ |
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
} |
|
|
|
err = serialOrderOPDetailDao.UpdateWhere([]grmi.Predicate{omMeta.SerialOrderOPDetail_SerialOrderId.NewPredicate(grmi.Equal, preOrder.SerialOrderId)}, opDetailUpdateData, omMeta.SerialOrderOPDetail_Status.Name) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新预装工单详细操作状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
custOrderStatusRec := model.CustOrderStatusHistory{ |
|
|
|
CustOrderId: custOrderData.CustOrderId, |
|
|
|
FromStatus: custOrderData.OrderStatus.Status, |
|
|
|
ToStatus: baseModel.WO_STATUS_RELEASED, |
|
|
|
ChangeTime: grmi.DateTime(time.Now()), |
|
|
|
} |
|
|
|
err = custOrderStatusRecDao.InsertOne(&custOrderStatusRec) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("插入客户订单状态变更历史失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
custOrderData.OrderStatus.Status = baseModel.WO_STATUS_RELEASED |
|
|
|
err = custOrderStatusDao.UpdateOne(&custOrderData.OrderStatus) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新客户订单状态失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
_ = session.Commit() |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// 产线组与所属产线的MAP数据结构
|
|
|
|
workLineGroupMap := make(map[string]map[string]interface{}) |
|
|
|
workLineMap := make(map[string]baseModel.WorkLine) |
|
|
@ -371,7 +538,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
} else { |
|
|
|
resourceId = product.DefaultWorkLineId |
|
|
|
} |
|
|
|
currentIndex := custOrderData.OrderQty.ReleasedQty * len(productLi) + index |
|
|
|
currentIndex := custOrderData.OrderQty.ReleasedQty*len(productLi) + index |
|
|
|
planStartTime := custOrderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*currentIndex) * time.Second) |
|
|
|
planEndTime := custOrderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(currentIndex+1)) * time.Second) |
|
|
|
planStartDate := grmi.Date(planStartTime) |
|
|
@ -442,7 +609,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
productCraftMap[serialOrder.ArtId] = orderCraft |
|
|
|
} else { |
|
|
|
serialOrder = orderCraft |
|
|
|
currentIndex := custOrderData.OrderQty.ReleasedQty * len(productLi) + index |
|
|
|
currentIndex := custOrderData.OrderQty.ReleasedQty*len(productLi) + index |
|
|
|
planStartTime := custOrderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*currentIndex) * time.Second) |
|
|
|
planEndTime := custOrderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(currentIndex+1)) * time.Second) |
|
|
|
planStartDate := grmi.Date(planStartTime) |
|
|
@ -504,17 +671,16 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("生成工单流水号失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
preSerialNumber, err := snrDao.GetNextSnr(project.PreOrderSnr) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("获取流水号失败,错误:" + err.Error()) |
|
|
|
} |
|
|
|
for _, serialOrder := range waitReleaseSerialOrderLi { |
|
|
|
serialOrderSvr.ReplaceData(&serialOrder, serialNumber, false) |
|
|
|
for index, preOrder := range serialOrder.PreOrderLi { |
|
|
|
preOrder.MainOrderId = serialOrder.SerialOrderId |
|
|
|
preSerialNumber, err := snrDao.GetNextSnr(project.PreOrderSnr) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("获取流水号失败,错误:" + err.Error()) |
|
|
|
} |
|
|
|
serialOrderSvr.ReplaceData(&preOrder, preSerialNumber, true) |
|
|
|
|
|
|
|
serialOrder.PreOrderLi[index] = preOrder |
|
|
|
} |
|
|
|
writeSerialOrderLi = append(writeSerialOrderLi, serialOrder) |
|
|
@ -676,7 +842,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
} |
|
|
|
_ = session.Commit() |
|
|
|
} |
|
|
|
if custOrderData.OrderQty.PlanQty == custOrderData.OrderQty.ReleasedQty + custOrderData.OrderQty.CancelQty { |
|
|
|
if custOrderData.OrderQty.PlanQty == custOrderData.OrderQty.ReleasedQty+custOrderData.OrderQty.CancelQty { |
|
|
|
if err = session.Begin(); err != nil { |
|
|
|
return grmi.NewBusinessError("开启事务失败, 错误:" + err.Error()) |
|
|
|
} |
|
|
@ -705,12 +871,17 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func (impl *CustOrderServiceImplement) ReleasePlantTask(user *global.User) { |
|
|
|
func (impl *CustOrderServiceImplement) ReleasePlantTask(user *global.User) { |
|
|
|
log, _ := logger.NewLogger("派工任务", "PLN") |
|
|
|
var err error |
|
|
|
plantNr := user.PlantNr |
|
|
|
channel, exist := common.ReleaseTaskChannel[plantNr] |
|
|
|
if !exist { |
|
|
|
common.ReleaseTaskChannel[plantNr] = make(chan model.CustOrder, 50) |
|
|
|
} |
|
|
|
for { |
|
|
|
select { |
|
|
|
case custOrder := <- common.ReleaseTaskChannel: |
|
|
|
case custOrder := <-channel: |
|
|
|
err = impl.ReleaseCustOrder(user, custOrder) |
|
|
|
if err != nil { |
|
|
|
log.Error("派工异常, 错误:" + err.Error()) |
|
|
@ -732,19 +903,24 @@ func (impl *CustOrderServiceImplement) ReleaseTask() error { |
|
|
|
for _, plant := range plantLi { |
|
|
|
user := &global.User{ |
|
|
|
PlantNr: plant.PlantNr, |
|
|
|
UserId: userId, |
|
|
|
UserId: userId, |
|
|
|
} |
|
|
|
custOrderDao := dal.NewCustOrderDAO(session, user.PlantNr, user.UserId) |
|
|
|
custOrderLi, err := custOrderDao.SelectNeedReleaseCustOrder() |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
channel, exist := common.ReleaseTaskChannel[user.PlantNr] |
|
|
|
if !exist { |
|
|
|
common.ReleaseTaskChannel[user.PlantNr] = make(chan model.CustOrder, 50) |
|
|
|
channel = common.ReleaseTaskChannel[user.PlantNr] |
|
|
|
} |
|
|
|
for _, custOrder := range custOrderLi { |
|
|
|
common.ReleaseTaskChannel <- custOrder |
|
|
|
channel <- custOrder |
|
|
|
} |
|
|
|
go func(user *global.User) { |
|
|
|
impl.ReleasePlantTask(user) |
|
|
|
}(user) |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |