|
@ -7,11 +7,15 @@ import ( |
|
|
"LAPP_ACURA_MOM_BACKEND/db" |
|
|
"LAPP_ACURA_MOM_BACKEND/db" |
|
|
"LAPP_ACURA_MOM_BACKEND/global" |
|
|
"LAPP_ACURA_MOM_BACKEND/global" |
|
|
"LAPP_ACURA_MOM_BACKEND/grmi" |
|
|
"LAPP_ACURA_MOM_BACKEND/grmi" |
|
|
|
|
|
"LAPP_ACURA_MOM_BACKEND/infra/logger" |
|
|
|
|
|
baseMeta "LAPP_ACURA_MOM_BACKEND/meta/base" |
|
|
meMeta "LAPP_ACURA_MOM_BACKEND/meta/me" |
|
|
meMeta "LAPP_ACURA_MOM_BACKEND/meta/me" |
|
|
meta "LAPP_ACURA_MOM_BACKEND/meta/om" |
|
|
meta "LAPP_ACURA_MOM_BACKEND/meta/om" |
|
|
baseModel "LAPP_ACURA_MOM_BACKEND/models/base" |
|
|
baseModel "LAPP_ACURA_MOM_BACKEND/models/base" |
|
|
model "LAPP_ACURA_MOM_BACKEND/models/om" |
|
|
model "LAPP_ACURA_MOM_BACKEND/models/om" |
|
|
"LAPP_ACURA_MOM_BACKEND/utils" |
|
|
"LAPP_ACURA_MOM_BACKEND/utils" |
|
|
|
|
|
"github.com/go-xorm/xorm" |
|
|
|
|
|
uuid "github.com/iris-contrib/go.uuid" |
|
|
"strconv" |
|
|
"strconv" |
|
|
"strings" |
|
|
"strings" |
|
|
"time" |
|
|
"time" |
|
@ -458,57 +462,139 @@ func (impl *SerialOrderServiceImplement) ReplaceData(serialOrder *model.SerialOr |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//func (impl *Serial OrderServiceImplement) ExecuteCrossPlantTask(session *xorm.Session, task baseModel.CrossPlanTask, artId string) error {
|
|
|
|
|
|
// user := &global.User{
|
|
|
|
|
|
// PlantNr: task.ToPlantNr,
|
|
|
|
|
|
// UserId: "MultiPlantTask",
|
|
|
|
|
|
// }
|
|
|
|
|
|
// writeSerialOrderLi := make([]model.SerialOrder, 0)
|
|
|
|
|
|
// workLinePoDao := baseDal.NewWorkLineProcessLstDAO(session, user.PlantNr, user.UserId)
|
|
|
|
|
|
// productDao := meDal.NewProductDAO(session, user.PlantNr, user.UserId)
|
|
|
|
|
|
// workLineLi, err := workLinePoDao.Select([]grmi.Predicate{
|
|
|
|
|
|
// baseMeta.WorkLineProcessLst_PO.NewPredicate(grmi.Equal, task.LastPo),
|
|
|
|
|
|
// }, nil)
|
|
|
|
|
|
// if err != nil {
|
|
|
|
|
|
// return grmi.NewBusinessError("查询工序关联产线失败, 错误:" + err.Error())
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if len(workLineLi) == 0 {
|
|
|
|
|
|
// return grmi.NewBusinessError("拆分工单指定末道序未关联产线, 末道序:" + task.LastPo)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if len(workLineLi) != 1 {
|
|
|
|
|
|
// return grmi.NewBusinessError("拆分工单指定末道序关联多条产线, 末道序:" + task.LastPo)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// workLineId := workLineLi[0].WorkLineId
|
|
|
|
|
|
// product, err := productDao.SelectOne(artId, task.ProjectId)
|
|
|
|
|
|
// if err != nil {
|
|
|
|
|
|
// return grmi.NewBusinessError("查询总成失败, 错误:" + err.Error())
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if product == nil {
|
|
|
|
|
|
// return grmi.NewBusinessError("总成不存在, 总成ID:" + artId)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// serialOrderId := strings.Replace(artId, "-", "", -1) + "$date$" + "$serialNumber$"
|
|
|
|
|
|
// insertOrder := model.SerialOrder{
|
|
|
|
|
|
// SerialOrderId: serialOrderId,
|
|
|
|
|
|
// ArtId: artId,
|
|
|
|
|
|
// ProjectId: task.ProjectId,
|
|
|
|
|
|
// Descr: product.Descr,
|
|
|
|
|
|
// PreSchedKey: 0,
|
|
|
|
|
|
// SchedKey: 0,
|
|
|
|
|
|
// Priority: 0,
|
|
|
|
|
|
// OrderType: baseModel.ORDER_TYPE_PRE,
|
|
|
|
|
|
// PlanResourceId: workLineId,
|
|
|
|
|
|
// UsedResourceId: workLineId,
|
|
|
|
|
|
// PlanQty: 1,
|
|
|
|
|
|
// PickingFlag: product.PickingFlag,
|
|
|
|
|
|
// }
|
|
|
|
|
|
// insertOrder.SerialOrderStatus = model.SerialOrderStatus{
|
|
|
|
|
|
// SerialOrderId: serialOrderId,
|
|
|
|
|
|
// Status: baseModel.WO_STATUS_RELEASED,
|
|
|
|
|
|
// }
|
|
|
|
|
|
// writeSerialOrderLi = append(writeSerialOrderLi, insertOrder)
|
|
|
|
|
|
// err = impl.GenerateProductCraft(user, session, &insertOrder)
|
|
|
|
|
|
// if err != nil {
|
|
|
|
|
|
// return grmi.NewBusinessError("生成工单工艺数据失败, 错误:" + err.Error())
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
func (impl *SerialOrderServiceImplement) SingleProductTask(user *global.User, session *xorm.Session, task *baseModel.CrossPlanTask, productId string) (*model.SerialOrder ,error) { |
|
|
|
|
|
writeSerialOrderLi := make([]model.SerialOrder, 0) |
|
|
|
|
|
workLinePoDao := baseDal.NewWorkLineProcessLstDAO(session, user.PlantNr, user.UserId) |
|
|
|
|
|
productDao := meDal.NewProductDAO(session, user.PlantNr, user.UserId) |
|
|
|
|
|
workLineLi, err := workLinePoDao.Select([]grmi.Predicate{ |
|
|
|
|
|
baseMeta.WorkLineProcessLst_PO.NewPredicate(grmi.Equal, task.LastPo), |
|
|
|
|
|
}, nil) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, grmi.NewBusinessError("查询工序关联产线失败, 错误:" + err.Error()) |
|
|
|
|
|
} |
|
|
|
|
|
if len(workLineLi) == 0 { |
|
|
|
|
|
return nil, grmi.NewBusinessError("拆分工单指定末道序未关联产线, 末道序:" + task.LastPo) |
|
|
|
|
|
} |
|
|
|
|
|
if len(workLineLi) != 1 { |
|
|
|
|
|
return nil, grmi.NewBusinessError("拆分工单指定末道序关联多条产线, 末道序:" + task.LastPo) |
|
|
|
|
|
} |
|
|
|
|
|
workLineId := workLineLi[0].WorkLineId |
|
|
|
|
|
product, err := productDao.SelectOne(productId, task.ProjectId) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, grmi.NewBusinessError("查询总成失败, 错误:" + err.Error()) |
|
|
|
|
|
} |
|
|
|
|
|
if product == nil { |
|
|
|
|
|
return nil, grmi.NewBusinessError("总成不存在, 总成ID:" + productId) |
|
|
|
|
|
} |
|
|
|
|
|
serialOrderId := strings.Replace(productId, "-", "", -1) + "$date$" + "$serialNumber$" |
|
|
|
|
|
insertOrder := model.SerialOrder{ |
|
|
|
|
|
SerialOrderId: serialOrderId, |
|
|
|
|
|
ArtId: productId, |
|
|
|
|
|
ProjectId: task.ProjectId, |
|
|
|
|
|
Descr: product.Descr, |
|
|
|
|
|
PreSchedKey: 0, |
|
|
|
|
|
SchedKey: 0, |
|
|
|
|
|
Priority: 0, |
|
|
|
|
|
OrderType: baseModel.ORDER_TYPE_PRE, |
|
|
|
|
|
PlanResourceId: workLineId, |
|
|
|
|
|
UsedResourceId: workLineId, |
|
|
|
|
|
PlanQty: 1, |
|
|
|
|
|
PickingFlag: product.PickingFlag, |
|
|
|
|
|
} |
|
|
|
|
|
insertOrder.SerialOrderStatus = model.SerialOrderStatus{ |
|
|
|
|
|
SerialOrderId: serialOrderId, |
|
|
|
|
|
Status: baseModel.WO_STATUS_RELEASED, |
|
|
|
|
|
} |
|
|
|
|
|
writeSerialOrderLi = append(writeSerialOrderLi, insertOrder) |
|
|
|
|
|
err = impl.GenerateProductCraft(user, session, &insertOrder) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, grmi.NewBusinessError("生成工单工艺数据失败, 错误:" + err.Error()) |
|
|
|
|
|
} |
|
|
|
|
|
return &insertOrder, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (impl *SerialOrderServiceImplement) ExecuteCrossPlantTask(task baseModel.CrossPlanTask) { |
|
|
|
|
|
engine := db.Eloquent.Master() |
|
|
|
|
|
session := engine.NewSession() |
|
|
|
|
|
defer session.Close() |
|
|
|
|
|
user := &global.User{ |
|
|
|
|
|
PlantNr: task.ToPlantNr, |
|
|
|
|
|
UserId: "MultiPlantTask", |
|
|
|
|
|
} |
|
|
|
|
|
releaseId, err := uuid.NewV4() |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
log, _ := logger.NewLogger("跨工厂生成计划,id:"+releaseId.String(), "CrossPlant") |
|
|
|
|
|
taskDao := baseDal.NewCrossPlanTaskDAO(session, user.UserId) |
|
|
|
|
|
// 获取生产的物料
|
|
|
|
|
|
productIdLi := strings.Split(task.ArtId, ";") |
|
|
|
|
|
if len(productIdLi) == 0 { |
|
|
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
|
|
task.ErrorMsg = "任务未包含物料数据" |
|
|
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
|
|
} |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
if task.PlanEndTime.Restore().Before(task.PlanStartTime.Restore()) { |
|
|
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
|
|
task.ErrorMsg = "任务计划结束时间早于开始时间" |
|
|
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
|
|
} |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
subTime := task.PlanEndTime.Restore().Sub(task.PlanStartTime.Restore()) |
|
|
|
|
|
totalQty := len(productIdLi) * task.PlanQty |
|
|
|
|
|
perDuration := int(subTime.Seconds()) / totalQty |
|
|
|
|
|
// 调度模式
|
|
|
|
|
|
schedQty, err := strconv.Atoi(task.SchedType) |
|
|
|
|
|
if err != nil || schedQty == 0 { |
|
|
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
|
|
task.ErrorMsg = "不支持的调度模式" |
|
|
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
|
|
} |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
// 记录生成计划中间的数量
|
|
|
|
|
|
type ProductQty struct { |
|
|
|
|
|
ArtId string // 物料id
|
|
|
|
|
|
CurrentQty int // 当前数量
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
productQtyCacheLi := make([]ProductQty, 0, len(productIdLi)) |
|
|
|
|
|
for _, productId := range productIdLi { |
|
|
|
|
|
productQtyData := ProductQty{ |
|
|
|
|
|
ArtId: productId, |
|
|
|
|
|
} |
|
|
|
|
|
productQtyCacheLi = append(productQtyCacheLi, productQtyData) |
|
|
|
|
|
} |
|
|
|
|
|
productCraftMap := make(map[string]*model.SerialOrder) |
|
|
|
|
|
for _, productId := range productIdLi { |
|
|
|
|
|
serialOrderCraft, err := impl.SingleProductTask(user, session, &task, productId) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
task.Status = baseModel.CROSS_TASK_STATUS_ERROR |
|
|
|
|
|
task.ErrorMsg = "生成工单工艺失败, 错误:" + err.Error() |
|
|
|
|
|
err = taskDao.UpdateOne(&task) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
log.Error("更新任务状态失败, 错误:" + err.Error() + ", 任务ID:" + strconv.Itoa(task.TaskNr)) |
|
|
|
|
|
} |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
productCraftMap[productId] = serialOrderCraft |
|
|
|
|
|
} |
|
|
|
|
|
for index, productQtyCache := range productQtyCacheLi { |
|
|
|
|
|
if productQtyCache.CurrentQty == schedQty { |
|
|
|
|
|
productQtyCache.CurrentQty = 0 |
|
|
|
|
|
productQtyCacheLi[index] = productQtyCache |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
startNum := |
|
|
|
|
|
} |
|
|
|
|
|
} |