Browse Source

跨工厂

feature_crossplant
zhangxin 2 years ago
parent
commit
579fbb294d
2 changed files with 141 additions and 54 deletions
  1. +1
    -0
      models/base/CrossPlanTask.model.go
  2. +140
    -54
      services/om/implments/SerialOrder.Logic.impl.go

+ 1
- 0
models/base/CrossPlanTask.model.go View File

@ -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"`


+ 140
- 54
services/om/implments/SerialOrder.Logic.impl.go View File

@ -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 :=
}
}

Loading…
Cancel
Save