Browse Source

添加字段sort 修改不再依赖单据打印的规则 新增工单拆分的接口

pull/94/head
zhangxin 3 years ago
parent
commit
adc81d7b7f
3 changed files with 618 additions and 27 deletions
  1. +3
    -1
      meta/om/WorkOrder.meta.go
  2. +1
    -0
      models/om/WorkOrder.model.go
  3. +614
    -26
      services/om/implments/WorkOrder.service.impl.go

+ 3
- 1
meta/om/WorkOrder.meta.go View File

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

+ 1
- 0
models/om/WorkOrder.model.go View File

@ -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"`


+ 614
- 26
services/om/implments/WorkOrder.service.impl.go View File

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

Loading…
Cancel
Save