From 7f8b3798e2d26fa23b4828b7c20b263455c41b0b Mon Sep 17 00:00:00 2001 From: zhangxin Date: Tue, 17 May 2022 12:57:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B7=A8=E9=95=BF=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meta/me/ShipableAUConfig.meta.go | 4 +- models/base/Const.go | 1 + models/me/ShipableAUConfig.model.go | 1 + models/om/om.go | 20 ++- models/pln/CustOrder.model.go | 1 + .../ShipableAUConfig.service.impl.go | 3 +- .../om/implments/SerialOrder.Craft.impl.go | 155 ++++++++++-------- .../implments/CustOrderLogic.service.impl.go | 36 +++- 8 files changed, 143 insertions(+), 78 deletions(-) diff --git a/meta/me/ShipableAUConfig.meta.go b/meta/me/ShipableAUConfig.meta.go index 140c03d..a0732e2 100644 --- a/meta/me/ShipableAUConfig.meta.go +++ b/meta/me/ShipableAUConfig.meta.go @@ -19,6 +19,7 @@ import ( var ShipableAUConfig_PlantNr = grmi.NewField("PlantNr", "[ME_ShipableAUConfig].PlantNr", "plantnr", grmi.TypeInt) var ShipableAUConfig_ArtId = grmi.NewField("ArtId", "[ME_ShipableAUConfig].ArtId", "artid", grmi.TypeString) var ShipableAUConfig_AuPo = grmi.NewField("AuPo", "[ME_ShipableAUConfig].AuPo", "aupo", grmi.TypeString) +var ShipableAUConfig_AuPlantNr = grmi.NewField("AuPlantNr", "[ME_ShipableAUConfig].AuPlantNr", "auplantnr", grmi.TypeInt) var ShipableAUConfig_BarCodeRule = grmi.NewField("BarCodeRule", "[ME_ShipableAUConfig].BarCodeRule", "barcoderule", grmi.TypeString) var ShipableAUConfig_StrPara1 = grmi.NewField("StrPara1", "[ME_ShipableAUConfig].StrPara1", "strpara1", grmi.TypeString) var ShipableAUConfig_StrPara2 = grmi.NewField("StrPara2", "[ME_ShipableAUConfig].StrPara2", "strpara2", grmi.TypeString) @@ -49,6 +50,7 @@ var ShipableAUConfig = grmi.NewEntity( ShipableAUConfig_PlantNr.Name: ShipableAUConfig_PlantNr, ShipableAUConfig_ArtId.Name: ShipableAUConfig_ArtId, ShipableAUConfig_AuPo.Name: ShipableAUConfig_AuPo, + ShipableAUConfig_AuPlantNr.Name: ShipableAUConfig_AuPlantNr, ShipableAUConfig_BarCodeRule.Name: ShipableAUConfig_BarCodeRule, ShipableAUConfig_StrPara1.Name: ShipableAUConfig_StrPara1, ShipableAUConfig_StrPara2.Name: ShipableAUConfig_StrPara2, @@ -64,4 +66,4 @@ var ShipableAUConfig = grmi.NewEntity( ShipableAUConfig_CreateTime.Name: ShipableAUConfig_CreateTime, }, []string{"PlantNr"}, - []string{"AuPo", "BarCodeRule", "StrPara1", "StrPara2", "StrPara3", "IntPara1", "IntPara2", "IntPara3", "Toggle1", "Toggle2", "Toggle3", "LastUser"}) + []string{"AuPo", "AuPlantNr", "BarCodeRule", "StrPara1", "StrPara2", "StrPara3", "IntPara1", "IntPara2", "IntPara3", "Toggle1", "Toggle2", "Toggle3", "LastUser"}) diff --git a/models/base/Const.go b/models/base/Const.go index 7d2c266..b8783af 100644 --- a/models/base/Const.go +++ b/models/base/Const.go @@ -129,6 +129,7 @@ const ( ODER_TYPE_INTERVAL = "INT" ODER_TYPE_REODER = "REO" ORDER_TYPE_PRE = "PRE" + ORDER_TYPE_CROSS = "CROSS" ART_TYPE_FINISHED = "FINISHED" ART_TYPE_SEMI_FINISHED = "SEMI_FINISHED" diff --git a/models/me/ShipableAUConfig.model.go b/models/me/ShipableAUConfig.model.go index fd83594..a4a7c7a 100644 --- a/models/me/ShipableAUConfig.model.go +++ b/models/me/ShipableAUConfig.model.go @@ -23,6 +23,7 @@ type ShipableAUConfig struct { PlantNr int `xorm:"pk int 'PlantNr'" json:"ME_ShipableAUConfig-PlantNr"` ArtId string `xorm:"pk nvarchar(40) 'ArtId'" json:"ME_ShipableAUConfig-ArtId"` AuPo string `xorm:"nvarchar(40) 'AuPo' not null" json:"ME_ShipableAUConfig-AuPo"` + AuPlantNr int `xorm:"int 'AuPlantNr' not null" json:"ME_ShipableAUConfig-AuPlantNr"` BarCodeRule string `xorm:"nvarchar(40) 'BarCodeRule' not null" json:"ME_ShipableAUConfig-BarCodeRule"` StrPara1 string `xorm:"nvarchar(100) 'StrPara1'" json:"ME_ShipableAUConfig-StrPara1"` StrPara2 string `xorm:"nvarchar(100) 'StrPara2'" json:"ME_ShipableAUConfig-StrPara2"` diff --git a/models/om/om.go b/models/om/om.go index c930f43..2032b75 100644 --- a/models/om/om.go +++ b/models/om/om.go @@ -146,6 +146,10 @@ type OrderAUPoData struct { SFP *baseModel.Article AllAttributeLi []baseModel.ArticleAttribute ArtRelMap map[string]int + OtherPlant bool + OtherPlantNr int + ArtId string + LastAuPo string } type ExportItem struct { @@ -177,16 +181,16 @@ type ProductTraceStepData struct { // SerialOrderCraft 工单工艺相关数据 type SerialOrderCraft struct { - SerialOrderLi []SerialOrder - SerialOrderStatusLi []SerialOrderStatus - SerialOrderPOLstLi []SerialOrderPOLst - SerialOrderStepLstLi []SerialOrderStepLst + SerialOrderLi []SerialOrder + SerialOrderStatusLi []SerialOrderStatus + SerialOrderPOLstLi []SerialOrderPOLst + SerialOrderStepLstLi []SerialOrderStepLst SerialOrderOPDetailLi []SerialOrderOPDetail - LabelHeadLi []baseModel.LabelHead - LabelDetailLi []baseModel.LabelDetail + LabelHeadLi []baseModel.LabelHead + LabelDetailLi []baseModel.LabelDetail } type ReplaceId struct { - SnrId string + SnrId string PlanTime time.Time -} \ No newline at end of file +} diff --git a/models/pln/CustOrder.model.go b/models/pln/CustOrder.model.go index 800fe2a..1699558 100644 --- a/models/pln/CustOrder.model.go +++ b/models/pln/CustOrder.model.go @@ -66,6 +66,7 @@ type CustOrder struct { ActEndTime grmi.DateTime `xorm:"datetime 'ActEndTime' not null" json:"PLN_CustOrder-ActEndTime"` QuantityPerHour int `xorm:"datetime 'QuantityPerHour' not null" json:"PLN_CustOrder-QuantityPerHour"` CtrlPara1 int `xorm:"int 'CtrlPara1' not null" json:"PLN_CustOrder-CtrlPara1"` + // 跨工厂的调度数量 CtrlPara2 int `xorm:"int 'CtrlPara2' not null" json:"PLN_CustOrder-CtrlPara2"` CtrlStr1 string `xorm:"nvarchar(255) 'CtrlStr1' not null" json:"PLN_CustOrder-CtrlStr1"` CtrlStr2 string `xorm:"nvarchar(255) 'CtrlStr2' not null" json:"PLN_CustOrder-CtrlStr2"` diff --git a/services/me/implments/ShipableAUConfig.service.impl.go b/services/me/implments/ShipableAUConfig.service.impl.go index fbbeae9..ed3b65a 100644 --- a/services/me/implments/ShipableAUConfig.service.impl.go +++ b/services/me/implments/ShipableAUConfig.service.impl.go @@ -27,6 +27,7 @@ var DefaultConditionOfShipableAUConfig = grmi.NewCondition( map[string]grmi.ConditionItem{ meta.ShipableAUConfig_ArtId.UrlParameterName: grmi.NewConditionItem(meta.ShipableAUConfig_ArtId, grmi.Equal, true), meta.ShipableAUConfig_AuPo.UrlParameterName: grmi.NewConditionItem(meta.ShipableAUConfig_AuPo, grmi.Equal, false), + meta.ShipableAUConfig_AuPlantNr.UrlParameterName: grmi.NewConditionItem(meta.ShipableAUConfig_AuPlantNr, grmi.Equal, false), meta.ShipableAUConfig_BarCodeRule.UrlParameterName: grmi.NewConditionItem(meta.ShipableAUConfig_BarCodeRule, grmi.Equal, false), meta.ShipableAUConfig_StrPara1.UrlParameterName: grmi.NewConditionItem(meta.ShipableAUConfig_StrPara1, grmi.Equal, false), meta.ShipableAUConfig_StrPara2.UrlParameterName: grmi.NewConditionItem(meta.ShipableAUConfig_StrPara2, grmi.Equal, false), @@ -392,4 +393,4 @@ func (impl *ShipableAUConfigServiceImplement) Save(user *global.User, entity *mo return nil } -} \ No newline at end of file +} diff --git a/services/om/implments/SerialOrder.Craft.impl.go b/services/om/implments/SerialOrder.Craft.impl.go index 9a166d1..e5615c3 100644 --- a/services/om/implments/SerialOrder.Craft.impl.go +++ b/services/om/implments/SerialOrder.Craft.impl.go @@ -110,7 +110,7 @@ func (impl *SerialOrderServiceImplement) GenerateProductCraft(user *global.User, bomLstLi, err := bomLstDao.Select([]grmi.Predicate{ meMeta.BomLst_BomId.NewPredicate(grmi.Equal, productId), meMeta.BomLst_ShipableAU.NewPredicate(grmi.Equal, true), - }, nil) + }, []grmi.Field{meMeta.BomLst_Position}) if err != nil { return grmi.NewBusinessError("查询BOM子项数据失败, 错误:" + err.Error()) } @@ -124,13 +124,7 @@ func (impl *SerialOrderServiceImplement) GenerateProductCraft(user *global.User, sfpUsedPoMap := make(map[string]interface{}) orderPoMap := make(map[string]*model.OrderAUPoData) for _, bomLst := range bomLstLi { - sfp, err := articleDao.SelectOne(bomLst.CmatNr, projectId) - if err != nil { - return grmi.NewBusinessError("查询物料失败, 错误:" + err.Error()) - } - if sfp == nil { - return grmi.NewBusinessError("半成品物料不存在, 物料ID:" + bomLst.CmatNr) - } + auConfig, err := shipableAUConfigDao.SelectOne(bomLst.CmatNr) if err != nil { return grmi.NewBusinessError("查询半成品配置数据失败, 错误:" + err.Error()) @@ -138,65 +132,81 @@ func (impl *SerialOrderServiceImplement) GenerateProductCraft(user *global.User, if auConfig == nil { return grmi.NewBusinessError("半成品配置不存在, 物料ID:" + bomLst.CmatNr) } - - sfpBomHead, err := bomHeadDao.SelectOne(bomLst.CmatNr) - if err != nil { - return grmi.NewBusinessError("查询物料BOM失败, error:" + err.Error()) - } - if sfpBomHead == nil { - return grmi.NewBusinessError("不存在对应的物料BOM, 物料ID:" + bomLst.CmatNr) - } - var sfpMe meModel.BomLst - sfpMe.PlantNr = user.PlantNr - sfpMe.BomId = sfpBomHead.BomId - sfpBomLstLi, err := sfpMe.SetMenu(sfpBomHead.MatNr) - if err != nil { - return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) - } - if len(sfpBomLstLi) == 0 { - return grmi.NewBusinessError("未获取到BOM细则, 物料ID:" + bomHead.BomId) - } - sfpBomHead.BomLstLi = sfpBomLstLi - // 获取关联的所有零件ID - sfpArtMap := impl.ExtractArtId(sfpBomHead) - sfpArtIdLi := make([]string, 0, len(sfpArtMap)) - for innerArtId := range sfpArtMap { - sfpArtIdLi = append(sfpArtIdLi, innerArtId) - } - sfpArtIdLi = append(sfpArtIdLi, sfp.ArtId) - sfpAllArticleAttributeLi, err := articleWithAttrDao.SelectWithArticleByArtIdLi(sfpArtIdLi, projectId) - if err != nil { - return grmi.NewBusinessError("查询半成品关联所有属性失败, 错误:" + err.Error()) - } - auPoData, exist := poDataMap[auConfig.AuPo] - if !exist { - return grmi.NewBusinessError("半成品指定工序不存在于总工单的工序序列中, 半成品ID:" + sfp.ArtId) - } - // 根据该工序查询所有后序 - poDataLi := impl.GetOrderPOLi(auPoData, poDataMap) - // 该工单用到的所有生产工序 - poDataLi = append(poDataLi, auPoData) - // 查询这个工单需要用到的所有工艺数据 - poIdLi := make([]string, 0, len(poDataLi)) - for _, innerPoData := range poDataLi { - sfpUsedPoMap[innerPoData.PO] = nil - poIdLi = append(poIdLi, innerPoData.PO) - } - opLi, err := operationDao.GetMeOperation(sfpArtIdLi, projectId, poIdLi, workLineId) - if err != nil { - return grmi.NewBusinessError("获取工艺操作失败,error:" + err.Error()) - } - if len(opLi) == 0 { - return grmi.NewBusinessError("未获取到工艺数据") - } - // 所有需要生成工单工序绑定的数据 - orderPoMap[bomLst.CmatNr] = &model.OrderAUPoData{ - Config: auConfig, - MeOperationLi: opLi, - IsMainOrder: false, - SFP: sfp, - AllAttributeLi: sfpAllArticleAttributeLi, - ArtRelMap: sfpArtMap, + if auConfig.AuPlantNr != user.PlantNr { + // 所有需要生成工单工序绑定的数据 + orderPoMap[bomLst.CmatNr] = &model.OrderAUPoData{ + OtherPlant: true, + OtherPlantNr: auConfig.AuPlantNr, + ArtId: bomLst.CmatNr, + LastAuPo: auConfig.AuPo, + } + } else { + sfp, err := articleDao.SelectOne(bomLst.CmatNr, projectId) + if err != nil { + return grmi.NewBusinessError("查询物料失败, 错误:" + err.Error()) + } + if sfp == nil { + return grmi.NewBusinessError("半成品物料不存在, 物料ID:" + bomLst.CmatNr) + } + sfpBomHead, err := bomHeadDao.SelectOne(bomLst.CmatNr) + if err != nil { + return grmi.NewBusinessError("查询物料BOM失败, error:" + err.Error()) + } + if sfpBomHead == nil { + return grmi.NewBusinessError("不存在对应的物料BOM, 物料ID:" + bomLst.CmatNr) + } + var sfpMe meModel.BomLst + sfpMe.PlantNr = user.PlantNr + sfpMe.BomId = sfpBomHead.BomId + sfpBomLstLi, err := sfpMe.SetMenu(sfpBomHead.MatNr) + if err != nil { + return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) + } + if len(sfpBomLstLi) == 0 { + return grmi.NewBusinessError("未获取到BOM细则, 物料ID:" + bomHead.BomId) + } + sfpBomHead.BomLstLi = sfpBomLstLi + // 获取关联的所有零件ID + sfpArtMap := impl.ExtractArtId(sfpBomHead) + sfpArtIdLi := make([]string, 0, len(sfpArtMap)) + for innerArtId := range sfpArtMap { + sfpArtIdLi = append(sfpArtIdLi, innerArtId) + } + sfpArtIdLi = append(sfpArtIdLi, sfp.ArtId) + sfpAllArticleAttributeLi, err := articleWithAttrDao.SelectWithArticleByArtIdLi(sfpArtIdLi, projectId) + if err != nil { + return grmi.NewBusinessError("查询半成品关联所有属性失败, 错误:" + err.Error()) + } + auPoData, exist := poDataMap[auConfig.AuPo] + if !exist { + return grmi.NewBusinessError("半成品指定工序不存在于总工单的工序序列中, 半成品ID:" + sfp.ArtId) + } + // 根据该工序查询所有后序 + poDataLi := impl.GetOrderPOLi(auPoData, poDataMap) + // 该工单用到的所有生产工序 + poDataLi = append(poDataLi, auPoData) + // 查询这个工单需要用到的所有工艺数据 + poIdLi := make([]string, 0, len(poDataLi)) + for _, innerPoData := range poDataLi { + sfpUsedPoMap[innerPoData.PO] = nil + poIdLi = append(poIdLi, innerPoData.PO) + } + opLi, err := operationDao.GetMeOperation(sfpArtIdLi, projectId, poIdLi, workLineId) + if err != nil { + return grmi.NewBusinessError("获取工艺操作失败,error:" + err.Error()) + } + if len(opLi) == 0 { + return grmi.NewBusinessError("未获取到工艺数据") + } + // 所有需要生成工单工序绑定的数据 + orderPoMap[bomLst.CmatNr] = &model.OrderAUPoData{ + Config: auConfig, + MeOperationLi: opLi, + IsMainOrder: false, + SFP: sfp, + AllAttributeLi: sfpAllArticleAttributeLi, + ArtRelMap: sfpArtMap, + } } } mainOrderPOIdLi := make([]string, 0) @@ -281,6 +291,17 @@ func (impl *SerialOrderServiceImplement) GenerateProductCraft(user *global.User, for _, orderOPData := range orderPoMap { var serialOrderId string if !orderOPData.IsMainOrder { + // 如果是拆分到其他工厂 + if orderOPData.OtherPlant { + usedSerialOrder = &model.SerialOrder{ + PlantNr: orderOPData.OtherPlantNr, + ArtId: orderOPData.ArtId, + OrderType: baseModel.ORDER_TYPE_CROSS, + CtrlStr1: orderOPData.LastAuPo, + } + serialOrder.PreOrderLi = append(serialOrder.PreOrderLi, *usedSerialOrder) + continue + } usedArticle = orderOPData.SFP if orderOPData.Config.BarCodeRule == baseModel.BARCODE_RULE_ACURA_PRE { diff --git a/services/pln/implments/CustOrderLogic.service.impl.go b/services/pln/implments/CustOrderLogic.service.impl.go index 35caaf9..88aa635 100644 --- a/services/pln/implments/CustOrderLogic.service.impl.go +++ b/services/pln/implments/CustOrderLogic.service.impl.go @@ -525,7 +525,7 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO _ = session.Commit() return nil } - + crossPreOrderLi := make([]omModel.SerialOrder, 0) // 产线组与所属产线的MAP数据结构 workLineGroupMap := make(map[string]map[string]interface{}) workLineMap := make(map[string]baseModel.WorkLine) @@ -647,6 +647,10 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO copy(orderCraft.LabelHeadLi, serialOrder.LabelHeadLi) copy(orderCraft.LabelDetailLi, serialOrder.LabelDetailLi) for _, preOrder := range serialOrder.PreOrderLi { + if preOrder.OrderType == baseModel.ORDER_TYPE_CROSS { + crossPreOrderLi = append(crossPreOrderLi, preOrder) + continue + } newPreOrder := preOrder newPreOrder.SerialOrderPOLstLi = make([]omModel.SerialOrderPOLst, len(preOrder.SerialOrderPOLstLi), len(preOrder.SerialOrderPOLstLi)) newPreOrder.SerialOrderStepLstLi = make([]omModel.SerialOrderStepLst, len(preOrder.SerialOrderStepLstLi), len(preOrder.SerialOrderStepLstLi)) @@ -748,6 +752,9 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO writeLabelHeadLi = append(writeLabelHeadLi, serialOrder.LabelHeadLi...) writeLabelDetailLi = append(writeLabelDetailLi, serialOrder.LabelDetailLi...) for _, preOrder := range serialOrder.PreOrderLi { + if preOrder.OrderType == baseModel.ORDER_TYPE_CROSS { + continue + } writeSerialOrderLi = append(writeSerialOrderLi, preOrder) writeSerialOrderStatusLi = append(writeSerialOrderStatusLi, preOrder.SerialOrderStatus) writeSerialOrderPoLi = append(writeSerialOrderPoLi, preOrder.SerialOrderPOLstLi...) @@ -925,6 +932,33 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO log.Error("客户订单已经派工完成,但是并没有改变客户订单状态, 当前派工客户订单ID:" + custOrderData.CustOrderId) } log.Info("客户订单已经派工完成, 当前派工客户订单ID:" + custOrderData.CustOrderId) + if len(crossPreOrderLi) != 0 { + var artId, lastAuPo string + toPlantNr := crossPreOrderLi[0].PlantNr + fromPlantNr := user.PlantNr + for index, preOrder := range crossPreOrderLi { + if index == 0 { + artId += ";" + lastAuPo += ";" + } + artId += preOrder.ArtId + lastAuPo += preOrder.CtrlStr1 + } + CrossTask := baseModel.CrossPlanTask{ + FromPlantNr: fromPlantNr, + ToPlantNr: toPlantNr, + ProjectId: custOrderData.ProjectId, + ArtId: artId, + PlanQty: custOrderData.OrderQty.PlanQty, + Status: baseModel.CROSS_TASK_STATUS_PLAN, + SchedType: custOrderData.CtrlPara2, + SourceOrderId string `xorm:"nvarchar(40) 'SourceOrderId'" json:"CrossPlanTask-SourceOrderId"` + PlanStartTime grmi.DateTime `xorm:"datetime 'PlanStartTime'" json:"CrossPlanTask-PlanStartTime"` + PlanEndTime grmi.DateTime `xorm:"datetime 'PlanEndTime'" json:"CrossPlanTask-PlanEndTime"` + Priority int `xorm:"int 'Priority'" json:"CrossPlanTask-Priority"` + LastPo + } + } return nil }