Browse Source

调整生成工艺bom的逻辑

pull/93/head
zhangxin 3 years ago
parent
commit
bbd395c996
1 changed files with 135 additions and 58 deletions
  1. +135
    -58
      services/om/implments/WorkOrder.service.impl.go

+ 135
- 58
services/om/implments/WorkOrder.service.impl.go View File

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

Loading…
Cancel
Save