diff --git a/meta/om/WorkOrder.meta.go b/meta/om/WorkOrder.meta.go index a80e42a..f5cd6f0 100644 --- a/meta/om/WorkOrder.meta.go +++ b/meta/om/WorkOrder.meta.go @@ -55,6 +55,7 @@ var WorkOrder_ActEndTime = grmi.NewField("ActEndTime", "OM_WorkOrder.ActEndTime" var WorkOrder_ProjectId = grmi.NewField("ProjectId", "OM_WorkOrder.ProjectId", "projectid", grmi.TypeString) var WorkOrder_CustomerId = grmi.NewField("CustomerId", "OM_WorkOrder.CustomerId", "customerid", grmi.TypeString) var WorkOrder_CustomerName = grmi.NewField("CustomerName", "OM_WorkOrder.CustomerName", "customername", grmi.TypeString) +var WorkOrder_Sort = grmi.NewField("Sort", "OM_WorkOrder.Sort", "sort", grmi.TypeString) var WorkOrder_FixStartTimeToggle = grmi.NewField("FixStartTimeToggle", "OM_WorkOrder.FixStartTimeToggle", "fixstarttimetoggle", grmi.TypeBool) var WorkOrder_LastModify = grmi.NewField("LastModify", "OM_WorkOrder.LastModify", "lastmodify", grmi.TypeDateTime) var WorkOrder_LastUser = grmi.NewField("LastUser", "OM_WorkOrder.LastUser", "lastuser", grmi.TypeString) @@ -112,10 +113,11 @@ var WorkOrder = grmi.NewEntity( WorkOrder_ProjectId.Name: WorkOrder_ProjectId, WorkOrder_CustomerId.Name: WorkOrder_CustomerId, WorkOrder_CustomerName.Name: WorkOrder_CustomerName, + WorkOrder_Sort.Name: WorkOrder_Sort, WorkOrder_FixStartTimeToggle.Name: WorkOrder_FixStartTimeToggle, WorkOrder_LastModify.Name: WorkOrder_LastModify, WorkOrder_LastUser.Name: WorkOrder_LastUser, WorkOrder_CreateTime.Name: WorkOrder_CreateTime, }, []string{"PlantNr"}, - []string{"ArtId", "CustArtId", "RouteTemplateId", "OrderType", "OrderType1", "OrderType2", "OrderInfo", "CustOrderId", "ErpOrderId", "ParentOrderId", "Priority", "PlanResourceGroupId", "PlanResourceId", "UsedResourceId", "PlanQty", "QtyUomId", "RatePerHourToggle", "TimePerItemToggle", "TimePerBatchToggle", "BatchTimeFieldToggle", "OpTimePerItem", "BatchTime", "QuantityPerHour", "BatchQuantity", "TimeUomId", "BatchingMethod", "PlanStartDate", "PlanEndDate", "SetupStartTime", "SetupEndTime", "PlanStartTime", "PlanEndTime", "ActStartTime", "ActEndTime", "ProjectId", "CustomerId", "CustomerName", "FixStartTimeToggle", "LastUser"}) + []string{"ArtId", "CustArtId", "RouteTemplateId", "OrderType", "OrderType1", "OrderType2", "OrderInfo", "CustOrderId", "ErpOrderId", "ParentOrderId", "Priority", "PlanResourceGroupId", "PlanResourceId", "UsedResourceId", "PlanQty", "QtyUomId", "RatePerHourToggle", "TimePerItemToggle", "TimePerBatchToggle", "BatchTimeFieldToggle", "OpTimePerItem", "BatchTime", "QuantityPerHour", "BatchQuantity", "TimeUomId", "BatchingMethod", "PlanStartDate", "PlanEndDate", "SetupStartTime", "SetupEndTime", "PlanStartTime", "PlanEndTime", "ActStartTime", "ActEndTime", "ProjectId", "CustomerId", "CustomerName", "Sort", "FixStartTimeToggle", "LastUser"}) diff --git a/models/om/WorkOrder.model.go b/models/om/WorkOrder.model.go index 7074c8b..0623caa 100644 --- a/models/om/WorkOrder.model.go +++ b/models/om/WorkOrder.model.go @@ -60,6 +60,7 @@ type WorkOrder struct { ProjectId string `xorm:"nvarchar(40) 'ProjectId' not null" json:"OM_WorkOrder-ProjectId"` CustomerId string `xorm:"nvarchar(40) 'CustomerId' not null" json:"OM_WorkOrder-CustomerId"` CustomerName string `xorm:"nvarchar(100) 'CustomerName' not null" json:"OM_WorkOrder-CustomerName"` + Sort string `xorm:"nvarchar(50) 'Sort' not null" json:"OM_WorkOrder-Sort"` LastModify grmi.DateTime `xorm:"datetime 'LastModify' not null updated" json:"OM_WorkOrder-LastModify"` LastUser string `xorm:"nvarchar(20) 'LastUser' not null" json:"OM_WorkOrder-LastUser"` CreateTime grmi.DateTime `xorm:"datetime 'CreateTime' not null created" json:"OM_WorkOrder-CreateTime"` diff --git a/services/om/implments/WorkOrder.service.impl.go b/services/om/implments/WorkOrder.service.impl.go index a858874..05192b4 100644 --- a/services/om/implments/WorkOrder.service.impl.go +++ b/services/om/implments/WorkOrder.service.impl.go @@ -74,6 +74,7 @@ var DefaultConditionOfWorkOrder = grmi.NewCondition( meta.WorkOrder_ProjectId.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_ProjectId, grmi.Equal, false), meta.WorkOrder_CustomerId.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_CustomerId, grmi.Equal, false), meta.WorkOrder_CustomerName.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_CustomerName, grmi.Equal, false), + meta.WorkOrder_Sort.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_Sort, grmi.Equal, false), meta.WorkOrder_FixStartTimeToggle.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_FixStartTimeToggle, grmi.Equal, false), meta.WorkOrder_LastModify.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_LastModify, grmi.Approximate, false), meta.WorkOrder_LastUser.UrlParameterName: grmi.NewConditionItem(meta.WorkOrder_LastUser, grmi.Equal, false), @@ -1582,7 +1583,7 @@ func (impl *WorkOrderServiceImplement) GuideRuleInfo(user *models.Usertab, sessi * @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.PrintRuleInfo 生成单据打印数据 * ******************************************************************************/ -func (impl *WorkOrderServiceImplement) PrintRuleInfo(user *models.Usertab, session *xorm.Session, printRule *baseModel.PrintRuleInfo, serialOrderStep *model.SerialOrderStepLst) error { +func (impl *WorkOrderServiceImplement) PrintRuleInfo(user *models.Usertab, session *xorm.Session, serialOrderStep *model.SerialOrderStepLst) error { var err error serialOrderDetailDao := dal.NewSerialOrderOPDetailDAO(session, user.Pid, user.Userid) @@ -1595,7 +1596,6 @@ func (impl *WorkOrderServiceImplement) PrintRuleInfo(user *models.Usertab, sessi StepType: baseModel.STEP_PRINT_RULE, Status: baseModel.WO_STATUS_LOCKED, StepNo: serialOrderStep.StepNo, - IntPara1: printRule.DisplayTime, } err = serialOrderDetailDao.InsertOne(&op) if err != nil { @@ -1626,7 +1626,6 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, articleWithAttrDao := baseDal.NewArticleAtcodLstDAO(session, user.Pid, user.Userid) scanRuleDao := baseDal.NewScanRuleInfoDAO(session, user.Pid, user.Userid) guideDao := baseDal.NewGuideRuleInfoDAO(session, user.Pid, user.Userid) - printDao := baseDal.NewPrintRuleInfoDAO(session, user.Pid, user.Userid) bomHeadDao := meDal.NewBomHeadDAO(session, user.Pid, user.Userid) bomLstDao := meDal.NewBomLstDAO(session, user.Pid, user.Userid) artWorkLineDao := baseDal.NewArtWorkLineLstDAO(session, user.Pid, user.Userid) @@ -1801,15 +1800,6 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, for _, guideRule := range guideRuleLi { guideRuleMap[guideRule.OperationId] = guideRule } - printLi, err := printDao.Select(nil, nil) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("查询单据打印规则失败, error:" + err.Error()) - } - printMap := make(map[int]baseModel.PrintRuleInfo, len(printLi)) - for _, printData := range printLi { - printMap[printData.OperationId] = printData - } snr := new(models.Snrtab) snr.Finr = user.Pid workOrderId, err := snr.GetNextSnrWithSession(session, project.WorkOrderSnr) @@ -1848,7 +1838,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, } workOrderQty := model.WorkOrderQty{ WorkOrderId: workOrderId, - PlanQty: float64(entity.Qty), + PlanQty: float64(productQty), } err = workOrderDao.InsertOne(&workOrder) if err != nil { @@ -1933,8 +1923,8 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, } else { artId = article.ArtId } - if entity.WorkLineId == "X243&X247" { - if i % 2 == 0 { + if entity.WorkLineId == "X243X247" { + if i%2 == 0 { snr := new(models.Snrtab) snr.Finr = user.Pid serialNum, err = snr.GetNextSnrWithSession(session, project.SerialOrderSnr) @@ -1952,8 +1942,8 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, return grmi.NewBusinessError("获取序列工单流水号失败, error:" + err.Error()) } } - - if entity.WorkLineId == "X243&X247" { + sortNum := serialNum + if entity.WorkLineId == "X243X247" { custArtId := custArtMap[artId] if len(custArtId) < 7 { @@ -1961,7 +1951,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, return grmi.NewBusinessError("客户零件号不合规") } serialOrderId = custArtId[:7] + "0000" + yearStr + monthStr + dayStr + "5" + serialNum - + sortNum = serialNum + strconv.Itoa(i) } else if entity.WorkLineId == "CN7C" || entity.WorkLineId == "IBK2" || entity.WorkLineId == "IBK2-2" { if len(artId) < 7 { _ = session.Rollback() @@ -1992,7 +1982,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, PlanStartTime: workOrder.PlanStartTime, PlanEndTime: workOrder.PlanEndTime, ProjectId: workOrder.ProjectId, - Sort: serialNum, + Sort: sortNum, } serialOrderLi = append(serialOrderLi, serialOrder) serialStatus := model.SerialOrderStatus{ @@ -2123,12 +2113,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab, return err } } else if serialOrderStep.StepType == baseModel.STEP_PRINT_RULE { - printRule, exist := printMap[serialOrderStep.OperationId] - if !exist { - _ = session.Rollback() - return grmi.NewBusinessError("未获取到单据打印的详细规则") - } - err = impl.PrintRuleInfo(user, session, &printRule, &serialOrderStep) + err = impl.PrintRuleInfo(user, session, &serialOrderStep) if err != nil { _ = session.Rollback() return err @@ -2162,6 +2147,609 @@ func (impl *WorkOrderServiceImplement) ExtractArtId(bomHead *meModel.BomHead) ma return artMap } -func (impl *WorkOrderServiceImplement) SplitWorkOrder() { +/****************************************************************************** +* +* @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.SplitWorkOrder 拆分工单 +* +******************************************************************************/ +func (impl *WorkOrderServiceImplement) SplitWorkOrder(user *models.Usertab, workOrderId string, qty int) error { + grmi.Log(user, "/services/om/implments/WorkOrder.service.impl.go", "SplitWorkOrder", "拆分的workOrder") + engine := db.Eloquent.Master() + session := engine.NewSession() + defer session.Close() + err := session.Begin() + if err != nil { + return err + } + dao := dal.NewWorkOrderDAO(session, user.Pid, user.Userid) + workOrderStatusDao := dal.NewWorkOrderStatusDAO(session, user.Pid, user.Userid) + workOrderStatusRecDao := dal.NewWorkOrderStatusRecLstDAO(session, user.Pid, user.Userid) + workOrderQtyDao := dal.NewWorkOrderQtyDAO(session, user.Pid, user.Userid) + serialOrderDao := dal.NewSerialOrderDAO(session, user.Pid, user.Userid) + serialOrderStatusDao := dal.NewSerialOrderStatusDAO(session, user.Pid, user.Userid) + serialOrderStatusRecDao := dal.NewSerialOrderStatusRecLstDAO(session, user.Pid, user.Userid) + + workOrder, err := dao.SelectOneJoin(workOrderId) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("查询批次工单失败, error:" + err.Error()) + } + if workOrder == nil { + _ = session.Rollback() + return grmi.NewBusinessError("不存在对应的批次工单") + } + // 计算未派工的工单数量 + unReleaseQty := workOrder.WorkOrderQty.PlanQty - workOrder.WorkOrderQty.ReleasedQty + if qty < int(unReleaseQty) { + _ = session.Rollback() + return grmi.NewBusinessError("未派工的数量不足") + } + // 判断如果所有拆分之后所有的序列工单都完成 则更改work order状态为80 + if int(workOrder.WorkOrderQty.ActQty)+qty == int(workOrder.WorkOrderQty.PlanQty) { + statusRec := model.WorkOrderStatusRecLst{ + WorkOrderId: workOrderId, + PrevStatus: workOrder.WorkOrderStatus.Status, + Status: baseModel.WO_STATUS_FINISHED, + } + err = workOrderStatusRecDao.InsertOne(&statusRec) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入批次工单状态变更记录失败, error:" + err.Error()) + } + workOrder.WorkOrderStatus.Status = baseModel.WO_STATUS_FINISHED + err = workOrderStatusDao.UpdateOne(&workOrder.WorkOrderStatus) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新批次工单状态失败, error" + err.Error()) + } + } + workOrder.WorkOrderQty.ActQty3 += float64(qty) + err = workOrderQtyDao.UpdateOne(&workOrder.WorkOrderQty) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("修改批次工单取消数量失败") + } + // 查询锁定状态的序列工单 修改拆分数量的序列工单状态为98 + serialOrderLi, err := serialOrderDao.SelectByWorkOrderId(workOrderId, baseModel.WO_STATUS_LOCKED) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("查询批次工单下序列工单失败, error:" + err.Error()) + } + if len(serialOrderLi) < qty { + _ = session.Rollback() + return grmi.NewBusinessError("未派工的序列工单不足") + } + cancelLi := serialOrderLi[len(serialOrderLi)-qty:] + for _, serialOrder := range cancelLi { + statusRec := model.SerialOrderStatusRecLst{ + SerialOrderId: serialOrder.SerialOrderId, + PrevStatus: serialOrder.SerialOrderStatus.Status, + Status: baseModel.WO_STATUS_CANCELED, + } + err = serialOrderStatusRecDao.InsertOne(&statusRec) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入序列工单状态变更记录失败, error:" + err.Error()) + } + serialOrder.SerialOrderStatus.Status = baseModel.WO_STATUS_CANCELED + err = serialOrderStatusDao.UpdateForStatus(&serialOrder.SerialOrderStatus, baseModel.WO_STATUS_LOCKED) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("更新序列工单状态失败, error:" + err.Error()) + } + } + sort := workOrder.WorkOrder.Sort + sortInt, err := strconv.Atoi(sort) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("解析拆分workOrder的Sort失败, error:" + err.Error()) + } + // 创建拆分的子工单 并在原有的sort上加1 + err = impl.CreateSplitWorkOrder(session, user, sortInt, workOrder.WorkOrder.ArtId, qty, workOrder.WorkOrder.UsedResourceId) + if err != nil { + _ = session.Rollback() + return err + } + _ = session.Commit() + return nil +} + +/****************************************************************************** +* +* @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.CreateSplitWorkOrder 生成拆分的子批次工单 +* +******************************************************************************/ +func (impl *WorkOrderServiceImplement) CreateSplitWorkOrder(session *xorm.Session, user *models.Usertab, sortId int, artId string, qty int, workLineId string) error { + dao := dal.NewSerialOrderDAO(session, user.Pid, user.Userid) + articleDao := baseDal.NewArticleDAO(session, user.Pid, user.Userid) + workOrderDao := dal.NewWorkOrderDAO(session, user.Pid, user.Userid) + statusDao := dal.NewWorkOrderStatusDAO(session, user.Pid, user.Userid) + qtyDao := dal.NewWorkOrderQtyDAO(session, user.Pid, user.Userid) + serialOrderStatusDao := dal.NewSerialOrderStatusDAO(session, user.Pid, user.Userid) + projectDao := meDal.NewProjectDAO(session, user.Pid, user.Userid) + operationDao := baseDal.NewOperationDAO(session, user.Pid, user.Userid) + PODao := dal.NewSerialOrderPOLstDAO(session, user.Pid, user.Userid) + stepDao := dal.NewSerialOrderStepLstDAO(session, user.Pid, user.Userid) + articleWithAttrDao := baseDal.NewArticleAtcodLstDAO(session, user.Pid, user.Userid) + scanRuleDao := baseDal.NewScanRuleInfoDAO(session, user.Pid, user.Userid) + guideDao := baseDal.NewGuideRuleInfoDAO(session, user.Pid, user.Userid) + bomHeadDao := meDal.NewBomHeadDAO(session, user.Pid, user.Userid) + 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(artId) + if err != nil { + return grmi.NewBusinessError("查询物料数据失败, error:" + err.Error()) + } + if article == nil { + return grmi.NewBusinessError("不存在对应的物料数据") + } + if article.ArtSpec1 != baseModel.ART_TYPE_FINISHED && article.ArtSpec1 != baseModel.ART_TYPE_VIRTUAL { + return grmi.NewBusinessError("传递的物料不是成品或虚拟物料ID") + } + workLineLi, err := artWorkLineDao.Select([]grmi.Predicate{baseMeta.ArtWorkLineLst_ArtId.NewPredicate(grmi.Equal, article.ArtId)}, nil) + if err != nil { + return grmi.NewBusinessError("查询物料关联产线失败, error:" + err.Error()) + } + var workLineExist bool + for _, workLineData := range workLineLi { + if workLineData.WorkLineId == workLineId { + workLineExist = true + } + } + if !workLineExist { + _ = session.Rollback() + return grmi.NewBusinessError("该总成不支持在该产线上生产") + } + // 虚拟件获取实际物料BOM及比例关系 + var virtualArtMap []map[string]int + var countMap map[string]int + productQty := qty + if article.ArtSpec1 == baseModel.ART_TYPE_VIRTUAL { + virtualArtMap = make([]map[string]int, 0) + countMap = make(map[string]int) + var count int + if article.ArtSpec1 == baseModel.ART_TYPE_VIRTUAL { + bomHead, err := bomHeadDao.SelectOne(article.ArtId) + if err != nil { + return grmi.NewBusinessError("获取物料BOM失败, error:" + err.Error()) + } + if bomHead == nil { + return grmi.NewBusinessError("不存在对应的物料BOM,artId:" + article.ArtId) + } + bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, nil) + if err != nil { + return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) + } + if len(bomLstLi) == 0 { + return grmi.NewBusinessError("未获取到BOM细则, artId:" + bomHead.BomId) + } + for _, bomLst := range bomLstLi { + if int(bomLst.FmatQty) != 1 || bomLst.FmatNr != bomLst.BomId { + return grmi.NewBusinessError("虚拟件BOM配置错误") + } + bMap := make(map[string]int) + bMap[bomLst.CmatNr] = int(bomLst.CmatQty) + virtualArtMap = append(virtualArtMap, bMap) + count += int(bomLst.CmatQty) + } + } + 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 _, artData := range virtualArtMap { + for artId := range artData { + bomHead, err := bomHeadDao.SelectOne(artId) + if err != nil { + return grmi.NewBusinessError("查询物料BOM失败, error:" + err.Error()) + } + if bomHead == nil { + 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 { + return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) + } + if len(bomList) == 0 { + return grmi.NewBusinessError("未获取到BOM细则, artId:" + bomHead.BomId) + } + bomHead.BomLstLi = bomList + bomHeadMap[bomHead.MatNr] = *bomHead + } + } + } else { + bomHead, err := bomHeadDao.SelectOne(article.ArtId) + if err != nil { + return grmi.NewBusinessError("查询物料BOM失败, error:" + err.Error()) + } + if bomHead == nil { + return grmi.NewBusinessError("不存在对应的物料BOM, artId:" + article.ArtId) + } + var Me meModel.BomLst + Me.PlantNr = user.Pid + Me.BomId = bomHead.BomId + bomList, err := Me.SetMenu(bomHead.MatNr) + if err != nil { + return grmi.NewBusinessError("获取BOM细则失败, error:" + err.Error()) + } + if len(bomList) == 0 { + return grmi.NewBusinessError("未获取到BOM细则, artId:" + bomHead.BomId) + } + bomHead.BomLstLi = bomList + bomHeadMap[bomHead.MatNr] = *bomHead + } + // 获取项目数据 用于获取流水号 + project, err := projectDao.SelectOne(article.ProjectId) + if err != nil { + return grmi.NewBusinessError("获取项目数据失败, error:" + err.Error()) + } + if project == nil { + return grmi.NewBusinessError("不存在该项目数据") + } + scanRuleLi, err := scanRuleDao.Select(nil, nil) + if err != nil { + return grmi.NewBusinessError("查询扫码校验条码失败, error:" + err.Error()) + } + scanRuleMap := make(map[int]baseModel.ScanRuleInfo) + for _, scanRule := range scanRuleLi { + scanRuleMap[scanRule.OperationId] = scanRule + } + guideRuleLi, err := guideDao.Select(nil, nil) + if err != nil { + return grmi.NewBusinessError("查询指导操作规则失败, error:" + err.Error()) + } + guideRuleMap := make(map[int]baseModel.GuideRuleInfo, len(guideRuleLi)) + for _, guideRule := range guideRuleLi { + guideRuleMap[guideRule.OperationId] = guideRule + } + snr := new(models.Snrtab) + snr.Finr = user.Pid + workOrderId, err := snr.GetNextSnrWithSession(session, project.WorkOrderSnr) + if err != nil { + return grmi.NewBusinessError("生成工单流水号失败") + } + workOrder := model.WorkOrder{ + WorkOrderId: workOrderId, + ArtId: article.ArtId, + CustArtId: article.CustArtId, + OrderType: baseModel.ODER_TYPE_INTERVAL, + OrderInfo: article.Descr1, + PlanResourceGroupId: article.PlanResourceGroupId, + PlanResourceId: workLineId, + UsedResourceId: workLineId, + PlanQty: float64(qty), + QtyUomId: article.UomId, + RatePerHourToggle: article.RatePerHourToggle, + TimePerItemToggle: article.TimePerItemToggle, + TimePerBatchToggle: article.TimePerBatchToggle, + BatchTimeFieldToggle: article.BatchTimeFieldToggle, + OpTimePerItem: article.OpTimePerItem, + BatchTime: article.BatchTime, + QuantityPerHour: article.QuantityPerHour, + BatchingMethod: article.BatchingMethod, + PlanStartDate: grmi.Date(time.Now()), + PlanEndDate: grmi.Date(time.Now()), + PlanStartTime: grmi.DateTime(time.Now()), + PlanEndTime: grmi.DateTime(time.Now()), + ProjectId: article.ProjectId, + Sort: strconv.Itoa(sortId + 1), + } + workOrderStatus := model.WorkOrderStatus{ + WorkOrderId: workOrderId, + Status: baseModel.WO_STATUS_LOCKED, + } + workOrderQty := model.WorkOrderQty{ + WorkOrderId: workOrderId, + PlanQty: float64(qty), + } + err = workOrderDao.InsertOne(&workOrder) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入批次工单失败, error:" + err.Error()) + } + err = statusDao.InsertOne(&workOrderStatus) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入批次工单状态失败, error:" + err.Error()) + } + err = qtyDao.InsertOne(&workOrderQty) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入批次工单数量失败, error:" + err.Error()) + } + attributeLi, err := articleWithAttrDao.SelectAllWithAttrValue() + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("查询零件属性失败,error:" + err.Error()) + } + attributeMap := make(map[int][]baseModel.ArticleWithAttrValue) + for _, data := range attributeLi { + _, exist := attributeMap[data.ArticleAtcodLst.AttrCode] + if !exist { + attributeMap[data.ArticleAtcodLst.AttrCode] = make([]baseModel.ArticleWithAttrValue, 0) + } + attributeMap[data.ArticleAtcodLst.AttrCode] = append(attributeMap[data.ArticleAtcodLst.AttrCode], data) + } + + serialOrderLi := make([]model.SerialOrder, 0, qty) + serialOrderStatusLi := make([]model.SerialOrderStatus, 0, qty) + 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()) + } + if art == nil { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到物料数据, artID:" + artId) + } + 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 _, artData := range virtualArtMap { + for innerArtId, qty := range artData { + if countMap[innerArtId] < qty { + accomplish = false + } + } + } + if accomplish { + for countArtId := range countMap { + countMap[countArtId] = 0 + } + } + 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 workLineId == "X243X247" { + 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()) + } + } + sortNum := serialNum + if workLineId == "X243X247" { + + custArtId := custArtMap[artId] + if len(custArtId) < 7 { + _ = session.Rollback() + return grmi.NewBusinessError("客户零件号不合规") + } + serialOrderId = custArtId[:7] + "0000" + yearStr + monthStr + dayStr + "5" + serialNum + sortNum = serialNum + strconv.Itoa(i) + } else if workLineId == "CN7C" || workLineId == "IBK2" || 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, + ArtId: artId, + OrderType1: workOrder.OrderType1, + OrderType2: workOrder.OrderType2, + PlanResourceId: workOrder.PlanResourceId, + UsedResourceId: workOrder.UsedResourceId, + PlanQty: 1, + QtyUomId: workOrder.QtyUomId, + OpTimePerItem: workOrder.OpTimePerItem, + TimeUomId: workOrder.TimeUomId, + PlanStartDate: workOrder.PlanStartDate, + PlanEndDate: workOrder.PlanEndDate, + SetupStartTime: workOrder.SetupStartTime, + SetupEndTime: workOrder.SetupEndTime, + PlanStartTime: workOrder.PlanStartTime, + PlanEndTime: workOrder.PlanEndTime, + ProjectId: workOrder.ProjectId, + Sort: sortNum, + } + serialOrderLi = append(serialOrderLi, serialOrder) + serialStatus := model.SerialOrderStatus{ + Status: baseModel.WO_STATUS_LOCKED, + SerialOrderId: serialOrderId, + } + serialOrderStatusLi = append(serialOrderStatusLi, serialStatus) + } + for _, serialOrder := range serialOrderLi { + err = dao.InsertOne(&serialOrder) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入序列工单数据失败,error:" + err.Error()) + } + } + for _, serialOrderStatus := range serialOrderStatusLi { + err = serialOrderStatusDao.InsertOne(&serialOrderStatus) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入序列工单状态失败,error:" + err.Error()) + } + } + // 生成序列工单对应的工艺数据 + opMap := make(map[string][]baseModel.OperationRelData) + totalArtMap := make(map[string]map[string]int) + for artId, bomHead := range bomHeadMap { + artMap := impl.ExtractArtId(&bomHead) + artIdLi := make([]string, 0, len(artMap)) + for innerArtId := range artMap { + artIdLi = append(artIdLi, innerArtId) + } + opLi, err := operationDao.GetOperationRelData(artIdLi, workOrder.PlanResourceId, article.ProjectId) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取工艺操作失败,error:" + err.Error()) + } + if len(opLi) == 0 { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到工艺数据") + } + opMap[artId] = opLi + totalArtMap[artId] = artMap + } + + allocateMap := make(map[string][]baseModel.ArtQtyAllocate) + checkRuleMap := make(map[string]baseModel.ArtCheckRule) + opcBasicMap := make(map[int][]baseModel.OPCBasicComInfo) + twMap := make(map[int][]baseModel.TightenWrenchInfo) + for _, serialOrder := range serialOrderLi { + opLi := opMap[serialOrder.ArtId] + artRelMap := totalArtMap[serialOrder.ArtId] + var PO int + processPos := 1 + opPos := 1 + for _, op := range opLi { + if PO != op.Process.PO { + PO = op.Process.PO + serialOrderWorkPlace := model.SerialOrderPOLst{ + SerialOrderId: serialOrder.SerialOrderId, + PO: PO, + Status: baseModel.WO_STATUS_LOCKED, + HasDependOn: op.Process.HasDependOn, + } + err = PODao.InsertOne(&serialOrderWorkPlace) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入serialOrder工序数据失败,error:" + err.Error()) + } + processPos++ + + } + serialOrderStep := model.SerialOrderStepLst{ + PO: op.Process.PO, + OperationId: op.OperationId, + SerialOrderId: serialOrder.SerialOrderId, + StepNo: op.Operation.StepNo, + Pos: opPos, + SubArtId: op.ArticleAtcodLst.ArtId, + StepDesc: op.Operation.StepDesc, + AttrCode: op.ArticleAtcodLst.AttrCode, + AttrValue: op.ArticleAtcodLst.AttrValue, + StepType: op.Operation.StepType, + Status: baseModel.WO_STATUS_LOCKED, + } + opPos++ + err = stepDao.InsertOne(&serialOrderStep) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("插入序列工单工艺数据失败, error:" + err.Error()) + } + if serialOrderStep.StepType == baseModel.STEP_CHECK_RULE { // 生成扫码校验的工艺数据 + scanRule, exist := scanRuleMap[serialOrderStep.OperationId] + if !exist { + return grmi.NewBusinessError("未获取到扫描校验详细规则") + } + + checkRuleMapPointer, allocateMapPointer, err := impl.ScanCodeCheck(user, session, checkRuleMap, allocateMap, artRelMap, &scanRule, &op, &serialOrderStep) + if err != nil { + _ = session.Rollback() + return err + } + checkRuleMap = *checkRuleMapPointer + allocateMap = *allocateMapPointer + } else if serialOrderStep.StepType == baseModel.STEP_OPC_RULE { // 生成OPC通讯的工艺数据 + + opcBasicMapPointer, err := impl.OPCCommunication(user, session, opcBasicMap, &serialOrderStep, attributeMap, workOrderId, artRelMap) + if err != nil { + _ = session.Rollback() + return err + } + opcBasicMap = *opcBasicMapPointer + } else if serialOrderStep.StepType == baseModel.STEP_TW_RULE { // 生成开发协议的工艺数据 + twMapPointer, err := impl.TightenWrenchInfo(user, session, twMap, &serialOrderStep) + if err != nil { + _ = session.Rollback() + return err + } + twMap = *twMapPointer + } else if serialOrderStep.StepType == baseModel.STEP_GUIDE_RULE { + guideRule, exist := guideRuleMap[serialOrderStep.OperationId] + if !exist { + _ = session.Rollback() + return grmi.NewBusinessError("未获取到指导操作的详细规则") + } + err = impl.GuideRuleInfo(user, session, &guideRule, &serialOrderStep) + if err != nil { + _ = session.Rollback() + return err + } + } else if serialOrderStep.StepType == baseModel.STEP_PRINT_RULE { + err = impl.PrintRuleInfo(user, session, &serialOrderStep) + if err != nil { + _ = session.Rollback() + return err + } + } else { + _ = session.Rollback() + return grmi.NewBusinessError("获取到的工艺数据系统暂不支持该操作类型:" + serialOrderStep.StepType) + } + } + } + _ = session.Commit() + return nil } \ No newline at end of file