From d1a18699c8fa51c34b42d96746630fd254745e13 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Wed, 12 Mar 2025 16:50:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BE=99=E5=85=B4=E5=AE=A2=E6=88=B7=E6=9D=A1?= =?UTF-8?q?=E7=A0=81,=20=E6=94=B9=E5=8A=A8=E5=BD=B1=E5=93=8D=E6=AD=A6?= =?UTF-8?q?=E6=B1=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 59 +- .../base/roundness/MesPackageRoundnessService.java | 719 +-------------------- .../serviceimpl/busi/MesCreateWorkOrderImpl.java | 97 +-- .../CqLxCustSnNumberRuleStrategyService.java | 76 +++ .../WuHanCustSnNumberRuleStrategyService.java | 122 ++++ .../i3plus/ext/mes/pojo/util/MesExtConstWords.java | 3 + 6 files changed, 263 insertions(+), 813 deletions(-) create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/CqLxCustSnNumberRuleStrategyService.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/WuHanCustSnNumberRuleStrategyService.java diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index 8640ae7..fc2d607 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java @@ -39,7 +39,6 @@ import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.map.CaseInsensitiveMap; import org.apache.commons.collections.map.HashedMap; -import org.python.antlr.ast.While; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -49,7 +48,6 @@ import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import javax.persistence.Query; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalTime; import java.util.*; @@ -206,8 +204,6 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesBomRepository bomRao; - - @Override public MesWorkOrder insert(MesWorkOrder bean) { // 数据校验 @@ -2419,7 +2415,7 @@ public class MesWorkOrderService extends BaseMesService implements //顺序号 bean.setProductSeq(getMaxMesWorkOrderProductSeq(bean)); //生成客户条码 - bean.setCustSn(getCustSn(bean.getCustPartNo(), bean.getOrganizeCode(), bean.getCreateUser())); + bean.setCustSn(getCustSnList(bean.getPartNo(), bean.getCustPartNo(), bean.getOrganizeCode(), bean.getCreateUser(), 1).get(0)); //生成工单零件 工单装配件 insertMesWorkOrder(bean, orderPartList); // 创建工单打印队列 @@ -2881,34 +2877,25 @@ public class MesWorkOrderService extends BaseMesService implements return count > 0; } - private String getCustSn(String partNo,String organizeCode,String userName){ - Calendar custCalendar = Calendar.getInstance(); - custCalendar.setTime(new Date()); - GenSerialNoModel custGenSerialNoModel= new GenSerialNoModel("WH_CUST_SN_RULE"); - String prefix = partNo.substring(0, partNo.length() - 4); - String partNo4 = partNo.substring(partNo.length() - 4).toUpperCase(); - custGenSerialNoModel.setPartNo(prefix+partNo4); - String year = custCalendar.get(Calendar.YEAR)+ MesExtConstWords.EMPTY; - custGenSerialNoModel.setYear(year.substring(2)); - custGenSerialNoModel.setDay(String.format("%03d",custCalendar.get(Calendar.DAY_OF_YEAR))); - List custNumRuleList = syncFuncService.syncSerialNo(custGenSerialNoModel, userName, organizeCode, 1).getResultList(); - // [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% - //截取替换为ascii码 - String snOriginal = custNumRuleList.get(0); - String[] split = snOriginal.split("%RS%"); - StringBuilder rsStr = new StringBuilder(); - for (int i = 0; i < split.length-1; i++) { - rsStr.append(split[i]).append((char) 30); - } - rsStr.append(split[split.length - 1]); - StringBuilder gsStr = new StringBuilder(); - String[] split1 = rsStr.toString().split("%GS%"); - for (int i = 0; i < split1.length-1; i++) { - gsStr.append(split1[i]).append((char) 29); - } - gsStr.append(split1[split1.length-1]); - String[] split2 = gsStr.toString().split("%EOT%"); - return split2[0]+(char)4; + //默认客户条码编码规则配置代码 + private String getDefaultCustMatchRule(String organizeCode) { + MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.DEFAULT_CUST_MATCH_RULE); + return (null != config && !StringUtils.isEmpty(config.getCfgValue())) ? config.getCfgValue() : null; + } + + private List getCustSnList(String partNo, String custPartNo, String organizeCode, String userName, Integer num){ + MesPart part = mesPartRDao.getByProperty( + new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PART_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo}); + //获取物料的客户编码规则, 没有则取默认配置 + String custMatchRule = (null != part && !StringUtils.isEmpty(part.getCustMatchRule())) ? part.getCustMatchRule() : getDefaultCustMatchRule(organizeCode); + if (StringUtils.isEmpty(custMatchRule)) MesException.throwBusiException("物料编码[%s]未配置客户编码规则!", partNo); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(custMatchRule).organizeCode(organizeCode).partNo(partNo); + genSerialNoModel.setCustPartNo(custPartNo); + genSerialNoModel.putDataMap(MesPart.class.getSimpleName(), part); + List custNumRuleList = syncFuncService.syncSerialNo(genSerialNoModel, userName, organizeCode, 1).getResultList(); + if (CollectionUtils.isEmpty(custNumRuleList)) MesException.throwBusiException("根据客户编码规则[%s]生成客户条码失败!", custMatchRule); + return custNumRuleList; } private List dismantleBom(List bomList, double qty,String organizeCode, String workCellCode, String workOrderNo) { @@ -3170,13 +3157,17 @@ public class MesWorkOrderService extends BaseMesService implements MesProduceSn newProduceSn = null; MesQueueOrder newQueueOrder = null; MesPrintQueue newPrintQueue = null; + + //获取客户条码 + List custSnList = getCustSnList(workOrder.getPartNo(), workOrder.getCustPartNo(), workOrder.getOrganizeCode(), workOrder.getCreateUser(), generateQty.intValue() - 1); + for (int i = 1; i < generateQty; i++) { //工单 MesWorkOrder newWorkOrder = new MesWorkOrder(); BeanUtils.copyProperties(workOrder, newWorkOrder, MesExtConstWords.ID, MesExtConstWords.SYSTEM_SYNC_STATUS); newWorkOrder.setWorkOrderNo(getOrderNo(newWorkOrder)); newWorkOrder.setProductSeq(newWorkOrder.getProductSeq() + i); - newWorkOrder.setCustSn(getCustSn(workOrder.getCustPartNo(), workOrder.getOrganizeCode(), workOrder.getCreateUser())); + newWorkOrder.setCustSn(custSnList.get(i - 1)); newWorkOrder.setFid(UUID.randomUUID().toString()); newWrkOrderList.add(newWorkOrder); // diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesPackageRoundnessService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesPackageRoundnessService.java index b9f149e..6876e9c 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesPackageRoundnessService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesPackageRoundnessService.java @@ -3,31 +3,27 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.roundness; import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService; import cn.estsh.i3plus.ext.mes.api.base.IMesCustSoftInfoService; import cn.estsh.i3plus.ext.mes.api.base.strategy.IRoundnessStrategy; -import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesBomService; -import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesPartSapService; -import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesWorkOrderService; import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.MesCreateWorkOrderImpl; -import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService; -import cn.estsh.i3plus.platform.common.convert.ConvertBean; -import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup; +import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroupDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesPartSap; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo; import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; -import cn.estsh.i3plus.pojo.mes.repository.*; -import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import org.apache.commons.lang.StringUtils; +import cn.estsh.i3plus.pojo.mes.repository.MesPartSapRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -43,64 +39,16 @@ public class MesPackageRoundnessService implements IRoundnessStrategy { private static final Logger log = LoggerFactory.getLogger(MesPackageRoundnessService.class); - @Autowired private MesPartSapRepository mesPartSapRao; @Autowired - private MesProductVersionRepository mesProductVersionRao; - - @Autowired - private MesWorkOrderRepository mesWorkOrderRao; - - - @Autowired - private MesShiftRepository mesShiftRao; - - - @Autowired - private MesBomService mesBomService; - - @Autowired - private MesBomRepository bomRao; - - @Autowired - private MesProdRuleSortCfgRepository mesProdRuleSortCfgRao; - - @Autowired - private MesWorkOrderPartRepository workOrderPartRao; - - @Autowired - private MesWorkOrderAssemblyRepository workOrderAssemblyRao; - - @Autowired private ISyncFuncService syncFuncService; @Autowired private IMesCustSoftInfoService custSoftInfoService; @Autowired - private MesPartPtrRepository partPtrRao; - - @Autowired - private MesPartSapService mesPartSapService; - - @Autowired - private MesProduceSnRepository mesProduceSnRao; - - @Autowired - private MesQueueOrderRepository queueOrderRao; - - @Autowired - private MesWorkOrderService mesWorkOrderService; - - @Autowired - private MesWorkCenterRepository workCenterRao; - - @Autowired - private MesPartPtrDetailRepository partPtrDetailRao; - - @Autowired private MesCreateWorkOrderImpl mesCreateWorkOrder; @Autowired @@ -201,8 +149,8 @@ public class MesPackageRoundnessService implements IRoundnessStrategy { return; } - mesCreateWorkOrder.createWorkOrder(partProdGroup, mesPartProdGroupDetail, mesPart, sortInfo,productSeq); -// doCreateWorkOrder(partProdGroup, mesPartProdGroupDetail, mesPart, sortInfo); + mesCreateWorkOrder.createWorkOrder(partProdGroup, mesPartProdGroupDetail, mesPart, sortInfo,productSeq); + qty -= custQty; sortInfoList.remove(sortInfo); proSeqResultList.remove(seq); @@ -215,625 +163,6 @@ public class MesPackageRoundnessService implements IRoundnessStrategy { log.error("按包装圆整出错:MesPackageRoundnessService:{}", e.getMessage()); } } - private void doCreateWorkOrder(MesPartProdGroup partProdGroup, MesPartProdGroupDetail mesPartProdGroupDetail, MesPartSap partSap, MesCustSortInfo sortInfo) throws ParseException { - - String organizeCode = partProdGroup.getOrganizeCode(); - MesWorkOrder mesWorkOrder = new MesWorkOrder(); - mesWorkOrder.setCustCode(partProdGroup.getCustCode()); - //工单版本号 - mesWorkOrder.setProductVersion("1"); - //工单类型 - mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.SORT.getValue()); - //订单序号=客户排序信息的序号 - mesWorkOrder.setWorkOrderSeq(sortInfo.getCustInfoSeq().toString()); - mesWorkOrder.setOrganizeCode(sortInfo.getOrganizeCode()); - mesWorkOrder.setWorkCenterCode(partProdGroup.getWorkCenterCode()); - //根据产线查找区域代码 - DdlPackBean centerPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(partProdGroup.getWorkCenterCode(),"workCenterCode", centerPackBean); - List workCenterList = workCenterRao.findByHqlTopWhere(centerPackBean, 1); - if (!workCenterList.isEmpty()){ - mesWorkOrder.setAreaCode(workCenterList.get(0).getAreaCode()); - } - mesWorkOrder.setWorkCellCode(mesPartProdGroupDetail.getWorkCellCode()); - - //来源 - mesWorkOrder.setWorkOrderSource(sortInfo.getId().toString()); - - mesWorkOrder.setVinCode(sortInfo.getVinCode()); - mesWorkOrder.setProductTime(sortInfo.getMatchTime()); - mesWorkOrder.setProduceTime(sortInfo.getMatchTime()); - mesWorkOrder.setPlanStartTime(sortInfo.getMatchTime()); - mesWorkOrder.setPlanEndTime(sortInfo.getInfoPointTime()); - mesWorkOrder.setPtrInfo(sortInfo.getRemark()); - //客户订单号 - mesWorkOrder.setCustOrderNo(sortInfo.getCustOrderCode()); - //车型代码 - mesWorkOrder.setCarModelCode(sortInfo.getVehicleCategory()); - //车型描述 mesWorkOrder.setCarName = vehicleClassCode - - //备注取自于车型配置表中 - //todo 根据VehicleNo车型代码,sortInfo.custCode,sortInfo.CustPlantCode,organizeCode 查询表TI_CIM_VEHICLE_MODEL的 remark 作为从车型配置表中获取打印备注信息 - - mesWorkOrder.setCustPartNo(sortInfo.getCustPartNo()); -// mesWorkOrder.setCcrNo = sortInfo.CcrNo -// mesWorkOrder.AssyCode = sortInfo.AssyCode -// mesWorkOrder.setVehicleYear = sortInfo.getVehicleYear() - - // 11. 是否将生成日期减一天 - // 班次 根据产线+计划时间匹配班次 - DdlPackBean shiftPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(mesPartProdGroupDetail.getWorkCenterCode(), "workCenterCode", shiftPackBean); - List shiftList = mesShiftRao.findByHqlWhere(shiftPackBean); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Date date = sdf.parse(sortInfo.getMatchTime()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - int hours = calendar.get(Calendar.HOUR_OF_DAY); - - int minutes = calendar.get(Calendar.MINUTE); - long shiftTime = Long.parseLong(String.format("%02d:%02d:00", hours, minutes).replaceAll(":","")); - if (!shiftList.isEmpty()) { - for (MesShift shift : shiftList) { - long startTime = Long.parseLong(shift.getStartTime().replaceAll(":", "")); - long endTime = Long.parseLong(shift.getEndTime().replaceAll(":", "")); - if (startTime < endTime){ - if (shiftTime > startTime && shiftTime < endTime) { - mesWorkOrder.setShiftName(shift.getShiftName()); - mesWorkOrder.setShiftCode(shift.getShiftCode()); - } - }else { - if (shiftTime < startTime && shiftTime > endTime) { - mesWorkOrder.setShiftName(shift.getShiftName()); - mesWorkOrder.setShiftCode(shift.getShiftCode()); - } - } - } - } else { - log.info("当前产线:{} 没有配置班次", mesPartProdGroupDetail.getWorkCenterCode()); - } - - //零件相关 - mesWorkOrder.setPartNo(partSap.getPartNo()); - mesWorkOrder.setPartName(partSap.getPartName()); - - //工单号生成规则 【工厂号+yyyyMMdd+5位流水】 - - - - // 13.生产版本 organizeCode + partNo - MesProductVersion prodVersion = getProdVersion(organizeCode, partSap.getPartNo()); - if (prodVersion == null) { - log.info("请配置工厂:{},partNo:{}的生产版本", mesPartProdGroupDetail.organizeCode, partSap.getPartNo()); - } else { - String productVersion = prodVersion.getProductVersion(); - mesWorkOrder.setProductVersion(productVersion); - } - - // bom prodVersion.alternativePartList bom版本 - MesBom bom = mesBomService.findBom(organizeCode, prodVersion == null ? null : prodVersion.getAlternativePartList(), partSap.getPartNo()); - if (bom != null){ - mesWorkOrder.setBomCode(bom.getBomCode()); - } - - mesWorkOrder.setQty(sortInfo.getQty()); - mesWorkOrder.setUnCompleteQty(sortInfo.getQty()); - mesWorkOrder.setUnit(partSap.getUnit()); - - if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { - mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); - } else { - mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue()); - } - - mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode()); - mesWorkOrder.setCarModelCode(sortInfo.getVehicleNo()); - mesWorkOrder.setFid(UUID.randomUUID().toString()); - mesWorkOrder.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); - /** - * RS 为记录分隔符ASCII:30 - * GS 为分组符ASCII:29 - * EOT 为传输结束符ASCII:04 - * {splitRule} [)>%RS%06%GS%Y - * {splitRule} vpps= 4110000000000X - * {splitRule} %GS%P - * {partNo} 8位客户零件号 - * {splitRule} %GS%12V - * {splitRule} duns 545238347 - * {splitRule} %GS%T1A - * {yydayofyear} - * {splitRule} A2B4C - * {serialNo} 4位 步长1 - * {splitRule}%RS%%EOT% - *{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule} - * [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% - * 通用二维码组成部分('RS'为记录分隔符ASCII:30,'GS'为分组符ASCII:29,'EOT'为传输结束符ASCII:04) - * [)>+'RS'+06+'GS'+Y+vpps+'GS'+P+8位客户零件号+'GS'+12V+DUNS+'GS'+T+1位line num+1位班次号+2位年份+3位天数+1位追溯(精确追溯A,批次追溯@)+2工程更改记录+2位自定义+4位流水号+'RS'+'EOT' - * 如:[)>+'RS'+06+'GS'+Y+4110000000000X+'GS'+P+12345678+'GS'+12V+545295227+'GS'+T+1A13304A2B4C0001+'RS'+'EOT' - * - * vpps = Y00000000000000 - * 8位客户零件号=最后四位要大写 - * Duns是什么? - * 1位lineNumber是什么? 固定值 1 - * 1位班次号是什么? - * 2位年YY 24 - * 3位天-~365/366 - * 追溯 - * A--精确追溯 - * @--批次追溯 - * - * 2位工程更改记录 - * 2位供应商自定义信息 - * 4位流水号,当班班次计数,每班班次归零 - * - * WH_CUST_SN_RULE - */ - - Calendar custCalendar = Calendar.getInstance(); - custCalendar.setTime(new Date()); - GenSerialNoModel custGenSerialNoModel= new GenSerialNoModel("WH_CUST_SN_RULE"); - String partNo = mesWorkOrder.getCustPartNo(); - String prefix = partNo.substring(0, partNo.length() - 4); - String partNo4 = partNo.substring(partNo.length() - 4).toUpperCase(); - custGenSerialNoModel.setPartNo(prefix+partNo4); - String year = custCalendar.get(Calendar.YEAR)+""; - custGenSerialNoModel.setYear(year.substring(2)); - custGenSerialNoModel.setDay(String.format("%03d",custCalendar.get(Calendar.DAY_OF_YEAR))); - List custNumRuleList = syncFuncService.syncSerialNo(custGenSerialNoModel, "edi", organizeCode, 1).getResultList(); - // [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% - //截取替换为ascii码 - String snOriginal = custNumRuleList.get(0); - String[] split = snOriginal.split("%RS%"); - StringBuilder rsStr = new StringBuilder(); - for (int i = 0; i < split.length-1; i++) { - rsStr.append(split[i]).append((char) 30); - } - rsStr.append(split[split.length - 1]); - StringBuilder gsStr = new StringBuilder(); - String[] split1 = rsStr.toString().split("%GS%"); - for (int i = 0; i < split1.length-1; i++) { - gsStr.append(split1[i]).append((char) 29); - } - gsStr.append(split1[split1.length-1]); - String[] split2 = gsStr.toString().split("%EOT%"); - String sn = split2[0]+(char)4; - //保存条码 - mesWorkOrder.setCustSn(sn); - - - - // 打散bom - List workOrderPartList = new ArrayList<>(); - if (partProdGroup.getIsDisassembleBom() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { - workOrderPartList = dismantleBom(partSap.getPartNo(), mesWorkOrder.getQty(), sortInfo.getMatchTime(), bom.getBomCode(), sortInfo.getOrganizeCode(), mesPartProdGroupDetail.getWorkCellCode(), mesWorkOrder.getWorkOrderNo()); - - } - /** - * 总成拆bom,变成子零件 - * 替换子零件,通过替换后的零件,去找排序工艺 - */ - Map ptrRuleListMap = new HashMap<>(); - //是否修改为P单 - boolean isModifyPOrder = false; - //查询mes_part_ptr表,根据物料清单查找ptr替换信息 - if (!workOrderPartList.isEmpty()){ - Map orderPartMap = workOrderPartList.stream().collect(Collectors.toMap(MesWorkOrderPart::getPartNo, Function.identity())); - //先替换客户的ptr信息 - String ptrInfo = mesWorkOrder.getPtrInfo(); - if (StringUtils.isNotBlank(ptrInfo)) { - List ptrInfoList = Arrays.asList(ptrInfo.replace("_", "").split("\\|")); - if (!ptrInfoList.isEmpty()){ - List custPartPtrList = getCustPartPtrList(ptrInfoList, organizeCode); - for (MesPartPtr mesPartPtr : custPartPtrList) { - //根据mesPartPtr的目标零件号,找到零件信息 - String destPartNo = mesPartPtr.getDestPartNo(); - MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(destPartNo, organizeCode); - //更新物料清单 - MesWorkOrderPart orderPart = orderPartMap.get(destPartNo); - if (orderPart != null) { - orderPart.setPartNo(mesPartSap.getPartNo()); - orderPart.setPartName(mesPartSap.getPartName()); - orderPart.setShippingPartNo(mesPartSap.getPartNo()); - if (!isModifyPOrder){ - isModifyPOrder = true; - } - } - } - } - } - List partNoList = workOrderPartList.stream().map(MesWorkOrderPart::getPartNo).collect(Collectors.toList()); - List partPtrList = getPartPtrList(organizeCode, mesWorkOrder.getWorkCenterCode(), partNoList); - //装配件规则如果进行了零件替换 则使用ptr的规则 key 零件号,value 是规则 - - for (MesPartPtr mesPartPtr : partPtrList) { - //根据mesPartPtr的目标零件号,找到零件信息 - String destPartNo = mesPartPtr.getDestPartNo(); - String srcPartNo = mesPartPtr.getSrcPartNo(); - MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(destPartNo, organizeCode); - //更新物料清单 - MesWorkOrderPart orderPart = orderPartMap.get(srcPartNo); - if (orderPart != null) { - orderPart.setPartNo(mesPartSap.getPartNo()); - orderPart.setPartName(mesPartSap.getPartName()); - orderPart.setShippingPartNo(mesPartSap.getPartNo()); - ptrRuleListMap.put(mesPartSap.getPartNo(), mesPartPtr.getReplacePartSnRule()); - if (!isModifyPOrder){ - isModifyPOrder = true; - } - //更新mes_part_ptr的实际数量 + 1 - mesPartPtr.setPrtVehicleActualCount(mesPartPtr.getPrtVehicleActualCount() + 1); - ConvertBean.saveOrUpdate(mesPartPtr,"JOB"); - partPtrRao.update(mesPartPtr); - DdlPackBean partPtrDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getNumEqualPack(mesPartPtr.getId(),"ptrId",partPtrDetailPackBean); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(),"totalPartNo",partPtrDetailPackBean); - List partPtrDetailList = partPtrDetailRao.findByHqlWhere(partPtrDetailPackBean); - if (!partPtrDetailList.isEmpty()){ - MesPartPtrDetail mesPartPtrDetail = partPtrDetailList.get(0); - mesPartPtrDetail.setQty(mesPartPtrDetail.getQty() + 1); - ConvertBean.saveOrUpdate(mesPartPtrDetail,"JOB"); - partPtrDetailRao.update(mesPartPtrDetail); - } - //更新mes_part_ptr_detail 的workOrder.partNo 数量加 1 ;替换了几次还是什么 - } - } - } - - - - // 生成装配件清单 - if (isModifyPOrder){ - mesWorkOrder.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.PTR.getValue()); - }else { - mesWorkOrder.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue()); - } - /** - * 工单号修改 - * {ORG}{dynamicRule}{dynamicRule}{dynamicrule}{serialNo} - * 工厂代码+工单类型 +客户工厂代码+班次+流水号 - */ - GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_ORDER_NO_WU_HAN"); - List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), "edi", mesPartProdGroupDetail.getOrganizeCode(), 1).getResultList(); - String serialNo = resultList.get(0).replace("MES_WORK_ORDER_NO_WU_HAN", ""); - String orderNoWuHan=organizeCode+mesWorkOrder.getOrderFlag()+sortInfo.getCustOrderCode()+mesWorkOrder.getShiftCode() + serialNo; - mesWorkOrder.setWorkOrderNo(orderNoWuHan); - - if (!workOrderPartList.isEmpty()) { - for (MesWorkOrderPart orderPart : workOrderPartList) { - orderPart.setOrganizeCode(organizeCode); - orderPart.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); - ConvertBean.saveOrUpdate(orderPart, "MES-JOB"); - } - workOrderPartRao.saveAll(workOrderPartList); - } - List assemblyList = getAssemblyList(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getCarModelCode(), workOrderPartList, partProdGroup); - /** - * 生产序号 - * 工厂-产线-9位流水号,跳号10 - */ - GenSerialNoModel prodSeqSerialNoModel = new GenSerialNoModel("MES_WORK_ORDER_SEQ_WU_HAN"); - prodSeqSerialNoModel.setProdLocation(mesWorkOrder.getWorkCenterCode()); - List proSeqResultList = syncFuncService.syncSerialNo(prodSeqSerialNoModel.organizeCode(organizeCode), "edi", mesPartProdGroupDetail.getOrganizeCode(), 1).getResultList(); - String proSeqStr = proSeqResultList.get(0); - mesWorkOrder.setProductSeq(Long.parseLong(proSeqStr.replace("MES_WORK_ORDER_SEQ_WU_HAN", ""))); - mesWorkOrder.setPartProdGroupName(partProdGroup.getPartProdGroupName()); - ConvertBean.saveOrUpdate(mesWorkOrder, "MES-JOB"); - mesWorkOrderRao.insert(mesWorkOrder); - - /** - * 插入工单打印队列数据 - */ - mesWorkOrderService.doSaveWorkOrderPrintQueue(mesWorkOrder); - if (!assemblyList.isEmpty()) { - for (MesWorkOrderAssembly orderAssembly : assemblyList) { - if (ptrRuleListMap.get(orderAssembly.getPartNo()) != null){ - orderAssembly.setMatchRule(ptrRuleListMap.get(orderAssembly.getPartNo())); - } - orderAssembly.setPartNo(mesWorkOrder.getPartNo()); - orderAssembly.setPartName(mesWorkOrder.getPartName()); - orderAssembly.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); - orderAssembly.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()); - orderAssembly.setOrganizeCode(organizeCode); - orderAssembly.setProductSn(mesWorkOrder.getWorkOrderNo()); - orderAssembly.setAreaCode(mesWorkOrder.getAreaCode()); - ConvertBean.saveOrUpdate(orderAssembly, "MES-JOB"); - } - workOrderAssemblyRao.saveAll(assemblyList); - - List cellCodeList = assemblyList.stream().map(MesWorkOrderAssembly::getWorkCellCode).distinct().collect(Collectors.toList()); - Map> cellCodeMap = assemblyList.stream().collect(Collectors.groupingBy(MesWorkOrderAssembly::getWorkCellCode)); - for (String cellCode : cellCodeList) { - MesQueueOrder mesQueueOrder = new MesQueueOrder(); - mesQueueOrder.setCarModelCode(mesWorkOrder.getCarModelCode()); - mesQueueOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); - mesQueueOrder.setOrganizeCode(organizeCode); - mesQueueOrder.setWorkCellCode(cellCode); - mesQueueOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode()); - mesQueueOrder.setPartProdGroupName(partProdGroup.getPartProdGroupName()); - mesQueueOrder.setProcessSeq(cellCodeMap.get(cellCode).get(0).getProcessSeq()); - mesQueueOrder.setPartNo(mesWorkOrder.getPartNo()); - mesQueueOrder.setPartName(mesWorkOrder.getPartName()); - mesQueueOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); - mesQueueOrder.setSerialNumber(mesWorkOrder.getWorkOrderNo()); - mesQueueOrder.setProductSn(mesWorkOrder.getWorkOrderNo()); - mesQueueOrder.setCustSn(mesWorkOrder.getCustSn()); - mesQueueOrder.setStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()); - mesQueueOrder.setProductSeq(mesWorkOrder.getProductSeq()); - mesQueueOrder.setWorkOrderSeq(mesWorkOrder.getWorkOrderSeq()); - mesQueueOrder.setCustPartNo(mesWorkOrder.getCustPartNo()); - mesQueueOrder.setCustOrderNo(mesWorkOrder.getCustOrderNo()); - mesQueueOrder.setWorkCenterCode(mesWorkOrder.getWorkCenterCode()); - mesQueueOrder.setAreaCode(mesWorkOrder.getAreaCode()); - mesQueueOrder.setOrderFlag(mesWorkOrder.getOrderFlag()); - ConvertBean.saveOrUpdate(mesQueueOrder, "MES-JOB"); - queueOrderRao.insert(mesQueueOrder); - } - - } - - //生成条码表 - MesProduceSn mesProduceSn = new MesProduceSn(); - mesProduceSn.setProductSn(mesWorkOrder.getWorkOrderNo()); - mesProduceSn.setCustSn(mesWorkOrder.getCustSn()); - mesProduceSn.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); - mesProduceSn.setOrganizeCode(organizeCode); - mesProduceSn.setFid(UUID.randomUUID().toString()); - mesProduceSn.setCustCode(mesWorkOrder.getCustCode()); - mesProduceSn.setCustPartNo(mesWorkOrder.getCustPartNo()); - mesProduceSn.setPartNo(mesWorkOrder.getPartNo()); - mesProduceSn.setPartName(mesWorkOrder.getPartName()); - mesProduceSn.setShiftCode(mesWorkOrder.getShiftCode()); - mesProduceSn.setWorkCenterCode(mesWorkOrder.getWorkCenterCode()); - mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); - mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); - mesProduceSn.setQty(1.0); - mesProduceSn.setSerialNumber(mesWorkOrder.getWorkOrderNo()); - mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()); - mesProduceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue()); - mesProduceSn.setFid(UUID.randomUUID().toString()); - mesProduceSn.setAreaCode(mesWorkOrder.getAreaCode()); - ConvertBean.saveOrUpdate(mesProduceSn, "MES-JOB"); - mesProduceSnRao.insert(mesProduceSn); - - - - } - - - private List getAssemblyList(String workCenterCode, String vehicleNo, List workOrderPartList, MesPartProdGroup mesPartProdGroup) { - //TM_BAS_WORK_ORDER_ASSEMBLY_SETTING 对应 mes_prod_rule_sort_cfg 排序生产规则 - - List workOrderAssemblyList = new ArrayList<>(); - List partNoList = workOrderPartList.stream().map(MesWorkOrderPart::getPartNo).collect(Collectors.toList()); - DdlPackBean prodRuleSortPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode()); -// DdlPreparedPack.getStringEqualPack(mesPartProdGroup.getPartProdGroupCode(),"productGroupCode",prodRuleSortPackBean); - DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", prodRuleSortPackBean); - DdlPreparedPack.getInPackList(partNoList, "assemblyPartNo", prodRuleSortPackBean); - //查询当前产线的所有排序生产规则--分为当前工单清单的装配件 - List sortCfgList = mesProdRuleSortCfgRao.findByHqlWhere(prodRuleSortPackBean); - List sortCfgListFilter = sortCfgList.stream().filter(item -> partNoList.contains(item.getAssemblyPartNo())).collect(Collectors.toList()); - Map> orderPartMap = workOrderPartList.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getPartNo)); - //遍历排序生产规则 - for (MesProdRuleSortCfg sortCfg : sortCfgListFilter) { - List orderPartList = orderPartMap.get(sortCfg.getAssemblyPartNo()); - MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly(); - MesWorkOrderPart orderPart = orderPartList.get(0); - //1.逻辑储量程序sortCfg.isLogicNum - if ((sortCfg.getIsLogicNum() !=null && sortCfg.getIsLogicNum() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) && (sortCfg.getLogicNum()!=null && sortCfg.getLogicNum() >0 )){ - Double total = orderPartList.stream().map(MesWorkOrderPart::getItemQty).reduce(Double::sum).get(); - if (!total.equals(sortCfg.getLogicNum())){ - log.info("零件号:{}的数量:{}对应排序规则{}的逻辑数量:{}不一致",orderPart.getPartNo(),total,sortCfg.getWorkCenterCode(),sortCfg.getLogicNum()); - continue; - } - } - //2.当排序规则的车型不为空时,则需要与参数匹配,如果不符合 则不加这个装配项 - if (StringUtils.isNotBlank(sortCfg.getVehicleNo()) && !sortCfg.getVehicleNo().equals(vehicleNo)){ - continue; - } - orderAssembly.setAssemblyPartNo(sortCfg.getAssemblyPartNo()); - orderAssembly.setAssemblyPartName(sortCfg.getAssemblyPartName()); - orderAssembly.setProcessName(sortCfg.getProcessName()); - orderAssembly.setWorkCenterCode(sortCfg.getWorkCenterCode()); - orderAssembly.setDisplayRule(sortCfg.getDisplayRule()); - orderAssembly.setMatchRule(sortCfg.getMatchRule()); - orderAssembly.setMatchType(sortCfg.getMatchType()); - orderAssembly.setPrintType(sortCfg.getPrintType()); - orderAssembly.setProcessCode(sortCfg.getProcessCode()); - orderAssembly.setDisplaySeq(sortCfg.getDisplaySeq()); - orderAssembly.setDisplayValue(sortCfg.getDisplayValue()); - orderAssembly.setProcessSeq(sortCfg.getProcessSeq()); - orderAssembly.setCraftName(sortCfg.getCraftName()); - orderAssembly.setCraftCode(sortCfg.getCraftCode()); - orderAssembly.setRouteSeq(sortCfg.getRouteSeq()); -// orderAssembly.setPartNo(orderPart.getPartNo()); -// orderAssembly.setPartName(orderPart.getPartName()); - orderAssembly.setWorkCellCode(sortCfg.getWorkCellCode()); - orderAssembly.setOrderPartId(orderPart.getId().toString()); - orderAssembly.setEquipmentCode(sortCfg.getEquipmentCode()); - orderAssembly.setReportType(sortCfg.getReportType()); - if (sortCfg.getReportType() != null && sortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()){ - orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue()); - }else { - orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()); - } - orderAssembly.setReportPartNo(sortCfg.getReportPartNo()); - orderAssembly.setImageFileId(sortCfg.getImageFileId()); - orderAssembly.setCraftCode(sortCfg.getCraftCode()); - orderAssembly.setCraftName(sortCfg.getCraftName()); - orderAssembly.setPartTypeCode(sortCfg.getPartTypeCode()); - orderAssembly.setShowColor(sortCfg.getShowColor()); - orderAssembly.setProductPartNo(sortCfg.getProductPartNo()); - orderAssembly.setPid(sortCfg.getId()); - orderAssembly.setWorkCenterCode(workCenterCode); - orderAssembly.setPreCraftCode(sortCfg.getPreCraftCode()); - workOrderAssemblyList.add(orderAssembly); - } - - //车型不为空的逻辑--用于报工 - DdlPackBean reportRuleSortPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", reportRuleSortPackBean); - DdlPreparedPack.getStringEqualPack(vehicleNo, "vehicleNo", reportRuleSortPackBean); - DdlPreparedPack.getNotInPack(partNoList, "assemblyPartNo", reportRuleSortPackBean); - //查询当前产线的所有排序生产规则--分为当前工单清单的装配件 - List prodCfgList = mesProdRuleSortCfgRao.findByHqlWhere(reportRuleSortPackBean); - for (MesProdRuleSortCfg ruleSortCfg : prodCfgList) { - MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly(); - orderAssembly.setAssemblyPartNo(ruleSortCfg.getAssemblyPartNo()); - orderAssembly.setAssemblyPartName(ruleSortCfg.getAssemblyPartName()); - orderAssembly.setProcessName(ruleSortCfg.getProcessName()); - orderAssembly.setWorkCenterCode(ruleSortCfg.getWorkCenterCode()); - - orderAssembly.setDisplayRule(ruleSortCfg.getDisplayRule()); - orderAssembly.setMatchRule(ruleSortCfg.getMatchRule()); - orderAssembly.setMatchType(ruleSortCfg.getMatchType()); - orderAssembly.setPrintType(ruleSortCfg.getPrintType()); - orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); - orderAssembly.setWorkCellCode(ruleSortCfg.getWorkCellCode()); - orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); - orderAssembly.setProcessName(ruleSortCfg.getProcessName()); - orderAssembly.setCraftCode(ruleSortCfg.getCraftCode()); - orderAssembly.setRouteSeq(ruleSortCfg.getRouteSeq()); - orderAssembly.setEquipmentCode(ruleSortCfg.getEquipmentCode()); - orderAssembly.setReportType(ruleSortCfg.getReportType()); - if (ruleSortCfg.getReportType() != null && ruleSortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()){ - orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue()); - }else { - orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()); - } - orderAssembly.setReportPartNo(ruleSortCfg.getReportPartNo()); - orderAssembly.setProcessSeq(ruleSortCfg.getProcessSeq()); - orderAssembly.setPid(ruleSortCfg.getId()); - orderAssembly.setImageFileId(ruleSortCfg.getImageFileId()); - orderAssembly.setPartTypeCode(ruleSortCfg.getPartTypeCode()); - orderAssembly.setMaxValue(ruleSortCfg.getMaxValue()); - orderAssembly.setMinValue(ruleSortCfg.getMinValue()); - orderAssembly.setProductPartNo(ruleSortCfg.getProductPartNo()); - orderAssembly.setPreCraftCode(ruleSortCfg.getPreCraftCode()); - workOrderAssemblyList.add(orderAssembly); - } - //查询所有共用的零件 且没有零件号,多用于螺钉---查询排序加工规则 - DdlPackBean prodRuleSortPublicPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", prodRuleSortPublicPackBean); - DdlPreparedPack.getIsNull("assemblyPartNo", prodRuleSortPublicPackBean); - List ruleSortCfgs = mesProdRuleSortCfgRao.findByHqlWhere(prodRuleSortPublicPackBean); - for (MesProdRuleSortCfg ruleSortCfg : ruleSortCfgs) { - MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly(); - orderAssembly.setAssemblyPartNo(ruleSortCfg.getAssemblyPartNo()); - orderAssembly.setAssemblyPartName(ruleSortCfg.getAssemblyPartName()); - orderAssembly.setProcessName(ruleSortCfg.getProcessName()); - orderAssembly.setWorkCenterCode(ruleSortCfg.getWorkCenterCode()); - orderAssembly.setDisplayRule(ruleSortCfg.getDisplayRule()); - orderAssembly.setMatchRule(ruleSortCfg.getMatchRule()); - orderAssembly.setMatchType(ruleSortCfg.getMatchType()); - orderAssembly.setPrintType(ruleSortCfg.getPrintType()); - orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); - orderAssembly.setWorkCellCode(ruleSortCfg.getWorkCellCode()); - orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); - orderAssembly.setProcessName(ruleSortCfg.getProcessName()); - orderAssembly.setCraftCode(ruleSortCfg.getCraftCode()); - orderAssembly.setRouteSeq(ruleSortCfg.getRouteSeq()); - orderAssembly.setEquipmentCode(ruleSortCfg.getEquipmentCode()); - orderAssembly.setReportType(ruleSortCfg.getReportType()); - if (ruleSortCfg.getReportType() != null && ruleSortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()){ - orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue()); - }else { - orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()); - } - orderAssembly.setReportPartNo(ruleSortCfg.getReportPartNo()); - orderAssembly.setProcessSeq(ruleSortCfg.getProcessSeq()); - orderAssembly.setPid(ruleSortCfg.getId()); - orderAssembly.setImageFileId(ruleSortCfg.getImageFileId()); - orderAssembly.setPartTypeCode(ruleSortCfg.getPartTypeCode()); - orderAssembly.setMaxValue(ruleSortCfg.getMaxValue()); - orderAssembly.setMinValue(ruleSortCfg.getMinValue()); - orderAssembly.setProductPartNo(ruleSortCfg.getProductPartNo()); - orderAssembly.setPreCraftCode(ruleSortCfg.getPreCraftCode()); - workOrderAssemblyList.add(orderAssembly); - } - return workOrderAssemblyList; - } - - private List dismantleBom(String partNo, double qty, String productTime, String bomCode, String organizeCode, String workCellCode, String workOrderNo) { - List orderPartList = new ArrayList<>(); - - //1.根据bomCode,partNo productTime organizeCode 查询bom清单 bomList - List bomList = getPlatBom(partNo, productTime, bomCode, organizeCode); - //2.根据bomList中的subPartNo 查询零件清单 partList - List partNoList = bomList.stream().map(MesBom::getItemPartNo).distinct().collect(Collectors.toList()); - - DdlPackBean partPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(partNoList, "partNo", partPackBean); - List partSapList = mesPartSapRao.findByHqlWhere(partPackBean); - Map partMap = partSapList.stream().collect(Collectors.toMap(MesPartSap::getPartNo, Function.identity())); - - - for (MesBom bom : bomList) { - MesWorkOrderPart orderPart = new MesWorkOrderPart(); - MesPartSap partSap = partMap.get(bom.getItemPartNo()); - if (partSap == null) { - log.info("工厂:{},零件号:{}未查到零件信息", organizeCode, bom.getItemPartNo()); - return new ArrayList<>(); - } - List orderParts = orderPartList.stream().filter(item -> item.getPartNo().equals(partSap.getPartNo())).collect(Collectors.toList()); - if (!orderParts.isEmpty()) { - MesWorkOrderPart tempPart = orderParts.get(0); - tempPart.setItemQty(tempPart.getItemQty() + bom.getItemQty() * qty); - continue; - } - orderPart.setPartName(partSap.getPartName()); - orderPart.setPartNo(partSap.getPartNo()); - orderPart.setItemQty(bom.getItemQty() * qty); - orderPart.setItemUnit(partSap.getUnit()); - orderPart.setSourceId(bom.getId()); - orderPart.setShippingPartNo(partSap.getPartNo()); - orderPart.setWorkOrderNo(workOrderNo); - orderPart.setWorkCellCode(workCellCode); - orderPartList.add(orderPart); - } - //3.遍历bomList - return orderPartList; - } - - - private List getPlatBom(String partNo, String effectiveTime, String bomCode, String organizeCode) { - - //MES汇报查询BOM是否携带结束查询条件 - MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.MES_REPORT_FIND_BOM_WITH_EFFENDTIME); - Boolean isWithEffEndTime = (null != config && !org.springframework.util.StringUtils.isEmpty(config.getCfgValue()) && config.getCfgValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? true : false; - - if (bomCode == null) { - //首先根据虚结构的零件号查询出最新的一条bom信息作为bomCode - DdlPackBean bomCodePackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomCodePackBean); - DdlPreparedPack.getStringSmallerPack(effectiveTime, MesExtConstWords.EFF_START_TIME, bomCodePackBean); - if (isWithEffEndTime) DdlPreparedPack.getStringBiggerPack(effectiveTime, MesExtConstWords.EFF_END_TIME, bomCodePackBean); - DdlPreparedPack.getOrderBy(MesExtConstWords.EFF_START_TIME, CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), bomCodePackBean); - List bomList = bomRao.findByHqlTopWhere(bomCodePackBean, 1); - if (bomList == null || bomList.isEmpty()) { - return new ArrayList<>(); - } - bomCode = bomList.get(0).getBomCode(); - } - List bomResultList = new ArrayList<>(); - DdlPackBean bomPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(bomCode, "bomCode", bomPackBean); - DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomPackBean); - DdlPreparedPack.getStringSmallerPack(effectiveTime, MesExtConstWords.EFF_START_TIME, bomPackBean); - if (isWithEffEndTime) DdlPreparedPack.getStringBiggerPack(effectiveTime, MesExtConstWords.EFF_END_TIME, bomPackBean); - List bomList = bomRao.findByHqlWhere(bomPackBean); - - for (MesBom bom : bomList) { - if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) { - getPlatBom(bom.getItemPartNo(), effectiveTime, null, organizeCode); - } else { - bom.setBomCode(bom.getBomCode().toLowerCase()); - bomResultList.add(bom); - } - - } - - return bomResultList; - } private MesPartSap getMesPart(String productPartNo, String organizeCode) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); @@ -842,32 +171,4 @@ public class MesPackageRoundnessService implements IRoundnessStrategy { return parts.isEmpty() ? null : parts.get(0); } - private MesProductVersion getProdVersion(String organizeCode, String partNo) { - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); - List mesProductVersionList = mesProductVersionRao.findByHqlWhere(ddlPackBean); - return mesProductVersionList.isEmpty() ? null : mesProductVersionList.get(0); - } - - - private List getPartPtrList(String organizeCode,String workCenterCode, List partNoList) { - DdlPackBean partPtrPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", partPtrPackBean); - DdlPreparedPack.getInPackList(partNoList, "srcPartNo", partPtrPackBean); - DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime("yyyy-MM-dd HH:mm:ss"), "startTime", partPtrPackBean); - DdlPreparedPack.getStringBiggerPack(TimeTool.getNowTime("yyyy-MM-dd HH:mm:ss"), "endTime", partPtrPackBean); - DdlPreparedPack.getIsNotNull("prtVehicleCount", partPtrPackBean); - List partPtrList = partPtrRao.findByHqlWhere(partPtrPackBean); - partPtrList = partPtrList.stream().filter(item -> item.getPrtVehicleCount() != null && item.getPrtVehicleCount() > 0) - .filter(item-> item.getPrtVehicleCount() > item.getPrtVehicleActualCount()) - .collect(Collectors.toList()); - return partPtrList; - } - //根据排序信息PTR零件号 获取 ptr信息 - private List getCustPartPtrList(List ptrInfoList,String organizeCode){ - DdlPackBean partPtrPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(ptrInfoList, "seqInfoPrtPart", partPtrPackBean); - return partPtrRao.findByHqlWhere(partPtrPackBean); - - } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java index aad9a03..a22e219 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -93,6 +94,9 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder { @Autowired private IMesConfigService mesConfigService; + @Autowired + private MesPartRepository partRepository; + @Transactional(propagation = Propagation.REQUIRES_NEW) public void createWorkOrder(MesPartProdGroup partProdGroup, MesPartProdGroupDetail mesPartProdGroupDetail, MesPartSap partSap, MesCustSortInfo sortInfo,Long productSeq) { @@ -255,80 +259,27 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder { mesWorkOrder.setCarModelCode(sortInfo.getVehicleNo()); mesWorkOrder.setFid(UUID.randomUUID().toString()); mesWorkOrder.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); - /** - * RS 为记录分隔符ASCII:30 - * GS 为分组符ASCII:29 - * EOT 为传输结束符ASCII:04 - * {splitRule} [)>%RS%06%GS%Y - * {splitRule} vpps= 4110000000000X - * {splitRule} %GS%P - * {partNo} 8位客户零件号 - * {splitRule} %GS%12V - * {splitRule} duns 545238347 - * {splitRule} %GS%T1A - * {yydayofyear} - * {splitRule} A2B4C - * {serialNo} 4位 步长1 - * {splitRule}%RS%%EOT% - *{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule} - * [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% - * 通用二维码组成部分('RS'为记录分隔符ASCII:30,'GS'为分组符ASCII:29,'EOT'为传输结束符ASCII:04) - * [)>+'RS'+06+'GS'+Y+vpps+'GS'+P+8位客户零件号+'GS'+12V+DUNS+'GS'+T+1位line num+1位班次号+2位年份+3位天数+1位追溯(精确追溯A,批次追溯@)+2工程更改记录+2位自定义+4位流水号+'RS'+'EOT' - * 如:[)>+'RS'+06+'GS'+Y+4110000000000X+'GS'+P+12345678+'GS'+12V+545295227+'GS'+T+1A13304A2B4C0001+'RS'+'EOT' - * - * vpps = Y00000000000000 - * 8位客户零件号=最后四位要大写 - * Duns是什么? - * 1位lineNumber是什么? 固定值 1 - * 1位班次号是什么? - * 2位年YY 24 - * 3位天-~365/366 - * 追溯 - * A--精确追溯 - * @--批次追溯 - * - * 2位工程更改记录 - * 2位供应商自定义信息 - * 4位流水号,当班班次计数,每班班次归零 - * - * WH_CUST_SN_RULE - */ - Calendar custCalendar = Calendar.getInstance(); - custCalendar.setTime(new Date()); - GenSerialNoModel custGenSerialNoModel = new GenSerialNoModel("WH_CUST_SN_RULE"); -// String partNo = mesWorkOrder.getCustPartNo(); - /** - * 2024/11/20 - * 客户零件号需要从零件生产组中获取 - */ - String partNo = mesPartProdGroupDetail.getCustPartNo(); - String prefix = partNo.substring(0, partNo.length() - 4); - String partNo4 = partNo.substring(partNo.length() - 4).toUpperCase(); - custGenSerialNoModel.setPartNo(prefix + partNo4); - String year = custCalendar.get(Calendar.YEAR) + ""; - custGenSerialNoModel.setYear(year.substring(2)); - custGenSerialNoModel.setDay(String.format("%03d", custCalendar.get(Calendar.DAY_OF_YEAR))); - List custNumRuleList = syncFuncService.syncSerialNo(custGenSerialNoModel, "edi", organizeCode, 1).getResultList(); - // [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% - //截取替换为ascii码 - String snOriginal = custNumRuleList.get(0); - String[] split = snOriginal.split("%RS%"); - StringBuilder rsStr = new StringBuilder(); - for (int i = 0; i < split.length - 1; i++) { - rsStr.append(split[i]).append((char) 30); + MesPart part = partRepository.getByProperty( + new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PART_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), mesWorkOrder.getPartNo()}); + //获取物料的客户编码规则, 没有则取默认配置 + String custMatchRule = (null != part && !StringUtils.isEmpty(part.getCustMatchRule())) ? part.getCustMatchRule() : getDefaultCustMatchRule(organizeCode); + if (StringUtils.isEmpty(custMatchRule)) { + sortInfo.setDescription("未配置客户编码规则!"); + return; } - rsStr.append(split[split.length - 1]); - StringBuilder gsStr = new StringBuilder(); - String[] split1 = rsStr.toString().split("%GS%"); - for (int i = 0; i < split1.length - 1; i++) { - gsStr.append(split1[i]).append((char) 29); + + GenSerialNoModel genSerialNoModelCustSn = new GenSerialNoModel(custMatchRule).organizeCode(organizeCode).partNo(mesWorkOrder.getPartNo()); + genSerialNoModelCustSn.setCustPartNo(mesPartProdGroupDetail.getCustPartNo()); + genSerialNoModelCustSn.putDataMap(MesPart.class.getSimpleName(), part); + List custNumRuleList = syncFuncService.syncSerialNo(genSerialNoModelCustSn, "edi", organizeCode, 1).getResultList(); + if (CollectionUtils.isEmpty(custNumRuleList)) { + sortInfo.setDescription(String.format("根据客户编码规则[%s]生成客户条码失败!", custMatchRule)); + return; } - gsStr.append(split1[split1.length - 1]); - String[] split2 = gsStr.toString().split("%EOT%"); - String sn = split2[0] + (char) 4; //保存条码 - mesWorkOrder.setCustSn(sn); + mesWorkOrder.setCustSn(custNumRuleList.get(0)); // 打散bom List workOrderPartList = new ArrayList<>(); @@ -969,4 +920,10 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder { return partPtrRao.findByHqlWhere(partPtrPackBean); } + + //默认客户条码编码规则配置代码 + private String getDefaultCustMatchRule(String organizeCode) { + MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.DEFAULT_CUST_MATCH_RULE); + return (null != config && !org.springframework.util.StringUtils.isEmpty(config.getCfgValue())) ? config.getCfgValue() : null; + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/CqLxCustSnNumberRuleStrategyService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/CqLxCustSnNumberRuleStrategyService.java new file mode 100644 index 0000000..b849dc7 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/CqLxCustSnNumberRuleStrategyService.java @@ -0,0 +1,76 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.numberrule; + +import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException; +import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; +import cn.estsh.i3plus.mes.api.iservice.busi.INumberRulePackAttributeStrategyService; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.Date; + +/** + * 重庆龙兴客户条码 + */ +@Component +public class CqLxCustSnNumberRuleStrategyService implements INumberRulePackAttributeStrategyService { + + @Autowired + private MesPartRepository partRepository; + + @Override + public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) { + if (null == genSerialNoModel) { + MesException.throwBusiException("入参缺少[GenSerialNoModel]!"); + } + if (StringUtils.isEmpty(genSerialNoModel.getOrganizeCode())) { + MesException.throwBusiException("入参缺少[organizeCode]!"); + } + + MesPart part = (null != genSerialNoModel.getDataMap() && genSerialNoModel.getDataMap().containsKey(MesPart.class.getSimpleName())) + ? (MesPart) genSerialNoModel.getDataMap().get(MesPart.class.getSimpleName()) + : getMesPart(genSerialNoModel.getOrganizeCode(), genSerialNoModel.getPartNo()); + + if (null == part) { + MesException.throwBusiException("入参缺少[part]!"); + } + + if (StringUtils.isEmpty(part.getPartSnParam())) { + MesException.throwBusiException("零件编码[%s]未维护零件条码参数!", part.getPartNo()); + } + + genSerialNoModel.setPartSnParam(part.getPartSnParam()); + //年月日缩写 + Date date = new Date(); + genSerialNoModel.setYear(getYearShort(date)); + genSerialNoModel.setMonth(getMonthShort(date)); + genSerialNoModel.setDay(getDayShort(date)); + return genSerialNoModel; + } + + private String getYearShort(Date date) { + return MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date))); + } + + private String getMonthShort(Date date) { + return MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date))); + } + + private String getDayShort(Date date) { + return MesExtEnumUtil.DAY_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getDay(date))); + } + + private MesPart getMesPart(String orgaizeCode, String partNo) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(orgaizeCode); + DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, ddlPackBean); + return partRepository.getByProperty(ddlPackBean); + } + +} \ No newline at end of file diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/WuHanCustSnNumberRuleStrategyService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/WuHanCustSnNumberRuleStrategyService.java new file mode 100644 index 0000000..3429d7d --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/numberrule/WuHanCustSnNumberRuleStrategyService.java @@ -0,0 +1,122 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.numberrule; + +import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException; +import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; +import cn.estsh.i3plus.mes.api.iservice.busi.INumberRulePackAttributeStrategyService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.Calendar; +import java.util.Date; + +/** + * 武汉客户条码 + */ +@Component +public class WuHanCustSnNumberRuleStrategyService implements INumberRulePackAttributeStrategyService { + + @Autowired + private MesCustomerPartRepository customerPartRepository; + + @Override + public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) { + if (null == genSerialNoModel) { + MesException.throwBusiException("入参缺少[GenSerialNoModel]!"); + } + if (StringUtils.isEmpty(genSerialNoModel.getOrganizeCode())) { + MesException.throwBusiException("入参缺少[organizeCode]!"); + } + if (StringUtils.isEmpty(genSerialNoModel.getPartNo()) && StringUtils.isEmpty(genSerialNoModel.getCustPartNo())) { + MesException.throwBusiException("入参缺少[custPartNo]!"); + } + + if (StringUtils.isEmpty(genSerialNoModel.getCustPartNo())) { + genSerialNoModel.setCustPartNo(getMesCustomerPart(genSerialNoModel.getOrganizeCode(), genSerialNoModel.getPartNo())); + } + + Calendar custCalendar = Calendar.getInstance(); + custCalendar.setTime(new Date()); + String prefix = genSerialNoModel.getCustPartNo().substring(0, genSerialNoModel.getCustPartNo().length() - 4); + String partNo4 = genSerialNoModel.getCustPartNo().substring(genSerialNoModel.getCustPartNo().length() - 4).toUpperCase(); + genSerialNoModel.setPartNo(prefix + partNo4); + genSerialNoModel.setCustPartNo(prefix + partNo4); + String year = custCalendar.get(Calendar.YEAR)+ MesExtConstWords.EMPTY; + genSerialNoModel.setYear(year.substring(2)); + genSerialNoModel.setDay(String.format("%03d",custCalendar.get(Calendar.DAY_OF_YEAR))); + + return genSerialNoModel; + } + + private String getMesCustomerPart(String orgaizeCode, String partNo) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(orgaizeCode); + DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.ERP_PART_NO, ddlPackBean); + MesCustomerPart customerPart = customerPartRepository.getByProperty(ddlPackBean); + if (null != customerPart) return customerPart.getCustPartNo(); + return partNo; + } + + @Override + public String transform(GenSerialNoModel genSerialNoModel, String serialNo) { + // [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% + //截取替换为ascii码 + String[] split = serialNo.split("%RS%"); + StringBuilder rsStr = new StringBuilder(); + for (int i = 0; i < split.length-1; i++) { + rsStr.append(split[i]).append((char) 30); + } + rsStr.append(split[split.length - 1]); + StringBuilder gsStr = new StringBuilder(); + String[] split1 = rsStr.toString().split("%GS%"); + for (int i = 0; i < split1.length-1; i++) { + gsStr.append(split1[i]).append((char) 29); + } + gsStr.append(split1[split1.length-1]); + String[] split2 = gsStr.toString().split("%EOT%"); + return split2[0]+(char)4; + } +} + +/** + * RS 为记录分隔符ASCII:30 + * GS 为分组符ASCII:29 + * EOT 为传输结束符ASCII:04 + * {splitRule} [)>%RS%06%GS%Y + * {splitRule} vpps= 4110000000000X + * {splitRule} %GS%P + * {partNo} 8位客户零件号 + * {splitRule} %GS%12V + * {splitRule} duns 545238347 + * {splitRule} %GS%T1A + * {yydayofyear} + * {splitRule} A2B4C + * {serialNo} 4位 步长1 + * {splitRule}%RS%%EOT% + *{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule} + * [)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% + * 通用二维码组成部分('RS'为记录分隔符ASCII:30,'GS'为分组符ASCII:29,'EOT'为传输结束符ASCII:04) + * [)>+'RS'+06+'GS'+Y+vpps+'GS'+P+8位客户零件号+'GS'+12V+DUNS+'GS'+T+1位line num+1位班次号+2位年份+3位天数+1位追溯(精确追溯A,批次追溯@)+2工程更改记录+2位自定义+4位流水号+'RS'+'EOT' + * 如:[)>+'RS'+06+'GS'+Y+4110000000000X+'GS'+P+12345678+'GS'+12V+545295227+'GS'+T+1A13304A2B4C0001+'RS'+'EOT' + * + * vpps = Y00000000000000 + * 8位客户零件号=最后四位要大写 + * Duns是什么? + * 1位lineNumber是什么? 固定值 1 + * 1位班次号是什么? + * 2位年YY 24 + * 3位天-~365/366 + * 追溯 + * A--精确追溯 + * @--批次追溯 + * + * 2位工程更改记录 + * 2位供应商自定义信息 + * 4位流水号,当班班次计数,每班班次归零 + * + * WH_CUST_SN_RULE + */ diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java index 8335a8c..df9c490 100644 --- a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java @@ -463,4 +463,7 @@ public class MesExtConstWords { //排序线不能做报工调整ESD属性类型 public static final String NOT_ALLOW_WRITE_OFF = "NOT_ALLOW_WRITE_OFF"; + // 默认客户条码编码规则配置代码 + public static final String DEFAULT_CUST_MATCH_RULE = "DEFAULT_CUST_MATCH_RULE"; + }