Browse Source

创建订单需要指定workLineId 同时修改opc映射值获取映射值得规则

pull/93/head
zhangxin 3 years ago
parent
commit
c6324dba97
5 changed files with 179 additions and 89 deletions
  1. +2
    -0
      models/base/Const.go
  2. +7
    -3
      models/base/base.go
  3. +4
    -3
      models/om/om.go
  4. +9
    -2
      services/base/implments/OPCBasicComInfo.service.impl.go
  5. +157
    -81
      services/om/implments/WorkOrder.service.impl.go

+ 2
- 0
models/base/Const.go View File

@ -132,6 +132,8 @@ const (
SCAN_RULE_TYPE_OTHER = "自主条码"
SCAN_RULE_SERIALORDER = "UNITSN"
SCAN_RULE_CHECK = "校验"
SCAN_RULE_CRWAL = "采集"
TRIGGER_FROM_BARCODE = "自主条码"
TRIGGER_DEPEND_ON_UNITSN = "UNITSN"

+ 7
- 3
models/base/base.go View File

@ -184,15 +184,19 @@ type ScanRuleInfoData struct {
ScanRuleInfoLi []ScanRuleInfo `json:"scanRuleInfoLi"`
}
// 指导操作插入前端绑定结构体
type GuideRuleInfoData struct {
OperationId int `json:"operationId"`
OperationId int `json:"operationId"`
GuideRuleInfoLi []GuideRuleInfo `json:"guideRuleInfoLi"`
}
// 指导操作插入前端绑定结构体
type PrintRuleInfoData struct {
OperationId int `json:"operationId"`
OperationId int `json:"operationId"`
PrintRuleInfoLi []PrintRuleInfo `json:"printRuleInfoLi"`
}
type ArticleWithAttrValue struct {
ArticleAtcodLst `xorm:"extends"`
AttributeValst `xorm:"extends"`
}

+ 4
- 3
models/om/om.go View File

@ -112,6 +112,7 @@ type TempDemandLstData struct {
// 创建序列工单 前端传递数据绑定的结构体
type CreateLockWorkOrder struct {
ArtId string `json:"artId"`
Qty int `json:"qty"`
}
ArtId string `json:"artId"`
Qty int `json:"qty"`
WorkLineId string `json:"workLineId"`
}

+ 9
- 2
services/base/implments/OPCBasicComInfo.service.impl.go View File

@ -261,18 +261,21 @@ func (impl *OPCBasicComInfoServiceImplement) SelectOne(user *models.Usertab, ope
if result == nil {
return nil, grmi.NewBusinessError("数据不存在")
}
ruleLi, err := ruleDao.Select([]grmi.Predicate{meta.OPCComRule_OperationId.NewPredicate(grmi.Equal, operationId)}, nil)
ruleLi, err := ruleDao.Select([]grmi.Predicate{meta.OPCComRule_OperationId.NewPredicate(grmi.Equal, operationId)}, []grmi.Field{meta.OPCComRule_RuleId})
if err != nil {
return nil, err
}
for index, rule := range ruleLi {
if rule.DBlockValueType == model.DBlockValueType_VALUE_MAP {
detailLi, err := detailDao.Select([]grmi.Predicate{meta.OPCComDetailRule_OperationId.NewPredicate(grmi.Equal, operationId), meta.OPCComDetailRule_RuleId.NewPredicate(grmi.Equal, rule.RuleId)}, nil)
detailLi, err := detailDao.Select([]grmi.Predicate{meta.OPCComDetailRule_OperationId.NewPredicate(grmi.Equal, operationId), meta.OPCComDetailRule_RuleId.NewPredicate(grmi.Equal, rule.RuleId)}, []grmi.Field{meta.OPCComDetailRule_RuleId})
if err != nil {
return nil, err
}
rule.OPCComDetailRuleLi = detailLi
ruleLi[index] = rule
} else {
rule.OPCComDetailRuleLi = make([]model.OPCComDetailRule, 0)
ruleLi[index] = rule
}
}
result.OPCComRuleLi = ruleLi
@ -330,6 +333,8 @@ func (impl *OPCBasicComInfoServiceImplement) UpdateOne(user *models.Usertab, ent
rule.StepNo = entity.StepNo
rule.StepDesc = entity.StepDesc
rule.OperationId = entity.OperationId
rule.WorkPlaceNr = entity.WorkPlaceNr
rule.ProjectId = entity.ProjectId
if rule.DBlockValueType == model.DBlockValueType_VALUE_MAP {
if len(rule.OPCComDetailRuleLi) == 0 {
_ = session.Rollback()
@ -345,6 +350,8 @@ func (impl *OPCBasicComInfoServiceImplement) UpdateOne(user *models.Usertab, ent
detail.RuleId = rule.RuleId
detail.StepDesc = rule.StepDesc
detail.OperationId = rule.OperationId
detail.ProjectId = rule.ProjectId
detail.WorkPlaceNr = rule.WorkPlaceNr
rule.OPCComDetailRuleLi[index] = detail
}
err = detailDao.Insert(&rule.OPCComDetailRuleLi)


+ 157
- 81
services/om/implments/WorkOrder.service.impl.go View File

@ -6,6 +6,7 @@ import (
baseDal "LAPP_LF_MOM_BACKEND/dao/base"
meDal "LAPP_LF_MOM_BACKEND/dao/me"
baseMeta "LAPP_LF_MOM_BACKEND/meta/base"
"fmt"
"github.com/go-xorm/xorm"
"strings"
@ -881,7 +882,7 @@ func (impl *WorkOrderServiceImplement) LockWorkOrder(user *models.Usertab, workO
PODao := dal.NewSerialOrderPOLstDAO(session, user.Pid, user.Userid)
stepDao := dal.NewSerialOrderStepLstDAO(session, user.Pid, user.Userid)
artRelDao := baseDal.NewArticleRelLstDAO(session, user.Pid, user.Userid)
attributeDao := baseDal.NewAttributeValstDAO(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)
// 获取项目数据 用于获取流水号
@ -894,14 +895,18 @@ func (impl *WorkOrderServiceImplement) LockWorkOrder(user *models.Usertab, workO
_ = session.Rollback()
return nil, grmi.NewBusinessError("不存在该项目数据")
}
attributeLi, err := attributeDao.SelectAllAttributeData()
attributeLi, err := articleWithAttrDao.SelectAllWithAttrValue()
if err != nil {
_ = session.Rollback()
return nil, grmi.NewBusinessError("查询零件属性失败,error:" + err.Error())
}
attributeMap := make(map[string]baseModel.AttributeValst)
for _, attribute := range attributeLi {
attributeMap[attribute.Descr] = attribute
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)
}
scanRuleLi, err := scanRuleDao.Select(nil, nil)
if err != nil {
@ -1064,6 +1069,10 @@ func (impl *WorkOrderServiceImplement) LockWorkOrder(user *models.Usertab, workO
artIdLi = append(artIdLi, article.ArtId)
artRelMap[article.ArtId] = article
}
subArtMap := make(map[string]interface{})
for _, artId := range artIdLi {
subArtMap[artId] = nil
}
opLi, err := operationDao.GetOperationRelData(artIdLi, vomWorkOrder.WorkOrder.PlanResourceId)
if err != nil {
_ = session.Rollback()
@ -1129,7 +1138,7 @@ func (impl *WorkOrderServiceImplement) LockWorkOrder(user *models.Usertab, workO
checkRuleMap = *checkRuleMapPointer
allocateMap = *allocateMapPointer
} else if serialOrderStep.StepType == baseModel.STEP_OPC_RULE { // 生成OPC通讯的工艺数据
opcBasicMapPointer, err := impl.OPCCommunication(user, session, opcBasicMap, &serialOrderStep, attributeMap, workOrderId)
opcBasicMapPointer, err := impl.OPCCommunication(user, session, opcBasicMap, &serialOrderStep, attributeMap, workOrderId, subArtMap)
if err != nil {
_ = session.Rollback()
return nil, err
@ -1177,93 +1186,117 @@ func (impl *WorkOrderServiceImplement) ScanCodeCheck(user *models.Usertab, sessi
allocateDao := baseDal.NewArtQtyAllocateDAO(session, user.Pid, user.Userid)
serialOrderDetailDao := dal.NewSerialOrderOPDetailDAO(session, user.Pid, user.Userid)
if scanRule.RuleType == baseModel.SCAN_RULE_TYPE_ARTICLE {
// 获取零件校验规则
rule, exist := checkRuleMap[op.ArticleAtcodLst.ArtId]
if !exist {
ruleLi, err := ruleDao.Select([]grmi.Predicate{baseMeta.ArtCheckRule_AttriCode.NewPredicate(grmi.Equal, op.ArticleAtcodLst.AttrCode), baseMeta.ArtCheckRule_SubObject.NewPredicate(grmi.Equal, serialOrderStep.SubArtId)}, nil)
if err != nil {
return nil, nil, grmi.NewBusinessError("获取零件检验规则失败, error:" + err.Error())
}
if len(ruleLi) == 0 {
ruleLi, err = ruleDao.Select([]grmi.Predicate{baseMeta.ArtCheckRule_AttriCode.NewPredicate(grmi.Equal, op.ArticleAtcodLst.AttrCode), baseMeta.ArtCheckRule_SubObject.NewPredicate(grmi.Equal, baseModel.MES_MATCH_ALL)}, nil)
if scanRule.SRCtrlPara1 == baseModel.SCAN_RULE_CHECK {
// 获取零件校验规则
rule, exist := checkRuleMap[op.ArticleAtcodLst.ArtId]
if !exist {
ruleLi, err := ruleDao.Select([]grmi.Predicate{baseMeta.ArtCheckRule_AttriCode.NewPredicate(grmi.Equal, op.ArticleAtcodLst.AttrCode), baseMeta.ArtCheckRule_SubObject.NewPredicate(grmi.Equal, serialOrderStep.SubArtId)}, nil)
if err != nil {
return nil, nil, grmi.NewBusinessError("获取零件检验规则失败, error:" + err.Error())
}
if len(ruleLi) == 0 {
return nil, nil, grmi.NewBusinessError("未获取到零件检验规则, artId:" + serialOrderStep.SubArtId)
ruleLi, err = ruleDao.Select([]grmi.Predicate{baseMeta.ArtCheckRule_AttriCode.NewPredicate(grmi.Equal, op.ArticleAtcodLst.AttrCode), baseMeta.ArtCheckRule_SubObject.NewPredicate(grmi.Equal, baseModel.MES_MATCH_ALL)}, nil)
if err != nil {
return nil, nil, grmi.NewBusinessError("获取零件检验规则失败, error:" + err.Error())
}
if len(ruleLi) == 0 {
return nil, nil, grmi.NewBusinessError("未获取到零件检验规则, artId:" + serialOrderStep.SubArtId)
}
}
rule = ruleLi[0]
checkRuleMap[op.ArticleAtcodLst.ArtId] = rule
}
rule = ruleLi[0]
checkRuleMap[op.ArticleAtcodLst.ArtId] = rule
}
// 获取零件分配数量
var num int
// 零件BOM中两件组成父级零件的数量
composeQty := int(artRelMap[serialOrderStep.SubArtId].ComposeQty)
allocateLi, exist := allocateMap[op.ArticleAtcodLst.ArtId]
if !exist {
allocateLi, err = allocateDao.Select([]grmi.Predicate{baseMeta.ArtQtyAllocate_AttriCode.NewPredicate(grmi.Equal, op.ArticleAtcodLst.AttrCode), baseMeta.ArtQtyAllocate_TotalPlanty.NewPredicate(grmi.Equal, composeQty)}, nil)
if err != nil {
return nil, nil, grmi.NewBusinessError("获取特殊工位数量分配数据失败,错误:" + err.Error())
// 获取零件分配数量
var num int
// 零件BOM中两件组成父级零件的数量
composeQty := int(artRelMap[serialOrderStep.SubArtId].ComposeQty)
allocateLi, exist := allocateMap[op.ArticleAtcodLst.ArtId]
if !exist {
allocateLi, err = allocateDao.Select([]grmi.Predicate{baseMeta.ArtQtyAllocate_AttriCode.NewPredicate(grmi.Equal, op.ArticleAtcodLst.AttrCode), baseMeta.ArtQtyAllocate_TotalPlanty.NewPredicate(grmi.Equal, composeQty)}, nil)
if err != nil {
return nil, nil, grmi.NewBusinessError("获取特殊工位数量分配数据失败,错误:" + err.Error())
}
allocateMap[op.ArticleAtcodLst.ArtId] = allocateLi
}
allocateMap[op.ArticleAtcodLst.ArtId] = allocateLi
}
// 获取特殊工位零件分配数量
if len(allocateLi) == 0 {
num = composeQty
} else {
var allNum int
for _, allocate := range allocateLi {
if allocate.PO == serialOrderStep.PO {
if allocate.SubObject == baseModel.MES_MATCH_ALL {
allNum = allocate.AssignPlanty
} else if allocate.SubObject == serialOrderStep.SubArtId {
num = allocate.AssignPlanty
// 获取特殊工位零件分配数量
if len(allocateLi) == 0 {
num = composeQty
} else {
var allNum int
for _, allocate := range allocateLi {
if allocate.PO == serialOrderStep.PO {
if allocate.SubObject == baseModel.MES_MATCH_ALL {
allNum = allocate.AssignPlanty
} else if allocate.SubObject == serialOrderStep.SubArtId {
num = allocate.AssignPlanty
}
}
}
if num == 0 {
if allNum != 0 {
num = allNum
} else {
num = composeQty
}
}
}
if num == 0 {
if allNum != 0 {
num = allNum
} else {
num = composeQty
// 生成零件校验规则的工艺数据
pos := 1
for i := 0; i < num; i++ {
op := model.SerialOrderOPDetail{
SerialOrderId: serialOrderStep.SerialOrderId,
OperationId: serialOrderStep.OperationId,
PO: serialOrderStep.PO,
SubArtId: serialOrderStep.SubArtId,
Pos: pos,
StepNo: serialOrderStep.StepNo,
StepType: baseModel.STEP_CHECK_RULE,
Status: baseModel.WO_STATUS_LOCKED,
// 扫码校验 AttriCodeDesc
CharPara1: rule.AttriCodeDesc,
// 扫码校验 SubObject
CharPara2: rule.SubObject,
// 扫码校验 CodeLength
CharPara3: rule.CodeLength,
// 扫码校验 CheckObject
CharPara4: rule.CheckObject,
// 扫码校验 CheckStartPos
IntPara1: rule.CheckStartPos,
// 扫码校验 CheckLength
IntPara2: rule.CheckLength,
// 扫码校验 OnlyBarCodeFlag
FlagPara1: rule.OnlyBarCodeFlag,
}
pos++
err = serialOrderDetailDao.InsertOne(&op)
if err != nil {
return nil, nil, grmi.NewBusinessError("插入操作明细记录失败,error:" + err.Error())
}
}
}
// 生成零件校验规则的工艺数据
pos := 1
for i := 0; i < num; i++ {
return &checkRuleMap, &allocateMap, nil
} else if scanRule.SRCtrlPara1 == baseModel.SCAN_RULE_CRWAL {
op := model.SerialOrderOPDetail{
SerialOrderId: serialOrderStep.SerialOrderId,
OperationId: serialOrderStep.OperationId,
PO: serialOrderStep.PO,
SubArtId: serialOrderStep.SubArtId,
Pos: pos,
Pos: 1,
StepNo: serialOrderStep.StepNo,
StepType: baseModel.STEP_CHECK_RULE,
Status: baseModel.WO_STATUS_LOCKED,
// 扫码校验 AttriCodeDesc
CharPara1: rule.AttriCodeDesc,
// 扫码校验 SubObject
CharPara2: rule.SubObject,
// 扫码校验 CodeLength
CharPara3: rule.CodeLength,
// 扫码校验 CheckObject
CharPara4: rule.CheckObject,
// 扫码校验 CheckStartPos
IntPara1: rule.CheckStartPos,
// 扫码校验 CheckLength
IntPara2: rule.CheckLength,
// 扫码校验 OnlyBarCodeFlag
FlagPara1: rule.OnlyBarCodeFlag,
IntPara5: -1,
}
pos++
err = serialOrderDetailDao.InsertOne(&op)
if err != nil {
return nil, nil, grmi.NewBusinessError("插入操作明细记录失败,error:" + err.Error())
return nil, nil, grmi.NewBusinessError("插入扫码校验操作明细记录失败,error:" + err.Error())
} else {
return &checkRuleMap, &allocateMap, nil
}
} else {
return nil, nil, grmi.NewBusinessError("不支持的条码校验类型")
}
return &checkRuleMap, &allocateMap, nil
} else if scanRule.RuleType == baseModel.SCAN_RULE_TYPE_OTHER {
if scanRule.SRCtrlPara1 == baseModel.SCAN_RULE_SERIALORDER {
op := model.SerialOrderOPDetail{
@ -1297,7 +1330,7 @@ func (impl *WorkOrderServiceImplement) ScanCodeCheck(user *models.Usertab, sessi
* @Reference LAPP_LF_MOM_BACKEND/services/om/WorkOrderService.ScanCodeCheck 生成OPC通信的工艺数据
*
******************************************************************************/
func (impl *WorkOrderServiceImplement) OPCCommunication(user *models.Usertab, session *xorm.Session, opcBasicMap map[int][]baseModel.OPCBasicComInfo, serialOrderStep *model.SerialOrderStepLst, attributeMap map[string]baseModel.AttributeValst, workOrderId string) (*map[int][]baseModel.OPCBasicComInfo, error) {
func (impl *WorkOrderServiceImplement) OPCCommunication(user *models.Usertab, session *xorm.Session, opcBasicMap map[int][]baseModel.OPCBasicComInfo, serialOrderStep *model.SerialOrderStepLst, attributeMap map[int][]baseModel.ArticleWithAttrValue, workOrderId string, subArtMap map[string]interface{}) (*map[int][]baseModel.OPCBasicComInfo, error) {
var err error
opcBasicDao := baseDal.NewOPCBasicComInfoDAO(session, user.Pid, user.Userid)
opcComRuleDao := baseDal.NewOPCComRuleDAO(session, user.Pid, user.Userid)
@ -1346,16 +1379,50 @@ func (impl *WorkOrderServiceImplement) OPCCommunication(user *models.Usertab, se
if opc.DBlockValueType == baseModel.OPC_DBBLOCK_VALUE_TYPE_MAP {
for _, detail := range opc.OPCComDetailRuleLi {
if detail.BaseOnType == baseModel.BASE_ON_TYPE_ATTRNAME {
attributeData, exist := attributeMap[detail.BaseOnValue]
fmt.Printf("***************************")
fmt.Println("detail.DataType:", detail.DataType)
attrCode, err := strconv.Atoi(detail.BaseOnValue)
if err != nil {
return nil, grmi.NewBusinessError("OPC通讯规则映射值转换ATTRCODE失败, error:" + err.Error())
}
attrLi, exist := attributeMap[attrCode]
if !exist {
return nil, grmi.NewBusinessError("未获取到OPC通信细则中的零件属性描述对应的shortCode, 属性描述:" + detail.BaseOnValue)
}
if detail.DataType == baseModel.DATA_TYPE_ATTRCODE {
value += strconv.Itoa(attributeData.AttrCode)
value += strconv.Itoa(attrLi[0].AttributeValst.AttrCode)
} else if detail.DataType == baseModel.DATA_TYPE_SHORTCODE {
value += attributeData.ShortCode
var sign bool
for _, data := range attrLi {
_,exist := subArtMap[data.ArticleAtcodLst.ArtId]
if !exist {
continue
} else {
if sign {
return nil, grmi.NewBusinessError("OPC通讯规则映射值获取ATTRCODE下的零件多于一个")
}
sign = true
value += data.AttributeValst.ShortCode
}
}
if !sign {
return nil, grmi.NewBusinessError("未获取到OPC通信细则中的零件属性描述对应的shortCode, 属性描述:" + detail.BaseOnValue)
}
} else if detail.DataType == baseModel.DATA_TYPE_ATTRVALUE {
value += attributeData.AttrValue
var sign bool
for _, data := range attrLi {
_,exist := subArtMap[data.ArticleAtcodLst.ArtId]
if !exist {
continue
} else {
if sign {
return nil, grmi.NewBusinessError("OPC通讯规则映射值获取ATTRCODE下的零件多于一个")
}
sign = true
value += data.AttributeValst.AttrValue
}
}
} else {
return nil, grmi.NewBusinessError("不支持的OPC通信细则中的DATA TYPE, DATA TYPE:" + detail.DataType)
}
@ -1561,7 +1628,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab,
PODao := dal.NewSerialOrderPOLstDAO(session, user.Pid, user.Userid)
stepDao := dal.NewSerialOrderStepLstDAO(session, user.Pid, user.Userid)
artRelDao := baseDal.NewArticleRelLstDAO(session, user.Pid, user.Userid)
attributeDao := baseDal.NewAttributeValstDAO(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)
printDao := baseDal.NewPrintRuleInfoDAO(session, user.Pid, user.Userid)
@ -1629,8 +1696,8 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab,
OrderType: baseModel.ODER_TYPE_INTERVAL,
OrderInfo: article.Descr1,
PlanResourceGroupId: article.PlanResourceGroupId,
PlanResourceId: article.PlanResourceId,
UsedResourceId: article.UsedResourceId,
PlanResourceId: entity.WorkLineId,
UsedResourceId: entity.WorkLineId,
PlanQty: float64(entity.Qty),
QtyUomId: article.UomId,
RatePerHourToggle: article.RatePerHourToggle,
@ -1670,15 +1737,20 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab,
_ = session.Rollback()
return grmi.NewBusinessError("插入批次工单数量失败, error:" + err.Error())
}
attributeLi, err := attributeDao.SelectAllAttributeData()
attributeLi, err := articleWithAttrDao.SelectAllWithAttrValue()
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("查询零件属性失败,error:" + err.Error())
}
attributeMap := make(map[string]baseModel.AttributeValst)
for _, attribute := range attributeLi {
attributeMap[attribute.Descr] = attribute
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, entity.Qty)
serialOrderStatusLi := make([]model.SerialOrderStatus, 0, entity.Qty)
@ -1753,6 +1825,10 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab,
artIdLi = append(artIdLi, article.ArtId)
artRelMap[article.ArtId] = article
}
subArtMap := make(map[string]interface{})
for _, artId := range artIdLi {
subArtMap[artId] = nil
}
opLi, err := operationDao.GetOperationRelData(artIdLi, workOrder.PlanResourceId)
if err != nil {
_ = session.Rollback()
@ -1817,7 +1893,7 @@ func (impl *WorkOrderServiceImplement) CreateLockWorkOrder(user *models.Usertab,
allocateMap = *allocateMapPointer
} else if serialOrderStep.StepType == baseModel.STEP_OPC_RULE { // 生成OPC通讯的工艺数据
opcBasicMapPointer, err := impl.OPCCommunication(user, session, opcBasicMap, &serialOrderStep, attributeMap, workOrderId)
opcBasicMapPointer, err := impl.OPCCommunication(user, session, opcBasicMap, &serialOrderStep, attributeMap, workOrderId, subArtMap)
if err != nil {
_ = session.Rollback()
return err


Loading…
Cancel
Save