|
|
@ -10,7 +10,9 @@ import ( |
|
|
|
"LAPP_ACURA_MOM_BACKEND/db" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/global" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/grmi" |
|
|
|
"LAPP_ACURA_MOM_BACKEND/infra/logger" |
|
|
|
baseMeta "LAPP_ACURA_MOM_BACKEND/meta/base" |
|
|
|
omMeta "LAPP_ACURA_MOM_BACKEND/meta/om" |
|
|
|
meta "LAPP_ACURA_MOM_BACKEND/meta/pln" |
|
|
|
baseModel "LAPP_ACURA_MOM_BACKEND/models/base" |
|
|
|
meModel "LAPP_ACURA_MOM_BACKEND/models/me" |
|
|
@ -18,6 +20,7 @@ import ( |
|
|
|
model "LAPP_ACURA_MOM_BACKEND/models/pln" |
|
|
|
omSvr "LAPP_ACURA_MOM_BACKEND/services/om" |
|
|
|
"github.com/go-xorm/xorm" |
|
|
|
uuid "github.com/iris-contrib/go.uuid" |
|
|
|
"strconv" |
|
|
|
"time" |
|
|
|
) |
|
|
@ -541,11 +544,12 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
serialOrderDao := omDal.NewSerialOrderDAO(session, user.PlantNr, user.UserId) |
|
|
|
serialOrderStatusDao := omDal.NewSerialOrderStatusDAO(session, user.PlantNr, user.UserId) |
|
|
|
productFamilyRelateDao := meDal.NewProductFamilyRelateDAO(session, user.PlantNr, user.UserId) |
|
|
|
custOrderQtyDao := dal.NewCustOrderQtyDAO(session, user.PlantNr, user.UserId) |
|
|
|
// 用于生成工艺的serialOrder map
|
|
|
|
productSerialOrderMap := make(map[string][]*omModel.SerialOrder) |
|
|
|
for _, custOrderId := range custOrderIdLi { |
|
|
|
// 校验客户订单是否存在及状态
|
|
|
|
orderData, err := custOrderDao.SelectOneWithStatus(custOrderId) |
|
|
|
orderData, err := custOrderDao.SelectOne(custOrderId) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("查询客户订单失败, error:" + err.Error()) |
|
|
@ -554,21 +558,21 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("客户订单不存在, 订单ID:" + custOrderId) |
|
|
|
} |
|
|
|
if orderData.CustOrderStatus.Status != baseModel.WO_STATUS_PLANNED { |
|
|
|
if orderData.OrderStatus.Status != baseModel.WO_STATUS_PLANNED { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("客户订单当前状态不是已计划, 订单ID:" + custOrderId) |
|
|
|
} |
|
|
|
project, err := projectDao.SelectOne(orderData.CustOrder.ProjectId) |
|
|
|
project, err := projectDao.SelectOne(orderData.ProjectId) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("获取车型项目失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
if project == nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("车型项目不存在, 车型项目ID:" + orderData.CustOrder.ProjectId) |
|
|
|
return grmi.NewBusinessError("车型项目不存在, 车型项目ID:" + orderData.ProjectId) |
|
|
|
} |
|
|
|
// 获取客户订单的车型配置下的所有座椅
|
|
|
|
productLi, err := productFamilyRelateDao.SelectProductByFamilyIdForCreateSerialOrder(orderData.CustOrder.ProjectId, orderData.CustOrder.ProductFamilyId) |
|
|
|
productLi, err := productFamilyRelateDao.SelectProductByFamilyIdForCreateSerialOrder(orderData.ProjectId, orderData.ProductFamilyId) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("通过车型配置查询关联座椅产品失败, error:" + err.Error()) |
|
|
@ -582,15 +586,21 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
// 临时工单状态列表
|
|
|
|
serialOrderStatusLi := make([]omModel.SerialOrderStatus, 0) |
|
|
|
// 通过客户订单的时间间隔进行切割 分配给每一个序列工单
|
|
|
|
duration := orderData.CustOrder.PlanEndTime.Restore().Sub(time.Now()) |
|
|
|
totalQty := orderData.CustOrder.PlanQty * len(productLi) |
|
|
|
duration := orderData.PlanEndTime.Restore().Sub(time.Now()) |
|
|
|
totalQty := orderData.PlanQty * len(productLi) |
|
|
|
orderData.OrderQty.SerialOrderQty = totalQty |
|
|
|
err = custOrderQtyDao.UpdateOne(&orderData.OrderQty) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新客户订单数量失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
var current int |
|
|
|
perDuration := duration.Seconds() / float64(totalQty) |
|
|
|
workLineMap := make(map[string]*baseModel.WorkLine) |
|
|
|
var isFirstPieceToggle bool |
|
|
|
var syncKey string |
|
|
|
// 创建序列工单和工单状态
|
|
|
|
for i := 0; i < orderData.CustOrder.PlanQty; i++ { |
|
|
|
for i := 0; i < orderData.PlanQty; i++ { |
|
|
|
syncKey = custOrderId + "-" + strconv.Itoa(i) |
|
|
|
//serialNumberStr, err := snrDao.GetNextSnr(project.SerialOrderSnr)
|
|
|
|
//if err != nil {
|
|
|
@ -643,8 +653,8 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
return grmi.NewBusinessError("调度Key流水号规则错误, 产线ID:" + workLine.WorkLineid) |
|
|
|
} |
|
|
|
dealedSchedKey := int64(todayInt*1000000 + schedKey*100) |
|
|
|
planStartTime := orderData.CustOrder.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*current) * time.Second) |
|
|
|
planEndTime := orderData.CustOrder.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(current+1)) * time.Second) |
|
|
|
planStartTime := orderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*current) * time.Second) |
|
|
|
planEndTime := orderData.PlanStartTime.Restore().Add(time.Duration(int(perDuration)*(current+1)) * time.Second) |
|
|
|
planStartDate := grmi.Date(planStartTime) |
|
|
|
planEndDate := grmi.Date(planEndTime) |
|
|
|
if i == 0 { |
|
|
@ -653,10 +663,10 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
serialOrder := omModel.SerialOrder{ |
|
|
|
SerialOrderId: serialOrderId, |
|
|
|
ArtId: product.ProductId, |
|
|
|
ProjectId: orderData.CustOrder.ProjectId, |
|
|
|
ProjectId: orderData.ProjectId, |
|
|
|
Descr: product.Descr, |
|
|
|
CustOrderId: orderData.CustOrder.CustOrderId, |
|
|
|
OrderType: orderData.CustOrder.OrderType, |
|
|
|
CustOrderId: orderData.CustOrderId, |
|
|
|
OrderType: orderData.OrderType, |
|
|
|
PlanResourceId: product.DefaultWorkLineId, |
|
|
|
UsedResourceId: product.DefaultWorkLineId, |
|
|
|
SchedKey: dealedSchedKey, |
|
|
@ -724,7 +734,7 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
} |
|
|
|
custOrderStatusRec := model.CustOrderStatusHistory{ |
|
|
|
CustOrderId: custOrderId, |
|
|
|
FromStatus: orderData.CustOrderStatus.Status, |
|
|
|
FromStatus: orderData.OrderStatus.Status, |
|
|
|
ToStatus: baseModel.WO_STATUS_RELEASED, |
|
|
|
ChangeTime: grmi.DateTime(time.Now()), |
|
|
|
} |
|
|
@ -734,8 +744,8 @@ func (impl *CustOrderServiceImplement) LockCustOrder(user *global.User, custOrde |
|
|
|
return grmi.NewBusinessError("插入客户订单状态变更历史失败, error:" + err.Error()) |
|
|
|
} |
|
|
|
// 更新客户订单状态
|
|
|
|
orderData.CustOrderStatus.Status = baseModel.WO_STATUS_RELEASED |
|
|
|
err = custOrderStatusDao.UpdateOne(&orderData.CustOrderStatus) |
|
|
|
orderData.OrderStatus.Status = baseModel.WO_STATUS_RELEASED |
|
|
|
err = custOrderStatusDao.UpdateOne(&orderData.OrderStatus) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
return grmi.NewBusinessError("更新客户订单状态失败, error:" + err.Error()) |
|
|
@ -998,7 +1008,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r |
|
|
|
userId := "scheduler" |
|
|
|
user := &global.User{ |
|
|
|
PlantNr: baseModel.PlantNr, |
|
|
|
UserId: userId, |
|
|
|
UserId: userId, |
|
|
|
} |
|
|
|
serialOrderDao := omDal.NewSerialOrderDAO(session, baseModel.PlantNr, userId) |
|
|
|
productFamilyRelateDao := meDal.NewProductFamilyRelateDAO(session, baseModel.PlantNr, userId) |
|
|
@ -1125,7 +1135,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r |
|
|
|
opcBasicMap := make(map[int][]baseModel.OPCBasicComInfo) |
|
|
|
twMap := make(map[int][]baseModel.TightenWrenchInfo) |
|
|
|
// 进行派工
|
|
|
|
// 1. 获取需要派工的台套SyncKey
|
|
|
|
// 1. 获取需要派工的台套SyncKey
|
|
|
|
// 2. 通过SyncKey查询serialOrder 通过custOrderId和状态过滤serialOrder然后比对数量
|
|
|
|
// 3. 进行serialOrder状态变更和历史保存
|
|
|
|
// 4. 生成工艺数据
|
|
|
@ -1305,10 +1315,10 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r |
|
|
|
statusHistory := model.CustOrderStatusHistory{ |
|
|
|
CustOrderId: custOrder.CustOrderId, |
|
|
|
//Pos: maxPos+1,
|
|
|
|
StatusChangeType: "SCHEDULER", |
|
|
|
FromStatus: baseModel.WO_STATUS_LOCKED, |
|
|
|
ToStatus: baseModel.WO_STATUS_RELEASED, |
|
|
|
ChangeTime: grmi.DateTime(time.Now()), |
|
|
|
StatusChangeType: model.STATUS__CHANGE_TYPE_SCHUDLER, |
|
|
|
FromStatus: baseModel.WO_STATUS_LOCKED, |
|
|
|
ToStatus: baseModel.WO_STATUS_RELEASED, |
|
|
|
ChangeTime: grmi.DateTime(time.Now()), |
|
|
|
} |
|
|
|
err = custOrderStatusHistoryDao.InsertOne(&statusHistory) |
|
|
|
if err != nil { |
|
|
@ -1322,3 +1332,131 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(session *xorm.Session, r |
|
|
|
} |
|
|
|
return custOrder, nil |
|
|
|
} |
|
|
|
|
|
|
|
// ReportWort 处理MES的报工数据
|
|
|
|
func (impl *CustOrderServiceImplement) ReportWort(user *global.User) { |
|
|
|
engine := db.Eloquent.Master() |
|
|
|
session := engine.NewSession() |
|
|
|
defer session.Close() |
|
|
|
log, _ := logger.NewLogger("Schuler", "ReportWork") |
|
|
|
uid, err := uuid.NewV1() |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
reportId := uid.String() |
|
|
|
log.Info("报工同步开始, 报工任务ID:" + reportId) |
|
|
|
// 从serialOrder状态变更表中获取MES操作完成的serialOrder
|
|
|
|
serialOrderStatusRecDao := omDal.NewSerialOrderStatusRecLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
serialOrderDao := omDal.NewSerialOrderDAO(session, user.PlantNr, user.UserId) |
|
|
|
event, err := serialOrderStatusRecDao.SelectClosedEvent() |
|
|
|
if err != nil { |
|
|
|
log.Error("报工同步阶段, 查询报工事件失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
if event == nil { |
|
|
|
log.Info("报工完成, 未获取到新的报工事件, 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
log.Info("报工同步阶段, 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) |
|
|
|
// 查询serialOrder关联的客户订单
|
|
|
|
custOrderDao := dal.NewCustOrderDAO(session, user.PlantNr, user.UserId) |
|
|
|
custOrderStatusDao := dal.NewCustOrderStatusDAO(session, user.PlantNr, user.UserId) |
|
|
|
custOrderStatusHistoryDao := dal.NewCustOrderStatusHistoryDAO(session, user.PlantNr, user.UserId) |
|
|
|
custOrder, err := custOrderDao.SelectOne(event.SerialOrder.CustOrderId) |
|
|
|
if err != nil { |
|
|
|
log.Error("报工同步阶段, 查询关联的客户订单失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
if custOrder == nil { |
|
|
|
log.Error("报工同步阶段, 查询关联的客户订单不存在, 客户订单ID:" + event.SerialOrder.CustOrderId + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
if custOrder.OrderStatus.Status >= baseModel.WO_STATUS_FINISHED { |
|
|
|
log.Error("报工同步阶段, 关联的客户订单已完成, 客户订单ID:" + event.SerialOrder.CustOrderId + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
// 开启事务 开始处理客户订单数量
|
|
|
|
if err = session.Begin(); err != nil { |
|
|
|
log.Error("报工同步阶段, 开启事务失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
event.SerialOrderStatusRecLst.OutputStatus = omModel.ORDER_DEALED |
|
|
|
err = serialOrderStatusRecDao.UpdateOne(&event.SerialOrderStatusRecLst) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
log.Error("报工同步阶段, 更新工单状态变更记录处理状态失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
//serialOrder := event.SerialOrder
|
|
|
|
serialOrderLi, err := serialOrderDao.Select([]grmi.Predicate{omMeta.SerialOrder_SyncKey.NewPredicate(grmi.Equal, event.SerialOrder.SyncKey)}, nil) |
|
|
|
var carComplete = true |
|
|
|
var completeQty int |
|
|
|
for _, serialOrder := range serialOrderLi { |
|
|
|
if serialOrder.SerialOrderStatus.Status < baseModel.WO_STATUS_FINISHED { |
|
|
|
carComplete = false |
|
|
|
} else if serialOrder.SerialOrderStatus.Status == baseModel.WO_STATUS_FINISHED { |
|
|
|
completeQty += 1 |
|
|
|
} |
|
|
|
} |
|
|
|
// 客户订单下的工单数量+1
|
|
|
|
custOrder.OrderQty.SerialOrderActQty += 1 |
|
|
|
// 如果客户订单下的同一台套工单都完成 ActQty +1
|
|
|
|
if carComplete { |
|
|
|
custOrder.OrderQty.ActQty += 1 |
|
|
|
} |
|
|
|
// 如果客户订单下的同一台套只完成一个 说明该工单是这个台套的第一个完成的工单 RunningQty+1
|
|
|
|
if completeQty == 1 { |
|
|
|
custOrder.OrderQty.RunningQty += 1 |
|
|
|
} |
|
|
|
// 关单
|
|
|
|
if custOrder.OrderQty.ActQty == custOrder.OrderQty.PlanQty { |
|
|
|
custOrderStatsusHistory := model.CustOrderStatusHistory{ |
|
|
|
CustOrderId: custOrder.CustOrderId, |
|
|
|
StatusChangeType: model.STATUS_CHANGE_TYPE_REPORT, |
|
|
|
FromStatus: custOrder.OrderStatus.Status, |
|
|
|
ToStatus: baseModel.WO_STATUS_FINISHED, |
|
|
|
ChangeTime: grmi.DateTime(time.Now()), |
|
|
|
} |
|
|
|
err = custOrderStatusHistoryDao.InsertOne(&custOrderStatsusHistory) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
log.Error("报工同步阶段, 插入客户订单状态变更记录失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
custOrder.OrderStatus.Status = baseModel.WO_STATUS_FINISHED |
|
|
|
err = custOrderStatusDao.UpdateOne(&custOrder.OrderStatus) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
log.Error("报工同步阶段, 更新客户订单状态失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
log.Info("报工同步阶段, 客户订单关闭, 处理客户订单ID:" + custOrder.CustOrderId + ", 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
if custOrder.OrderQty.RunningQty > 0 && custOrder.OrderStatus.Status == baseModel.WO_STATUS_RELEASED { |
|
|
|
custOrderStatsusHistory := model.CustOrderStatusHistory{ |
|
|
|
CustOrderId: custOrder.CustOrderId, |
|
|
|
StatusChangeType: model.STATUS_CHANGE_TYPE_REPORT, |
|
|
|
FromStatus: custOrder.OrderStatus.Status, |
|
|
|
ToStatus: baseModel.WO_STATUS_RUNNING, |
|
|
|
ChangeTime: grmi.DateTime(time.Now()), |
|
|
|
} |
|
|
|
err = custOrderStatusHistoryDao.InsertOne(&custOrderStatsusHistory) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
log.Error("报工同步阶段, 插入客户订单状态变更记录失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
custOrder.OrderStatus.Status = baseModel.WO_STATUS_RUNNING |
|
|
|
err = custOrderStatusDao.UpdateOne(&custOrder.OrderStatus) |
|
|
|
if err != nil { |
|
|
|
_ = session.Rollback() |
|
|
|
log.Error("报工同步阶段, 更新客户订单状态失败, 错误:" + err.Error() + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
log.Info("报工同步阶段, 客户订单已置为运行中, 处理客户订单ID:" + custOrder.CustOrderId + ", 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |
|
|
|
log.Info("报工同步阶段, 客户订单已经在运行中, 处理客户订单ID:" + custOrder.CustOrderId + ", 处理工单ID:" + event.SerialOrder.SerialOrderId + ", 报工任务ID:" + reportId) |
|
|
|
return |
|
|
|
} |