diff --git a/services/om/implments/DemandHead.service.impl.go b/services/om/implments/DemandHead.service.impl.go index 1691aa5..9365bad 100644 --- a/services/om/implments/DemandHead.service.impl.go +++ b/services/om/implments/DemandHead.service.impl.go @@ -15,6 +15,7 @@ import ( model "LAPP_GAAS_GFrame_BACKEND/models/om" "LAPP_GAAS_GFrame_BACKEND/utils" "LAPP_GAAS_GFrame_BACKEND/web/models" + "fmt" "github.com/360EntSecGroup-Skylar/excelize" "strconv" "strings" @@ -352,16 +353,27 @@ func (impl *DemandHeadServiceImplement) UploadExcel(user *models.Usertab, filepa } demandHead := model.DemandHead{ FileName: filename, - Status: model.DemandHeadLoadingStatus, + Status: model.DemandHeadParsedStatus, Source: source, } err = demandHeadDao.InsertOne(&demandHead) if err != nil { return err } + if source == model.ParseSourceInterval { - return impl.SaveIntervalDataFromExcel(user, filepath, demandHead) + err = impl.SaveIntervalDataFromExcel(user, filepath, demandHead) + if err != nil { + demandHead.Status = model.DemandHeadLoadFailedStatus + fmt.Println(err.Error()) + demandHead.ErrorInfo = err.Error() + _ = demandHeadDao.UpdateOne(&demandHead) + return err + } else { + return err + } } else if source == model.ParseSourceMES { + go impl.SaveMesDataFromExcel(user, filepath, demandHead) } return nil @@ -864,14 +876,15 @@ func (impl *DemandHeadServiceImplement) SaveIntervalDataFromExcel(user *models.U } } } - snr := new(models.Snrtab) - snr.Finr = user.Pid - workOrderId, err := snr.GetNextSnrWithSession(session, project.WorkOrderSnr) - if err != nil { - _ = session.Rollback() - return grmi.NewBusinessError("获取工单流水号失败,错误:" + err.Error()) - } + if article.ArtSpec1 == baseModel.ART_SPEC_FG { + snr := new(models.Snrtab) + snr.Finr = user.Pid + workOrderId, err := snr.GetNextSnrWithSession(session, project.WorkOrderSnr) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取工单流水号失败,错误:" + err.Error()) + } workOrder := model.WorkOrder{ WorkOrderId: workOrderId, ArtId: article.ArtId, @@ -939,12 +952,15 @@ func (impl *DemandHeadServiceImplement) SaveIntervalDataFromExcel(user *models.U bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, bomHead.BomId)}, nil) if err != nil { _ = session.Rollback() - return grmi.NewBusinessError("未获取到BOM数据") + return grmi.NewBusinessError("查询BOM数据失败, error:" + err.Error()) + } + if len(bomLstLi) == 0 { + _ = session.Rollback() + return grmi.NewBusinessError("该物料没有配置BOM细则, 物料ID:" + article.ArtId) } composeBomLst := make([]meModel.BomLst, 0) for _, bomLst := range bomLstLi { if bomLst.FmatNr != bomHead.MatNr { - continue } newBomLst := impl.GetChildBomLst(&bomLstLi, bomLst) @@ -955,7 +971,18 @@ func (impl *DemandHeadServiceImplement) SaveIntervalDataFromExcel(user *models.U li := impl.GeneralWorkOrder(bomLst, 1) bomArtLi = append(bomArtLi, li...) } + if len(bomArtLi) == 0 { + _ = session.Rollback() + return grmi.NewBusinessError("该物料没有配置BOM细则, 物料ID:" + article.ArtId) + } for _, bomArt := range bomArtLi { + snr := new(models.Snrtab) + snr.Finr = user.Pid + workOrderId, err := snr.GetNextSnrWithSession(session, project.WorkOrderSnr) + if err != nil { + _ = session.Rollback() + return grmi.NewBusinessError("获取工单流水号失败,错误:" + err.Error()) + } sumArticle, err := artDao.SelectOne(bomArt.ArtId) if err != nil { _ = session.Rollback() diff --git a/services/om/implments/ParsePortalWorkOrder.service.impl.go b/services/om/implments/ParsePortalWorkOrder.service.impl.go index 4f012dd..bd9e700 100644 --- a/services/om/implments/ParsePortalWorkOrder.service.impl.go +++ b/services/om/implments/ParsePortalWorkOrder.service.impl.go @@ -9,6 +9,7 @@ import ( "LAPP_GAAS_GFrame_BACKEND/grmi" "LAPP_GAAS_GFrame_BACKEND/infra/logger" logMeta "LAPP_GAAS_GFrame_BACKEND/meta/log" + meMeta "LAPP_GAAS_GFrame_BACKEND/meta/me" meta "LAPP_GAAS_GFrame_BACKEND/meta/om" baseModel "LAPP_GAAS_GFrame_BACKEND/models/base" logModel "LAPP_GAAS_GFrame_BACKEND/models/log" @@ -59,7 +60,7 @@ func NewParseMesWorkOrderServiceImplement() *ParseMesWorkOrderServiceImplement { /****************************************************************************** * - * @Reference LAPP_GAAS_GFrame_BACKEND/services/om/ParseMesWorkOrder.OMParseDemandFromFile + * @Reference LAPP_GAAS_GFrame_BACKEND/services/om/ParseMesWorkOrder.`OMParseDemandFromFile` * ******************************************************************************/ func (impl *ParseMesWorkOrderServiceImplement) OMParseDemandFromFile(plantNr int) { @@ -532,7 +533,7 @@ func (impl *ParseMesWorkOrderServiceImplement) DealArtDemand(pid int, DemandCtrlPara6: lastSeq, DemandCtrlPara3: workOrder.OrderInfo, PlanResourceId: workOrder.PlanResourceId, - CancelQty: cancelQty, + CancelQty: cancelQty, } if artDemandHead.UnproducedQty == 0 { artDemandHead.DemandStatus = logModel.DemandOrderStatusAccomplish @@ -1009,6 +1010,8 @@ func (impl *ParseMesWorkOrderServiceImplement) DealIntervalFileDemandHead(demand workOrderDao := dal.NewWorkOrderDAO(sessionTX, demandHead.PlantNr, user) workOrderStatusDao := dal.NewWorkOrderStatusDAO(sessionTX, demandHead.PlantNr, user) workOrderQtyDao := dal.NewWorkOrderQtyDAO(sessionTX, demandHead.PlantNr, user) + bomLstDao := meDal.NewBomLstDAO(session, demandHead.PlantNr, user) + articleDao := baseDal.NewArticleDAO(session, demandHead.PlantNr, user) projectDao := meDal.NewProjectDAO(session, demandHead.PlantNr, user) project, err := projectDao.SelectOne(baseModel.ProjectId) @@ -1050,7 +1053,8 @@ func (impl *ParseMesWorkOrderServiceImplement) DealIntervalFileDemandHead(demand workOrderDao, workOrderStatusDao, workOrderQtyDao, - articleDao) + articleDao, + bomLstDao) if err != nil { demandHead.Status = model.DemandHeadUnParsedStatus demandHead.ErrNum += 1 @@ -1078,7 +1082,8 @@ func (impl *ParseMesWorkOrderServiceImplement) DealIntervalFileDemandHead(demand workOrderDao, workOrderStatusDao, workOrderQtyDao, - articleDao) + articleDao, + bomLstDao) if err != nil { demandHead.Status = model.DemandHeadUnParsedStatus demandHead.ErrNum += 1 @@ -1104,7 +1109,7 @@ func (impl *ParseMesWorkOrderServiceImplement) DealIntervalFileDemandHead(demand * @Reference LAPP_GAAS_GFrame_BACKEND/services/om/ParseMesWorkOrder.DealINTWorkOrder * ******************************************************************************/ -func (impl *ParseMesWorkOrderServiceImplement) DealINTWorkOrder(session *xorm.Session,pid int, +func (impl *ParseMesWorkOrderServiceImplement) DealINTWorkOrder(session *xorm.Session, pid int, project *meModel.Project, custOrder *model.CustOrder, qty float64, @@ -1112,6 +1117,7 @@ func (impl *ParseMesWorkOrderServiceImplement) DealINTWorkOrder(session *xorm.Se workOrderStatusDao dal.WorkOrderStatusDAO, workOrderQtyDao dal.WorkOrderQtyDAO, articleDao baseDal.ArticleDAO, + bomLstDao meDal.BomLstDAO, ) (err error) { user := "crontab" var workOrder model.WorkOrder @@ -1119,38 +1125,125 @@ func (impl *ParseMesWorkOrderServiceImplement) DealINTWorkOrder(session *xorm.Se var workOrderQty model.WorkOrderQty log, _ := logger.NewLogger(user, "OM") - workOrderLi, err := workOrderDao.SelectByEndDate(custOrder.ArtId, custOrder.DDT.Restore().Format("2006-01-02"), baseModel.ProjectId) + //workOrderLi, err := workOrderDao.SelectByEndDate(custOrder.ArtId, custOrder.DDT.Restore().Format("2006-01-02"), baseModel.ProjectId) + //if err != nil { + // return err + //} + //var newWorkOrderSign = true + //if len(workOrderLi) != 0 { + // for _, dbWorkOrder := range workOrderLi { + // if dbWorkOrder.WorkOrderStatus.Status != baseModel.WO_STATUS_UNPLANNED { + // workOrder = dbWorkOrder + // newWorkOrderSign = false + // break + // } + // } + //} + + //if newWorkOrderSign { + article, err := articleDao.SelectOne(custOrder.ArtId) if err != nil { + log.Error("DealINTWorkOrder DealWorkOrder get article failed, error: " + err.Error()) return err } - var newWorkOrderSign = true - if len(workOrderLi) != 0 { - for _, dbWorkOrder := range workOrderLi { - if dbWorkOrder.WorkOrderStatus.Status != baseModel.WO_STATUS_UNPLANNED { - workOrder = dbWorkOrder - newWorkOrderSign = false - break - } - } + if article == nil { + err = errors.New("不存在对应的物料, artID: " + custOrder.ArtId) + log.Error("DealINTWorkOrder DealWorkOrder get article failed, error: " + err.Error()) + return err + } + if article.Status != baseModel.ARTICLE_STATUS_USED { + log.Error("DealINTWorkOrder 物料未启用,物料ID:" + custOrder.ArtId) + return grmi.NewBusinessError("物料未启用,物料ID:" + custOrder.ArtId) } - if newWorkOrderSign { - article, err := articleDao.SelectOne(custOrder.ArtId) + // 根据不同的物料类型 创建批次工单 + if article.ArtSpec1 == "CarSet" { + // 派生的总成创建底下实际总成 + bomLstLi, err := bomLstDao.Select([]grmi.Predicate{meMeta.BomLst_BomId.NewPredicate(grmi.Equal, article.ArtId)}, []grmi.Field{meMeta.BomLst_Position}) if err != nil { - log.Error("DealINTWorkOrder DealWorkOrder get article failed, error: " + err.Error()) - return err + log.Error("DealINTWorkOrder 获取物料BOM数据失败, error:" + err.Error()) + return grmi.NewBusinessError("获取物料BOM数据失败, error:" + err.Error()) } - if article == nil { - err = errors.New("不存在对应的物料, artID: " + custOrder.ArtId) - log.Error("DealINTWorkOrder DealWorkOrder get article failed, error: " + err.Error()) - return err + if len(bomLstLi) == 0 { + log.Error("DealINTWorkOrder 创建的物料是派生, 但是未获取到BOM数据") + return grmi.NewBusinessError("创建的物料是派生, 但是未获取到BOM数据") } + for _, bomLst := range bomLstLi { + bomQty := bomLst.CmatQty / bomLst.FmatQty + productQty := qty * bomQty + bomArticle, err := articleDao.SelectOne(bomLst.CmatNr) + if err != nil { + log.Error("DealINTWorkOrder 查询物料数据失败,error:" + err.Error()) + return grmi.NewBusinessError("查询物料数据失败,error:" + err.Error()) + } + if bomArticle == nil { + log.Error("DealINTWorkOrder BOM关联的物料不存在, artId:" + bomLst.CmatNr) + return grmi.NewBusinessError("BOM关联的物料不存在, artId:" + bomLst.CmatNr) + } + if bomArticle.Status != baseModel.ARTICLE_STATUS_USED { + log.Error("DealINTWorkOrder 物料未启用,物料ID:" + bomArticle.ArtId) + return grmi.NewBusinessError("物料未启用,物料ID:" + bomArticle.ArtId) + } + snr := new(models.Snrtab) + snr.Finr = pid + workOrderId, err := snr.GetNextSnrWithSession(session, "WorkOrder") + if err != nil { + log.Error("DealINTWorkOrder 生成工单流水号失败, error:" + err.Error()) + return grmi.NewBusinessError("生成工单流水号失败, error:" + err.Error()) + } + workOrder = model.WorkOrder{ + WorkOrderId: workOrderId, + ArtId: bomArticle.ArtId, + OrderType: baseModel.ODER_TYPE_SEQ, + OrderInfo: bomArticle.Descr1, + OrderType1: custOrder.ArtTypeId, + PlanQty: productQty, + QtyUomId: bomArticle.UomId, + PlanResourceId: bomArticle.PlanResourceId, + UsedResourceId: bomArticle.UsedResourceId, + OpTimePerItem: bomArticle.OpTimePerItem, + PlanResourceGroupId: bomArticle.PlanResourceGroupId, + ProjectId: bomArticle.ProjectId, + QuantityPerHour: bomArticle.QuantityPerHour, + RatePerHourToggle: true, + BatchTime: bomArticle.BatchTime, + BatchingMethod: bomArticle.BatchingMethod, + PlanStartDate: grmi.Date(time.Now()), + PlanEndDate: grmi.Date(custOrder.DDT), + PlanEndTime: custOrder.DDT, + } + workOrderStatus = model.WorkOrderStatus{ + WorkOrderId: workOrderId, + Status: baseModel.WO_STATUS_UNPLANNED, + } + workOrderQty = model.WorkOrderQty{ + WorkOrderId: workOrderId, + PlanQty: productQty, + } + err = workOrderDao.InsertOne(&workOrder) + if err != nil { + log.Error("DealINTWorkOrder insert work order failed, error: " + err.Error()) + + return err + } + err = workOrderStatusDao.InsertOne(&workOrderStatus) + if err != nil { + log.Error("DealINTWorkOrder insert work order status failed, error: " + err.Error()) + + return err + } + err = workOrderQtyDao.InsertOne(&workOrderQty) + if err != nil { + log.Error("DealINTWorkOrder insert work order qty failed, error: " + err.Error()) + return err + } + } + } else { snr := new(models.Snrtab) snr.Finr = pid workOrderId, err := snr.GetNextSnrWithSession(session, project.WorkOrderSnr) if err != nil { log.Error("DealINTWorkOrder DealWorkOrder get work order id failed, error: " + err.Error()) - return err } workOrder = model.WorkOrder{ @@ -1199,17 +1292,19 @@ func (impl *ParseMesWorkOrderServiceImplement) DealINTWorkOrder(session *xorm.Se log.Error("DealINTWorkOrder insert work order qty failed, error: " + err.Error()) return err } - } else { - workOrderQty = workOrder.WorkOrderQty - if workOrderQty.PlanQty != qty { - workOrderQty.PlanQty = qty - err = workOrderQtyDao.UpdateOne(&workOrderQty) - if err != nil { - log.Error("DealINTWorkOrder DealWorkOrder update work order qty, error: " + err.Error()) - return err - } - } } + + //} else { + // workOrderQty = workOrder.WorkOrderQty + // if workOrderQty.PlanQty != qty { + // workOrderQty.PlanQty = qty + // err = workOrderQtyDao.UpdateOne(&workOrderQty) + // if err != nil { + // log.Error("DealINTWorkOrder DealWorkOrder update work order qty, error: " + err.Error()) + // return err + // } + // } + //} return nil } @@ -1541,7 +1636,7 @@ func (impl *ParseMesWorkOrderServiceImplement) DealCacheWorkOrder(pid int, ReleasedQty: qty, ActQty: finishedQty, ActQty1: runningQty, - ActQty3: cancelQty, + ActQty3: cancelQty, } err = workOrderDao.InsertOne(&workOrder) if err != nil { @@ -1610,7 +1705,7 @@ func (impl *ParseMesWorkOrderServiceImplement) DealCacheArtDemand(pid int, WorkOrderId: workOrder.WorkOrderId, DemandCtrlPara3: workOrder.OrderInfo, PlanResourceId: workOrder.PlanResourceId, - CancelQty: cancelQty, + CancelQty: cancelQty, } if artDemandHead.UnproducedQty == 0 { artDemandHead.DemandStatus = logModel.DemandOrderStatusAccomplish