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