From bbd395c996581b7d9ea02857ad0e9954e2f99058 Mon Sep 17 00:00:00 2001 From: zhangxin Date: Thu, 2 Sep 2021 10:04:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=94=9F=E6=88=90=E5=B7=A5?= =?UTF-8?q?=E8=89=BAbom=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../om/implments/WorkOrder.service.impl.go | 193 ++++++++++++------ 1 file changed, 135 insertions(+), 58 deletions(-) diff --git a/services/om/implments/WorkOrder.service.impl.go b/services/om/implments/WorkOrder.service.impl.go index 96011a2..a858874 100644 --- a/services/om/implments/WorkOrder.service.impl.go +++ b/services/om/implments/WorkOrder.service.impl.go @@ -7,10 +7,7 @@ import ( meDal "LAPP_LF_MOM_BACKEND/dao/me" baseMeta "LAPP_LF_MOM_BACKEND/meta/base" meModel "LAPP_LF_MOM_BACKEND/models/me" - "fmt" "github.com/go-xorm/xorm" - "strings" - //logDal "LAPP_LF_MOM_BACKEND/dao/log" dal "LAPP_LF_MOM_BACKEND/dao/om" "LAPP_LF_MOM_BACKEND/db" @@ -1634,6 +1631,19 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, bomLstDao := meDal.NewBomLstDAO(session, user.Pid, user.Userid) artWorkLineDao := baseDal.NewArtWorkLineLstDAO(session, user.Pid, user.Userid) // 校验物料属性 + now := time.Now() + year := now.Year() + day := now.Day() + var dayStr string + if day >= 10 { + dayStr = strconv.Itoa(day) + } else { + dayStr = "0" + strconv.Itoa(day) + } + month := int(now.Month()) + yearStr := baseModel.YEAR_MAP[year] + monthStr := baseModel.MONTH_MAP[month] + article, err := articleDao.SelectOne(entity.ArtId) if err != nil { _ = session.Rollback() @@ -1662,12 +1672,12 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, _ = session.Rollback() return grmi.NewBusinessError("该总成不支持在该产线上生产") } - fmt.Println("--------------------------------------") // 虚拟件获取实际物料BOM及比例关系 - var virtualArtMap map[string]int + var virtualArtMap []map[string]int var countMap map[string]int + productQty := entity.Qty if article.ArtSpec1 == baseModel.ART_TYPE_VIRTUAL { - virtualArtMap = make(map[string]int) + virtualArtMap = make([]map[string]int, 0) countMap = make(map[string]int) var count int @@ -1695,45 +1705,48 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, _ = session.Rollback() return grmi.NewBusinessError("虚拟件BOM配置错误") } - virtualArtMap[bomLst.CmatNr] = int(bomLst.CmatQty) + bMap := make(map[string]int) + bMap[bomLst.CmatNr] = int(bomLst.CmatQty) + virtualArtMap = append(virtualArtMap, bMap) count += int(bomLst.CmatQty) } } - if entity.Qty%count != 0 { - _ = session.Rollback() - return grmi.NewBusinessError("创建工单的生产数量不能匹配BOM分配关系") - } - for artId := range virtualArtMap { - countMap[artId] = 0 + for _, artData := range virtualArtMap { + for artId := range artData { + countMap[artId] = 0 + } } + productQty = productQty * count } // 组装BOM切片 bomHeadMap := make(map[string]meModel.BomHead, 0) if article.ArtSpec1 == baseModel.ART_TYPE_VIRTUAL { - for artId := range virtualArtMap { - bomHead, err := bomHeadDao.SelectOne(artId) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("查询物料BOM失败, error:" + err.Error()) - } - if bomHead == nil { - _ = session.Rollback() - return grmi.NewBusinessError("不存在对应的物料BOM, artId:" + artId) - } - var Me meModel.BomLst - Me.PlantNr = user.Pid - Me.BomId = bomHead.BomId - bomList, err := Me.SetMenu(bomHead.MatNr) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) - } - if len(bomList) == 0 { - _ = session.Rollback() - return grmi.NewBusinessError("未获取到BOM细则, artId:" + bomHead.BomId) + for _, artData := range virtualArtMap { + for artId := range artData { + bomHead, err := bomHeadDao.SelectOne(artId) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("查询物料BOM失败, error:" + err.Error()) + } + if bomHead == nil { + _ = session.Rollback() + return grmi.NewBusinessError("不存在对应的物料BOM, artId:" + artId) + } + var Me meModel.BomLst + Me.PlantNr = user.Pid + Me.BomId = bomHead.BomId + bomList, err := Me.SetMenu(bomHead.MatNr) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) + } + if len(bomList) == 0 { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到BOM细则, artId:" + bomHead.BomId) + } + bomHead.BomLstLi = bomList + bomHeadMap[bomHead.MatNr] = *bomHead } - bomHead.BomLstLi = bomList - bomHeadMap[bomHead.MatNr] = *bomHead } } else { bomHead, err := bomHeadDao.SelectOne(article.ArtId) @@ -1761,7 +1774,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, bomHeadMap[bomHead.MatNr] = *bomHead } // 获取项目数据 用于获取流水号 - project, err := projectDao.SelectOne(baseModel.ProjectId) + project, err := projectDao.SelectOne(article.ProjectId) if err != nil { _ = session.Rollback() return grmi.NewBusinessError("获取项目数据失败, error:" + err.Error()) @@ -1827,7 +1840,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, PlanEndDate: grmi.Date(time.Now()), PlanStartTime: grmi.DateTime(time.Now()), PlanEndTime: grmi.DateTime(time.Now()), - ProjectId: project.ProjectId, + ProjectId: article.ProjectId, } workOrderStatus := model.WorkOrderStatus{ WorkOrderId: workOrderId, @@ -1868,44 +1881,98 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, serialOrderLi := make([]model.SerialOrder, 0, entity.Qty) serialOrderStatusLi := make([]model.SerialOrderStatus, 0, entity.Qty) - - // 进行批次工单的时间拆解到序列工单的计划时间上 - // 生成序列工单 - for i := 0; i < entity.Qty; i++ { - snr := new(models.Snrtab) - snr.Finr = user.Pid - serialNum, err := snr.GetNextSnrWithSession(session, project.SerialOrderSnr) + custArtMap := make(map[string]string) + for artId := range countMap { + art, err := articleDao.SelectOne(artId) if err != nil { _ = session.Rollback() - return grmi.NewBusinessError("获取序列工单流水号失败, error:" + err.Error()) + return grmi.NewBusinessError("获取物料数据失败, error:" + err.Error()) + } + if art == nil { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到物料数据, artID:" + artId) } - planStartDate := workOrder.PlanStartDate.Restore().Format("20060102") - prefix := workOrder.ArtId + baseModel.PlantName + planStartDate - serialOrderId := strings.Replace(serialNum, "SO-", prefix, 1) + custArtMap[artId] = art.CustArtId + } + // 进行批次工单的时间拆解到序列工单的计划时间上 + var serialNum string + // 生成序列工单 + for i := 0; i < productQty; i++ { + var serialOrderId string + // 根据虚拟件还是总成件 来获取ArtId var artId string if article.ArtSpec1 == baseModel.ART_TYPE_VIRTUAL { accomplish := true - for innerArtId, qty := range virtualArtMap { - if countMap[innerArtId] < qty { - accomplish = false + for _, artData := range virtualArtMap { + for innerArtId, qty := range artData { + if countMap[innerArtId] < qty { + accomplish = false + } } } if accomplish { - for artId := range countMap { - countMap[artId] = 0 + for countArtId := range countMap { + countMap[countArtId] = 0 } } - for innerArtId, qty := range virtualArtMap { - if countMap[innerArtId] < qty { - artId = innerArtId - countMap[innerArtId] += 1 + for _, artData := range virtualArtMap { + var sign bool + for innerArtId, qty := range artData { + if countMap[innerArtId] < qty { + artId = innerArtId + countMap[innerArtId] += 1 + sign = true + break + } + } + if sign { break } } } else { artId = article.ArtId } + if entity.WorkLineId == "X243&X247" { + if i % 2 == 0 { + snr := new(models.Snrtab) + snr.Finr = user.Pid + serialNum, err = snr.GetNextSnrWithSession(session, project.SerialOrderSnr) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取序列工单流水号失败, error:" + err.Error()) + } + } + } else { + snr := new(models.Snrtab) + snr.Finr = user.Pid + serialNum, err = snr.GetNextSnrWithSession(session, project.SerialOrderSnr) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取序列工单流水号失败, error:" + err.Error()) + } + } + + if entity.WorkLineId == "X243&X247" { + + custArtId := custArtMap[artId] + if len(custArtId) < 7 { + _ = session.Rollback() + return grmi.NewBusinessError("客户零件号不合规") + } + serialOrderId = custArtId[:7] + "0000" + yearStr + monthStr + dayStr + "5" + serialNum + + } else if entity.WorkLineId == "CN7C" || entity.WorkLineId == "IBK2" || entity.WorkLineId == "IBK2-2" { + if len(artId) < 7 { + _ = session.Rollback() + return grmi.NewBusinessError("零件号不合规") + } + serialOrderId = "0" + artId[:7] + "000" + yearStr + monthStr + dayStr + serialNum + } else { + _ = session.Rollback() + return grmi.NewBusinessError("暂不支持的产线") + } + serialOrder := model.SerialOrder{ WorkOrderId: workOrderId, SerialOrderId: serialOrderId, @@ -1925,6 +1992,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, PlanStartTime: workOrder.PlanStartTime, PlanEndTime: workOrder.PlanEndTime, ProjectId: workOrder.ProjectId, + Sort: serialNum, } serialOrderLi = append(serialOrderLi, serialOrder) serialStatus := model.SerialOrderStatus{ @@ -2075,6 +2143,11 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, return nil } +/****************************************************************************** +* +* @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.PrintRuleInfo 生成单据打印数据 +* +******************************************************************************/ func (impl *WorkOrderServiceImplement) ExtractArtId(bomHead *meModel.BomHead) map[string]int { artMap := make(map[string]int) bomLstLi := bomHead.BomLstLi @@ -2088,3 +2161,7 @@ func (impl *WorkOrderServiceImplement) ExtractArtId(bomHead *meModel.BomHead) ma } return artMap } + +func (impl *WorkOrderServiceImplement) SplitWorkOrder() { + +} \ No newline at end of file