From 579fbb294d6f096f2417896eb66586b28162e902 Mon Sep 17 00:00:00 2001 From: zhangxin Date: Mon, 16 May 2022 12:18:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=A8=E5=B7=A5=E5=8E=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/base/CrossPlanTask.model.go | 1 + .../om/implments/SerialOrder.Logic.impl.go | 194 +++++++++++++----- 2 files changed, 141 insertions(+), 54 deletions(-) diff --git a/models/base/CrossPlanTask.model.go b/models/base/CrossPlanTask.model.go index 0e933b2..b2d3d2e 100644 --- a/models/base/CrossPlanTask.model.go +++ b/models/base/CrossPlanTask.model.go @@ -27,6 +27,7 @@ type CrossPlanTask struct { ArtId string `xorm:"nvarchar(255) 'ArtId' not null" json:"CrossPlanTask-ArtId"` PlanQty int `xorm:"int 'PlanQty' not null" json:"CrossPlanTask-PlanQty"` ActQty int `xorm:"int 'ActQty' not null" json:"CrossPlanTask-ActQty"` + ReleaseQty string `xorm:"int 'ReleaseQty' not null" json:"CrossPlanTask-ReleaseQty"` Status int `xorm:"int 'Status' not null" json:"CrossPlanTask-Status"` OrderType string `xorm:"nvarchar(40) 'OrderType' not null" json:"CrossPlanTask-OrderType"` PlanType string `xorm:"nvarchar(40) 'PlanType' not null" json:"CrossPlanTask-PlanType"` diff --git a/services/om/implments/SerialOrder.Logic.impl.go b/services/om/implments/SerialOrder.Logic.impl.go index a352c79..0d7bd08 100644 --- a/services/om/implments/SerialOrder.Logic.impl.go +++ b/services/om/implments/SerialOrder.Logic.impl.go @@ -7,11 +7,15 @@ 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" meMeta "LAPP_ACURA_MOM_BACKEND/meta/me" meta "LAPP_ACURA_MOM_BACKEND/meta/om" baseModel "LAPP_ACURA_MOM_BACKEND/models/base" model "LAPP_ACURA_MOM_BACKEND/models/om" "LAPP_ACURA_MOM_BACKEND/utils" + "github.com/go-xorm/xorm" + uuid "github.com/iris-contrib/go.uuid" "strconv" "strings" "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 := + } +} \ No newline at end of file