From 34b5108144bc6c131e52d798f7d07773321a4656 Mon Sep 17 00:00:00 2001 From: yxw Date: Mon, 4 Dec 2023 13:28:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=A7=E7=BA=BF=E7=8F=AD?= =?UTF-8?q?=E6=AC=A1=E5=9B=BA=E5=AE=9A=E4=BD=9C=E4=B8=9A=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=97=B6=E9=97=B4=E9=87=8D=E5=A4=8D=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=80=BB=E8=BE=91=E6=9C=89=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/api/base/INumberRuleExtService.java | 9 + .../busi/ISxNumberRuleCheckAttributeService.java | 22 + .../ext/mes/api/busi/jx/IJxProduceSnService.java | 9 + .../controller/base/WorkOrderExtController.java | 1 + .../ext/mes/apiservice/dao/jx/IJxProduceSnDao.java | 30 + .../serviceimpl/base/NumberRuleExtService.java | 10 + .../serviceimpl/base/ShiftProdCenterService.java | 2 + .../serviceimpl/base/WorkOrderExtService.java | 605 ++++++++++++++++++++- .../busi/ProductEncodeCfgExtService.java | 5 +- .../busi/SxNumberRuleCheckAttributeService.java | 344 ++++++++++++ .../serviceimpl/busi/bu3/SxPartExtService.java | 4 + .../serviceimpl/busi/jx/JxProduceSnService.java | 34 ++ .../excel/jx/SxReworkOrderBindSnExcelService.java | 3 +- .../jx/SxReworkOrderBindZjSnExcelService.java | 8 +- .../ext/mes/pojo/bean/MesProduceSnRepair.java | 1 + .../ext/mes/pojo/model/GenerateWorkOrderDto.java | 21 + .../i3plus/ext/mes/pojo/util/MesExtConstWords.java | 43 ++ 17 files changed, 1139 insertions(+), 12 deletions(-) create mode 100644 modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/ISxNumberRuleCheckAttributeService.java create mode 100644 modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxProduceSnService.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/jx/IJxProduceSnDao.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/SxNumberRuleCheckAttributeService.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxProduceSnService.java diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/INumberRuleExtService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/INumberRuleExtService.java index 2c80ffb..2b5f595 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/INumberRuleExtService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/INumberRuleExtService.java @@ -67,4 +67,13 @@ public interface INumberRuleExtService { */ @ApiOperation(value = "按条件查询条码生产规则数据", notes = "按条件查询条码生产规则数据") MesNumberRuleExt getNumberRule(MesNumberRuleExt numberRuleExt); + + /** + * 根据规则代码获取规则编码信息 + * @param organizeCode + * @param ruleCode + * @return + */ + @ApiOperation(value = "根据规则代码获取规则编码信息", notes = "根据规则代码获取规则编码信息") + MesNumberRuleExt getNumberRuleExtByRuleCode(String organizeCode, String ruleCode); } diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/ISxNumberRuleCheckAttributeService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/ISxNumberRuleCheckAttributeService.java new file mode 100644 index 0000000..8dd35e4 --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/ISxNumberRuleCheckAttributeService.java @@ -0,0 +1,22 @@ +package cn.estsh.i3plus.ext.mes.api.busi; + +import io.swagger.annotations.ApiOperation; + +import java.util.Map; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/19 15:06 下午 + * @Description: 根据编码规则校验编码是否有效 + **/ +public interface ISxNumberRuleCheckAttributeService { + + /** + * 根据编码规则校验编码是否有效 + * @param map 属性 + * @return 校验结果 + */ + @ApiOperation(value = "根据编码规则校验编码是否有效", notes = "根据编码规则校验编码是否有效") + Map doCheckNumberRule(Map map); + +} diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxProduceSnService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxProduceSnService.java new file mode 100644 index 0000000..e978596 --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxProduceSnService.java @@ -0,0 +1,9 @@ +package cn.estsh.i3plus.ext.mes.api.busi.jx; + +import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt; + +public interface IJxProduceSnService { + + MesProduceSnExt getProduceSn(String organizeCode, String productSn); + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/WorkOrderExtController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/WorkOrderExtController.java index 6b1bec3..8bcf846 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/WorkOrderExtController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/WorkOrderExtController.java @@ -58,6 +58,7 @@ public class WorkOrderExtController extends MesBaseController { .notNull("workCenterCode",workOrderDto.getWorkCenterCode()) .notNull("startTime",workOrderDto.getStartTime()) .notNull("endTime",workOrderDto.getEndTime()); + workOrderDto.setUserInfo(AuthUtil.getSessionUser().getUserName()); workOrderExtService.insertManualGenerate(workOrderDto); return ResultBean.success(); } catch (ImppBusiException busExcep) { diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/jx/IJxProduceSnDao.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/jx/IJxProduceSnDao.java new file mode 100644 index 0000000..0750bc6 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/jx/IJxProduceSnDao.java @@ -0,0 +1,30 @@ +package cn.estsh.i3plus.ext.mes.apiservice.dao.jx; + +import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pojo.model.jx.OqcLastCheckModel; +import cn.estsh.i3plus.pojo.base.common.Pager; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2019/11/21 11:28 上午 + * @Description: + **/ +public interface IJxProduceSnDao { + + /** + * 查询产品条码数量 + * @param model 查询信息 + * @return 总检验结果数量 + */ + int queryProduceSnByPagerCount(OqcLastCheckModel model); + + /** + * 查询产品条码信息集合 + * @param model 查询信息 + * @param pager 分页条件 + * @return SOP信息集合 + */ + List queryProduceSnByPager(OqcLastCheckModel model, Pager pager); +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/NumberRuleExtService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/NumberRuleExtService.java index 5e89bd0..6d54f89 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/NumberRuleExtService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/NumberRuleExtService.java @@ -197,4 +197,14 @@ public class NumberRuleExtService implements INumberRuleExtService { new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.RULE_CODE }, new Object[]{numberRuleExt.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), numberRuleExt.getRuleCode()}); } + + @Override + public MesNumberRuleExt getNumberRuleExtByRuleCode(String organizeCode, String ruleCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(ruleCode)) { + return null; + } + return numberRuleExtRepository.getByProperty( + new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.RULE_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), ruleCode}); + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/ShiftProdCenterService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/ShiftProdCenterService.java index 24c28e6..48ac61a 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/ShiftProdCenterService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/ShiftProdCenterService.java @@ -175,6 +175,8 @@ public class ShiftProdCenterService implements IShiftProdCenterService { if (!CollectionUtils.isEmpty(shiftProdList)) { prodCodeList = (shiftProdList.stream().filter(o -> null != o) .map(MesShiftProd::getProdCode).collect(Collectors.toList())).stream().distinct().collect(Collectors.toList()); + } else { + prodCodeList = new ArrayList<>(); } List finalProdCodeList = prodCodeList; shiftProdCenterList = shiftProdCenterList.stream() diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/WorkOrderExtService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/WorkOrderExtService.java index 46f2924..dddcf54 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/WorkOrderExtService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/WorkOrderExtService.java @@ -1,8 +1,14 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; +import cn.estsh.i3plus.ext.mes.api.base.INumberRuleExtService; import cn.estsh.i3plus.ext.mes.api.base.IWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.api.busi.IProductEncodeCfgExtService; +import cn.estsh.i3plus.ext.mes.api.busi.ISxNumberRuleCheckAttributeService; import cn.estsh.i3plus.ext.mes.api.busi.IWorkOrderLogExtService; import cn.estsh.i3plus.ext.mes.api.busi.IWorkOrderStartService; +import cn.estsh.i3plus.ext.mes.api.busi.bu3.ISxPartExtService; +import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxPackageExtService; +import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxProduceSnService; import cn.estsh.i3plus.ext.mes.icloud.sdk.IWmsErpHouseCheckCloud; import cn.estsh.i3plus.ext.mes.pojo.bean.*; import cn.estsh.i3plus.ext.mes.pojo.model.*; @@ -105,9 +111,43 @@ public class WorkOrderExtService implements IWorkOrderExtService { @Resource(name = MesExtConstWords.REDIS_MES) private ImppRedis redisMes; + @Autowired private MesProdBindRecordRepository prodBindRecordRepository; + @Autowired + private ISxNumberRuleCheckAttributeService numberRuleCheckAttributeService; + + @Autowired + private ISxPartExtService partExtService; + + @Autowired + private INumberRuleExtService numberRuleExtService; + + @Autowired + private IProductEncodeCfgExtService productEncodeCfgExtService; + + @Autowired + private IJxProduceSnService produceSnService; + + @Autowired + private MesProduceSnExtRepository produceSnExtRepository; + + @Autowired + private MesProduceSnRepairRepository produceSnRepairRepository; + + @Autowired + private IJxPackageExtService packageExtService; + + @Autowired + private MesPackageExtRepository packageExtRepository; + + @Autowired + private MesReworkOrderBindSnTravelRepository reworkOrderBindSnTravelRepository; + + @Autowired + private MesSubassemblyRemadeRecordRepository subassemblyRemadeRecordRepository; + /** * 生成生产工单 * @@ -117,20 +157,562 @@ public class WorkOrderExtService implements IWorkOrderExtService { @Transactional(rollbackFor = Exception.class) public void insertManualGenerate(GenerateWorkOrderDto workOrderDto) { MesWorkOrderExt mesWorkOrderExt = new MesWorkOrderExt(); - Double qty = workOrderDto.getQty(); - Double planQty = workOrderDto.getPlanQty(); - if(planQty > qty){ - throw new BaseImppException("计划返工数量不能大于计划生产数量"); - } + + checkReworkQty(workOrderDto); + + Object data = checkReworkOrderBindSn(workOrderDto); + BeanUtils.copyProperties(workOrderDto,mesWorkOrderExt); String userName = AuthUtil.getSessionUser().getUserName(); String organizeCode = AuthUtil.getOrganize().getOrganizeCode(); mesWorkOrderExt.setOrderNo(getOrderNo(userName,organizeCode)); mesWorkOrderExt.setWorkOrderSource(MesExtEnumUtil.WORK_ORDER_SOURCE.MANUALLY_GENERATE.getValue()); - insertNewWorkOrder(mesWorkOrderExt); + + doBindSn(workOrderDto, insertNewWorkOrder(mesWorkOrderExt), data); + } + + private void doBindSn(GenerateWorkOrderDto workOrderDto, MesWorkOrderExt mesWorkOrderExt, Object data) { + + if (data == null) return; + + workOrderDto.setOrderNo(mesWorkOrderExt.getOrderNo()); + + // 10 为成品 + if (workOrderDto.getPartExt().getCategoryCode3().equals("10")) doBindProductSn(mesWorkOrderExt, data); + // 其余都为组件 + else doBindPackage(workOrderDto, workOrderDto.getPartExt()); + + } + + private void doBindPackage(GenerateWorkOrderDto workOrderDto, Object data) { + + List packageExtList = (List) data; + + if (CollectionUtils.isEmpty(packageExtList)) return; + + List subassemblyRemadeRecordList = new ArrayList<>(); + + for (MesPackageExt packageExt : packageExtList) { + + MesSubassemblyRemadeRecord record = new MesSubassemblyRemadeRecord(); + record.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + record.setPackageNo(packageExt.getPackageNo()); + record.setLotNo(packageExt.getLotNo()); + record.setQty(0.0); + record.setInitWorkOrderNo(packageExt.getLastWorkOrderNo()); + record.setInitWorkCenterCode(packageExt.getWorkCenterCode()); + record.setInitQty(packageExt.getQty()); + record.setWorkOrderNo(workOrderDto.getOrderNo()); + record.setWorkCenterCode(workOrderDto.getWorkCenterCode()); + record.setPartNo(workOrderDto.getPartNo()); + record.setPartNameRdd(workOrderDto.getPartNameRdd()); + record.setOrganizeCode(workOrderDto.getOrganizeCode()); + ConvertBean.serviceModelInitialize(record, workOrderDto.getUserInfo()); + + subassemblyRemadeRecordList.add(record); + + } + + if (!CollectionUtils.isEmpty(subassemblyRemadeRecordList)) subassemblyRemadeRecordRepository.saveAll(subassemblyRemadeRecordList); + } + + private double getBoundSnQty(GenerateWorkOrderDto workOrderDto) { + + List subassemblyRemadeRecordList = subassemblyRemadeRecordRepository.findByProperty( + new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.WORK_ORDER_NO}, + new Object[]{workOrderDto.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workOrderDto.getOrderNo()}); + + if (!CollectionUtils.isEmpty(subassemblyRemadeRecordList)) { + workOrderDto.setPackSnList(subassemblyRemadeRecordList.stream().map(MesSubassemblyRemadeRecord::getPackageNo).collect(Collectors.toList())); + } + + return CollectionUtils.isEmpty(subassemblyRemadeRecordList) ? 0 : subassemblyRemadeRecordList.stream().mapToDouble(MesSubassemblyRemadeRecord::getInitQty).sum(); + + } + + private void doBindProductSn(MesWorkOrderExt mesWorkOrderExt, Object data) { + + List produceSnExtList = (List) data; + + if (CollectionUtils.isEmpty(produceSnExtList)) return; + + List produceSnRepairList = new ArrayList<>(); + List reworkOrderBindSnTravelList = new ArrayList<>(); + List packageExtList = new ArrayList<>(); + + for (MesProduceSnExt produceSnExt : produceSnExtList) { + + ConvertBean.serviceModelUpdate(produceSnExt, mesWorkOrderExt.getModifyUser()); + new ConvertBeanExt(produceSnExt).convertBean(produceSnExt); + produceSnExt.setLastWorkOrderNo(mesWorkOrderExt.getOrderNo()); + produceSnExt.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.REPAIR.getValue()); + produceSnExt.setRouteCode(null); + produceSnExt.setProcessCode(null); + produceSnExt.setWorkCellCode(null); + produceSnExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + new ConvertBeanExt(produceSnExt).convertBean(produceSnExt); + + MesProduceSnRepair produceSnRepair = new MesProduceSnRepair(); + produceSnRepair.setSerialNumber(produceSnExt.getSerialNumber()); + produceSnRepair.setProductSn(produceSnExt.getProductSn()); + produceSnRepair.setPartNo(produceSnExt.getPartNo()); + produceSnRepair.setPartNameRdd(produceSnExt.getPartNameRdd()); + produceSnRepair.setWorkCenterCode(mesWorkOrderExt.getWorkCenterCode()); + produceSnRepair.setWorkOrderNo(mesWorkOrderExt.getOrderNo()); + produceSnRepair.setInitWorkOrderNo(produceSnExt.getLastWorkOrderNo()); + produceSnRepair.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.REWORK_SN.getValue()); + produceSnRepair.setOrganizeCode(mesWorkOrderExt.getOrganizeCode()); + ConvertBean.serviceModelInitialize(produceSnRepair, mesWorkOrderExt.getModifyUser()); + produceSnRepair.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + produceSnRepairList.add(produceSnRepair); + + MesReworkOrderBindSnTravel reworkOrderBindSnTravel = new MesReworkOrderBindSnTravel(); + BeanUtils.copyProperties(produceSnRepair, reworkOrderBindSnTravel); + reworkOrderBindSnTravel.setBindStatus(MesExtEnumUtil.BIND_STATUS.BINGDING.getValue()); + reworkOrderBindSnTravelList.add(reworkOrderBindSnTravel); + + + MesPackageDetail packageDetail = packageExtService.getPackageDetailByProductSn(mesWorkOrderExt.getOrganizeCode(), produceSnExt.getProductSn()); + if (null != packageDetail) { + MesPackageExt packageExt = packageExtService.getPackageByPackNo(mesWorkOrderExt.getOrganizeCode(), packageDetail.getPackageNo()); + if (null != packageExt) { + packageExt.setLastWorkOrderNo(mesWorkOrderExt.getOrderNo()); + ConvertBean.serviceModelUpdate(packageExt, mesWorkOrderExt.getModifyUser()); + packageExt.setSystemSyncStatus(MesExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + new ConvertBeanExt(packageExt).convertBean(packageExt); + packageExtList.add(packageExt); + } + } + } + + produceSnExtRepository.saveAll(produceSnExtList); + if (!CollectionUtils.isEmpty(packageExtList)) packageExtRepository.saveAll(packageExtList); + if (!CollectionUtils.isEmpty(produceSnRepairList)) produceSnRepairRepository.saveAll(produceSnRepairList); + if (!CollectionUtils.isEmpty(reworkOrderBindSnTravelList)) reworkOrderBindSnTravelRepository.saveAll(reworkOrderBindSnTravelList); + } + + private Object checkReworkOrderBindSn(GenerateWorkOrderDto workOrderDto) { + + if (workOrderDto.getWorkOrderType() != MesExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() || StringUtils.isEmpty(workOrderDto.getProductSnStart()) || StringUtils.isEmpty(workOrderDto.getProductSnEnd())) return null; + + MesPartExt partExtDb = getMesPartExt(workOrderDto); + + workOrderDto.setPartExt(partExtDb); + + // 10 为成品 + if (partExtDb.getCategoryCode3().equals("10")) return getMesProduceSnExtList(workOrderDto, partExtDb); + // 其余都是组件 + else return getMesPackageExtList(workOrderDto, partExtDb); + } + + private MesPartExt getMesPartExt(GenerateWorkOrderDto workOrderDto) { + MesPartExt partExtDb = partExtService.getPartExtByPartNo(workOrderDto.getOrganizeCode(), workOrderDto.getPartNo()); + + if (partExtDb == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("物料编码[%s]不存在", workOrderDto.getPartNo()) + .build(); + } + + if (StringUtils.isEmpty(partExtDb.getCategoryCode3())) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("物料编码[%s]未维护物料分类3,无法确定为成品或是组件", workOrderDto.getPartNo()) + .build(); + } + return partExtDb; } - private void insertNewWorkOrder(MesWorkOrderExt mesWorkOrderExt) { + private List getMesPackageExtList(GenerateWorkOrderDto workOrderDto, MesPartExt partExtDb) { + String ruleCode; + try { + ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType( + workOrderDto.getOrganizeCode(), MesExtEnumUtil.ENCODE_CODE_TYPE.PACK_SN.getValue(), partExtDb, workOrderDto.getWorkCenterCode()); + } catch (Exception e) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("物料编码[%s]:[%s]!", workOrderDto.getPartNo(), e.getMessage()) + .build(); + } + + MesNumberRuleExt numberRuleExt = getMesNumberRuleExt(workOrderDto, ruleCode); + + checkPackageSnValid( workOrderDto, workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()); + + checkProduceNumberRuleIsValid(partExtDb, ruleCode, numberRuleExt, workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()); + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(workOrderDto.getOrganizeCode()); + DdlPreparedPack.getStringBiggerPack(workOrderDto.getProductSnStart(), MesExtConstWords.PACKAGENO, packBean); + DdlPreparedPack.getStringSmallerPack(workOrderDto.getProductSnEnd(), MesExtConstWords.PACKAGENO, packBean); + int snCount = packageExtRepository.findByHqlWhereCount(packBean); + + checkSnCount(workOrderDto, snCount); + + List packageExtDbList = packageExtRepository.findByHqlWhere(packBean); + + Double totalQty = packageExtDbList.stream().mapToDouble(MesPackageExt::getQty).sum(); + + //List packageNoList = packageExtDbList.stream().map(MesPackageExt::getPackageNo).collect(Collectors.toList()); + + if (totalQty.compareTo(workOrderDto.getQty()) > 0) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("起始包装条码[%s]和截至包装条码[%s]包装数量总和[%s]大于工单[%s]计划数量[%s],请扣减一定数量的包装再进行绑定", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd(), totalQty.toString(), workOrderDto.getOrderNo(), workOrderDto.getQty()) + .build(); + } + + //double boundSnQty = getBoundSnQty(workOrderDto); + + //List packSnList = workOrderDto.getPackSnList(); + //if (!CollectionUtils.isEmpty(packSnList) && !CollectionUtils.isEmpty(packageNoList)) { + // + // for (String packageNo : packSnList) { + // if (packageNoList.contains(packageNo)) { + // throw ImppExceptionBuilder.newInstance() + // .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + // .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + // .setErrorDetail("包装条码[%s]已绑定至工单[%s],无需再次绑定", packageNo, workOrderDto.getOrderNo()) + // .build(); + // + // } + // } + //} + + //编码规则 + String[] serialNoArray = numberRuleExt.getNumberRule().split("}\\{"); + //规则属性长度拼接 + String[] ruleLengthSpiltArray = numberRuleExt.getRuleLengthSpilt().split(","); + String serialNoStr = "serialno"; + int serialNoIndex = -1; + for (int index = 0; index < serialNoArray.length; index++) { + if(serialNoArray[index].contains(serialNoStr)) serialNoIndex = index; + } + + int ruleLengthTotal = 0; + if(serialNoIndex != -1){ + for (int index = 0; index < serialNoIndex; index++) { + ruleLengthTotal += Integer.parseInt(ruleLengthSpiltArray[index]); + } + } + int finalRuleLengthTotal = ruleLengthTotal; + int finalSerialNoIndex = serialNoIndex; + + packageExtDbList = packageExtDbList.stream().sorted(Comparator.comparing(MesPackageExt::getPackageNo)).collect(Collectors.toList()); + + Integer lastSerialNo = null; + String lastProductSn = null; + + for (MesPackageExt packageExt : packageExtDbList) { + + int curSerialNo = Integer.parseInt(packageExt.getSerialNumber().substring(finalRuleLengthTotal, finalRuleLengthTotal + Integer.parseInt(ruleLengthSpiltArray[finalSerialNoIndex]))); + + if (lastSerialNo == null) { + + lastSerialNo = curSerialNo; + lastProductSn = packageExt.getPackageNo(); + continue; + } + + if (curSerialNo - lastSerialNo !=1 ) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("上一个包装条码[%s]与包装条码[%s]流水号存在跳号", lastProductSn, packageExt.getPackageNo()) + .build(); + } + + lastProductSn = packageExt.getPackageNo(); + lastSerialNo = curSerialNo; + } + return packageExtDbList; + } + + private MesNumberRuleExt getMesNumberRuleExt(GenerateWorkOrderDto workOrderDto, String ruleCode) { + MesNumberRuleExt numberRuleExt = numberRuleExtService.getNumberRuleExtByRuleCode(workOrderDto.getOrganizeCode(), ruleCode); + + if (numberRuleExt == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("物料编码[%s]未配置生产编码规则", workOrderDto.getPartNo()) + .build(); + } + return numberRuleExt; + } + + private void checkSnCount(GenerateWorkOrderDto workOrderDto, int snCount) { + if (snCount > workOrderDto.getQty()) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("起始条码[%s]与截至条码[%s]之间存在的条码数量大于当前工单计划数量", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()) + .build(); + } + + if (snCount == 0) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("未查询到起始条码[%s]与截至条码[%s]区间条码", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()) + .build(); + } + } + + private List getMesProduceSnExtList(GenerateWorkOrderDto workOrderDto, MesPartExt partExtDb) { + String ruleCode; + try { + ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType( + workOrderDto.getOrganizeCode(), MesExtEnumUtil.ENCODE_CODE_TYPE.STANDARD_SERIAL_SN.getValue(), partExtDb, workOrderDto.getWorkCenterCode()); + } catch (Exception e) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("物料编码[%s]:[%s]!", workOrderDto.getPartNo(), e.getMessage()) + .build(); + } + + MesNumberRuleExt numberRuleExt = getMesNumberRuleExt(workOrderDto, ruleCode); + + checkProductSnValid(workOrderDto.getOrganizeCode(), workOrderDto.getPartNo(), workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()); + + checkProduceNumberRuleIsValid(partExtDb, ruleCode, numberRuleExt, workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()); + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(workOrderDto.getOrganizeCode()); + DdlPreparedPack.getStringBiggerPack(workOrderDto.getProductSnStart(), MesExtConstWords.PRODUCT_SN, packBean); + DdlPreparedPack.getStringSmallerPack(workOrderDto.getProductSnEnd(), MesExtConstWords.PRODUCT_SN, packBean); + DdlPreparedPack.getStringSmallerPack(workOrderDto.getProductSnEnd(), MesExtConstWords.PRODUCT_SN, packBean); + int snCount = produceSnExtRepository.findByHqlWhereCount(packBean); + + if (snCount == 0) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("未查询到起始条码[%s]与截至条码[%s]区间条码", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()) + .build(); + } + + if (snCount > workOrderDto.getQty()) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("起始条码[%s]与截至条码[%s]之间存在的条码数量大于当前工单计划数量", workOrderDto.getProductSnStart(), workOrderDto.getProductSnEnd()) + .build(); + } + + List produceSnExtDbList = produceSnExtRepository.findByHqlWhere(packBean); + + checkSn(workOrderDto, produceSnExtDbList); + + //编码规则 + String[] serialNoArray = numberRuleExt.getNumberRule().split("}\\{"); + //规则属性长度拼接 + String[] ruleLengthSpiltArray = numberRuleExt.getRuleLengthSpilt().split(","); + String serialNoStr = "serialno"; + int serialNoIndex = -1; + for (int index = 0; index < serialNoArray.length; index++) { + if(serialNoArray[index].contains(serialNoStr)) serialNoIndex = index; + } + + int ruleLengthTotal = 0; + if(serialNoIndex != -1){ + for (int index = 0; index < serialNoIndex; index++) { + ruleLengthTotal += Integer.parseInt(ruleLengthSpiltArray[index]); + } + } + int finalRuleLengthTotal = ruleLengthTotal; + int finalSerialNoIndex = serialNoIndex; + + produceSnExtDbList = produceSnExtDbList.stream().sorted(Comparator.comparing(MesProduceSnExt::getProductSn)).collect(Collectors.toList()); + + Integer lastSerialNo = null; + String lastProductSn = null; + for (MesProduceSnExt produceSnExt : produceSnExtDbList) { + + int curSerialNo = Integer.parseInt(produceSnExt.getSerialNumber().substring(finalRuleLengthTotal, finalRuleLengthTotal + Integer.parseInt(ruleLengthSpiltArray[finalSerialNoIndex]))); + + if (lastSerialNo == null) { + + lastSerialNo = curSerialNo; + lastProductSn = produceSnExt.getProductSn(); + continue; + } + + if (curSerialNo - lastSerialNo !=1 ) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("上一个产品条码[%s]与产品条码[%s]流水号存在跳号", lastProductSn, produceSnExt.getProductSn()) + .build(); + } + + lastProductSn = produceSnExt.getProductSn(); + lastSerialNo = curSerialNo; + } + return produceSnExtDbList; + } + + private void checkSn(GenerateWorkOrderDto workOrderDto, List produceSnExtDbList) { + for (MesProduceSnExt produceSnExt : produceSnExtDbList) { + if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() != produceSnExt.getSnStatus()) { + if (MesExtEnumUtil.PRODUCE_SN_STATUS.REPAIR.getValue() == produceSnExt.getSnStatus()) { + + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("条码[" + produceSnExt.getProductSn() + "]状态为返工,已绑定返工工单[" + produceSnExt.getLastWorkOrderNo() + "]") + .build(); + + } else { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("条码[" + produceSnExt.getProductSn() + "]状态为[" + MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSnExt.getSnStatus()) + "]") + .build(); + } + } + + if (MesExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() != produceSnExt.getQcStatus()) { + + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("条码[" + produceSnExt.getProductSn() + "]质量状态为[" + MesExtEnumUtil.PRODUCE_SN_QC_STATUS.valueOfDescription(produceSnExt.getQcStatus()) + "]") + .build(); + + } + + if (MesExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExt.getOperateType()) { + + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("条码[" + produceSnExt.getProductSn() + "]操作类型为[" + MesExtEnumUtil.PRODUCE_SN_QC_STATUS.valueOfDescription(produceSnExt.getQcStatus()) + "]") + .build(); + + } + + MesProduceSnRepair produceSnRepairBySn = getProduceSnRepairBySn(workOrderDto.getOrganizeCode(), produceSnExt.getProductSn()); + + if (produceSnRepairBySn != null) { + if (StringUtils.isEmpty(produceSnRepairBySn.getOutWorkCenterTime())) { + + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) + .setErrorDetail("条码[" + produceSnExt.getProductSn() + "]已经绑定过其他的返工工单[" + produceSnRepairBySn.getWorkOrderNo() + "]且未下线") + .build(); + + } + } + } + } + + private MesProduceSnRepair getProduceSnRepairBySn(String organizeCode, String productSn) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) { + return null; + } + List produceSnRepairList = produceSnRepairRepository.findByProperty( + new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn}, + " order by createDatetime desc "); + return !CollectionUtils.isEmpty(produceSnRepairList) ? produceSnRepairList.get(0) : null; + } + + private void checkProduceNumberRuleIsValid(MesPartExt partExtDb, String ruleCode, MesNumberRuleExt numberRuleExt, String... productSnArr) { + + for (String productSn : productSnArr) { + Map map = new HashMap<>(); + map.put(MesExtConstWords.SERIAL_NUMBER, productSn); + map.put(MesExtConstWords.NUMBER_RULE_EXT, numberRuleExt); + map.put(MesExtConstWords.PART_EXT, partExtDb); + + Map resultMap = numberRuleCheckAttributeService.doCheckNumberRule(map); + if ((Boolean)resultMap.get(MesExtConstWords.RESULT) == false) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("条码[%s]关联物料[%s]配置的编码规则代码[%s]无效", productSn, partExtDb.getPartNo(), ruleCode) + .build(); + } + } + + } + + private void checkPackageSnValid(GenerateWorkOrderDto workOrderDto, String... packageNoArr) { + + for (String packageNo : packageNoArr) { + MesPackageExt packageExt = packageExtRepository.getByProperty( + new String[]{MesExtConstWords.ORGANIZE_CODE, MesExtConstWords.IS_DELETED, MesExtConstWords.IS_VALID, MesExtConstWords.PACKAGENO}, + new Object[]{workOrderDto.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), packageNo}); + + if (packageExt == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("包装条码[%s]无效", packageNo) + .build(); + } + + if (MesEnumUtil.PACKAGE_IS_SEALED.UNSEALED.getValue() == packageExt.getIsSealed()) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("包装条码[%s]未封箱", packageNo) + .build(); + } + + if (!workOrderDto.getPartNo().equals(packageExt.getPartNo())) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("包装条码[%s]关联物料编码[%s]与当前工单关联物料编码[%s]不一致", packageNo, packageExt.getPartNo(), workOrderDto.getPartNo()) + .build(); + } + } + } + + private void checkProductSnValid(String organizeCode, String partNo, String... produceSnArr) { + + for (String produceSn : produceSnArr) { + + MesProduceSnExt produceSnDb = produceSnService.getProduceSn(organizeCode, produceSn); + + if (produceSnDb == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("产品条码[%s]无效", produceSn) + .build(); + } + + if (StringUtils.isEmpty(produceSnDb.getOutWorkCenterTime())) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("产品条码[%s]未下线", produceSn) + .build(); + } + + if (!partNo.equals(produceSnDb.getPartNo())) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("产品条码[%s]关联物料编码[%s]与当前工单关联物料编码[%s]不一致", produceSn, produceSnDb.getPartNo(), partNo) + .build(); + } + } + } + + private void checkReworkQty(GenerateWorkOrderDto workOrderDto) { + if(workOrderDto.getPlanQty() > workOrderDto.getQty()) throw new BaseImppException("计划返工数量不能大于计划生产数量"); + } + + private MesWorkOrderExt insertNewWorkOrder(MesWorkOrderExt mesWorkOrderExt) { String organizeCode = AuthUtil.getOrganize().getOrganizeCode(); Integer workOrderType = mesWorkOrderExt.getWorkOrderType(); //如果是返工工单 设置是否生成条码为不生成 @@ -155,7 +737,12 @@ public class WorkOrderExtService implements IWorkOrderExtService { } boolean havePart = isHavePart(mesWorkOrderExt.getPartNo(), organizeCode); if (!havePart) { - throw new BaseImppException("物料号不存在"); + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("物料号[%s]不存在", + mesWorkOrderExt.getPartNo()) + .build(); } mesWorkOrderExt.setWorkOrderStatus(MesExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue()); @@ -168,6 +755,8 @@ public class WorkOrderExtService implements IWorkOrderExtService { new ConvertBeanExt(mesWorkOrderExt).convertBean(mesWorkOrderExt); MesWorkOrderExt workOrderExt = workOrderExtRepository.insert(mesWorkOrderExt); insertMesWorkOrderLog(workOrderExt); + + return workOrderExt; } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java index 9b9b8cb..245a3f6 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java @@ -127,10 +127,13 @@ public class ProductEncodeCfgExtService implements IProductEncodeCfgExtService { model.setOrganizeCode(organizeCode); model.setCodeType(codeType); switch (MesExtEnumUtil.ENCODE_CODE_TYPE.getByValue(codeType)) { + case SERIAL_SN: + model.setMatchType(partDb.getProcessMatchType()); + break; case STANDARD_SERIAL_SN : case REWORK_SERIAL_SN : case ATTEMPT_SERIAL_SN : - model.setMatchType(partDb.getProcessMatchType()); + model.setMatchType(partDb.getProductMatchType()); break; case PACK_SN : model.setMatchType(partDb.getPackageMatchType()); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/SxNumberRuleCheckAttributeService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/SxNumberRuleCheckAttributeService.java new file mode 100644 index 0000000..b1b3bce --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/SxNumberRuleCheckAttributeService.java @@ -0,0 +1,344 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.api.busi.ISxNumberRuleCheckAttributeService; +import cn.estsh.i3plus.ext.mes.pojo.bean.MesNumberRuleExt; +import cn.estsh.i3plus.ext.mes.pojo.bean.MesPartExt; +import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: wangjie + * @CreateDate: 2019/8/23 1:16 PM + * @Description: 根据编码规则校验编码是否有效 + **/ + +@Service +public class SxNumberRuleCheckAttributeService implements ISxNumberRuleCheckAttributeService { + + @Override + public Map doCheckNumberRule(Map map) { + + MesNumberRuleExt numberRuleDb = (MesNumberRuleExt) map.get(MesExtConstWords.NUMBER_RULE_EXT); + + try { + return doCheck(map, numberRuleDb); + } catch (Exception e) { + Map resultMap = new HashMap<>(); + resultMap.put(MesExtConstWords.RESULT, false); + return resultMap; + } + } + + private Map doCheck(Map map, MesNumberRuleExt numberRuleDb) throws Exception { + Method method = this.getClass().getDeclaredMethod(numberRuleDb.getMethodName(), Map.class, MesNumberRuleExt.class); + method.setAccessible(true); + return (Map) method.invoke(this, map, numberRuleDb); + } + + private List getSerialNumberList(String serialNumber, List ruleLengthListStr, List ruleLengthList) { + List serialNumberList = new ArrayList<>(); + Integer begin = 0; + Integer end; + if (!CollectionUtils.isEmpty(ruleLengthList)) { + for (Integer length : ruleLengthList) { + end = begin + length; + serialNumberList.add(serialNumber.substring(begin, end)); + begin = end; + } + } else { + for (String length : ruleLengthListStr) { + if (length.equals(MesExtConstWords.J)) { + String serialFormJStart = serialNumber.substring(begin); + Integer indexOneSpace = serialFormJStart.indexOf(MesExtConstWords.ONE_SPACE); + if (indexOneSpace == -1) { + throw new ImppBusiException(); + } + end = begin + indexOneSpace; + serialNumberList.add(serialFormJStart.substring(0, indexOneSpace)); + ruleLengthList.add(indexOneSpace); + begin = end; + } else { + end = begin + Integer.valueOf(length); + if (serialNumber.length() < end) { + throw new ImppBusiException(); + } + serialNumberList.add(serialNumber.substring(begin, end)); + ruleLengthList.add(Integer.valueOf(length)); + begin = end; + } + } + } + return serialNumberList; + } + + private Map commonCheck(Map map, MesNumberRuleExt numberRuleDb, List dynamicRuleList) { + Map resultMap = new HashMap<>(); + resultMap.put(MesExtConstWords.RESULT, false); + String serialNumber = (String) map.get(MesExtConstWords.SERIAL_NUMBER); + MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT); + + List numberRuleList = Arrays.asList( + numberRuleDb.getNumberRule().replace(MesExtConstWords.LEFT_BRACE, MesExtConstWords.EMPTY).split(MesExtConstWords.RIGHT_BRACE)); + numberRuleList = numberRuleList.stream().map(o -> o.toUpperCase()).collect(Collectors.toList()); + + String ruleLengthSpilt = numberRuleDb.getRuleLengthSpilt(); + if (ruleLengthSpilt.contains(MesExtConstWords.P)) { + ruleLengthSpilt = ruleLengthSpilt.replaceAll(MesExtConstWords.P, String.valueOf(partExt.getPartNo().length())); + } + if (ruleLengthSpilt.contains(MesExtConstWords.L)) { + ruleLengthSpilt = ruleLengthSpilt.replaceAll(MesExtConstWords.L, StringUtils.isEmpty(partExt.getPartLotNoLength()) ? "0" : String.valueOf(partExt.getPartLotNoLength())); + } + + List ruleLengthListStr = Arrays.asList(ruleLengthSpilt.split(MesExtConstWords.COMMA)); + List ruleLengthList = new ArrayList<>(); + + List spiltRuleList = StringUtils.isEmpty(numberRuleDb.getSpiltRule()) ? null : + new ArrayList<>(Arrays.asList(numberRuleDb.getSpiltRule().split(MesExtConstWords.COMMA))); + + if (!ruleLengthSpilt.contains(MesExtConstWords.J)) { + + ruleLengthList = ruleLengthListStr.stream().map(Integer::valueOf).collect(Collectors.toList()); + + Integer length = ruleLengthList.stream().reduce(Integer::sum).orElse(0); + + if (Integer.valueOf(serialNumber.length()).compareTo(length) != 0) { + return resultMap; + } + + } + + try { + + List serialNumberList = getSerialNumberList(serialNumber, ruleLengthListStr, ruleLengthList); + + if (ruleLengthSpilt.contains(MesExtConstWords.J)) { + + Integer length = ruleLengthList.stream().reduce(Integer::sum).orElse(0); + + if (Integer.valueOf(serialNumber.length()).compareTo(length) != 0) { + return resultMap; + } + + } + + int snIndex = 0; + for (String s : numberRuleList) { + switch (s) { + case MesExtConstWords.PREFIX_BIG: + if (!serialNumberList.get(0).equals(numberRuleDb.getPrefix()) || + Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + case MesExtConstWords.PARTNO: + if (null == partExt || !serialNumberList.get(0).equals(partExt.getPartNo()) || + Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + case MesExtConstWords.YEAR: + case MesExtConstWords.MONTH_UPPER_CASE: + case MesExtConstWords.DAY_UPPER_CASE: + case MesExtConstWords.HOUR: + case MesExtConstWords.MINUTE: + case MesExtConstWords.SECOND: + //---兼容EP---- + case MesExtConstWords.J://日文 + case MesExtConstWords.SUPPLIERRULE: + if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + case MesExtConstWords.L: //变更号 + if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + resultMap.put(MesExtConstWords.L, serialNumberList.get(0)); + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + case MesExtConstWords.N: //数量 + if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + resultMap.put(MesExtConstWords.N, serialNumberList.get(0)); + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + case MesExtConstWords.SERIALNO: + if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + resultMap.put(MesExtConstWords.SEQNO, serialNumberList.get(0)); + StringBuffer snWithoutSeqNoBuffer = new StringBuffer(serialNumber); + if(resultMap.containsKey(MesExtConstWords.SN_WITHOUT_SEQNO)){ + String snWithoutSeqNo = String.valueOf(resultMap.get(MesExtConstWords.SN_WITHOUT_SEQNO)); + snWithoutSeqNoBuffer = new StringBuffer(snWithoutSeqNo); + } + + resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, snWithoutSeqNoBuffer.replace(snIndex, snIndex + ruleLengthList.get(0), MesExtConstWords.SEQNO)); + + snIndex += ruleLengthList.get(0); + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + case MesExtConstWords.SERIALNO2: + if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + resultMap.put(MesExtConstWords.SEQNO2, serialNumberList.get(0)); + if(resultMap.containsKey(MesExtConstWords.SN_WITHOUT_SEQNO)){ + String snWithoutSeqNo = String.valueOf(resultMap.get(MesExtConstWords.SN_WITHOUT_SEQNO)); + resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, snWithoutSeqNo.replaceFirst(serialNumberList.get(0), MesExtConstWords.SEQNO2)); + }else{ + resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, serialNumber.replaceFirst(serialNumberList.get(0), MesExtConstWords.SEQNO2)); + } + serialNumberList.remove(0); + ruleLengthList.remove(0); + break; + //---兼容EP---- + case MesExtConstWords.SPILTRULE: + //配置空格使用"/u0020" + if (CollectionUtils.isEmpty(spiltRuleList) || !serialNumberList.get(0).equals(spiltRuleList.get(0)) || + Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + serialNumberList.remove(0); + ruleLengthList.remove(0); + spiltRuleList.remove(0); + break; + case MesExtConstWords.DYNAMICRULE: + if (CollectionUtils.isEmpty(dynamicRuleList) || !serialNumberList.get(0).equals(dynamicRuleList.get(0)) || + Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) { + throw new ImppBusiException(); + } + snIndex += ruleLengthList.get(0); + serialNumberList.remove(0); + ruleLengthList.remove(0); + dynamicRuleList.remove(0); + break; + default: + throw new ImppBusiException(); + } + } + + } catch (ImppBusiException e) { + return resultMap; + } + + resultMap.put(MesExtConstWords.RESULT, true); + return resultMap; + } + + /** + * 动态字符包含 物料识别码,条码末尾数 + * 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 配置 + */ + private Map method1(Map map, MesNumberRuleExt numberRuleDb){ + MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT); + + List dynamicRuleList = new ArrayList<>(); + dynamicRuleList.add(partExt.getIdentifyCode()); + dynamicRuleList.add(partExt.getSnLastCode()); + + return commonCheck(map, numberRuleDb, dynamicRuleList); + } + + + /** + * 动态字符包含 颜色代码 + * 年月日默认使用工单计划开始时间 + * 年:取年份最后一位数 + * 月份:10月使用大写字母O,11月使用大写字母N,12月使用大写字母D + * 编码规则可增加 日 时 分 秒 前缀 流水号 配置 + */ + private Map method2(Map map, MesNumberRuleExt numberRuleDb){ + MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT); + + List dynamicRuleList = new ArrayList<>(); + dynamicRuleList.add(partExt.getColorCode()); + + return commonCheck(map, numberRuleDb, dynamicRuleList); + } + + /** + * 动态字符包含 物料识别码 + * 年月日默认使用工单计划开始时间 + * 年:取年份最后两位数 + * 编码规则可增加 月 日 时 分 秒 前缀 流水号 配置 + */ + private Map method3(Map map, MesNumberRuleExt numberRuleDb){ + MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT); + + List dynamicRuleList = new ArrayList<>(); + dynamicRuleList.add(partExt.getIdentifyCode()); + + return commonCheck(map, numberRuleDb, dynamicRuleList); + } + + /** + * 动态字符包含 物料识别码 + * 年月日默认使用工单计划开始时间 + * 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 配置 + */ + private Map method4(Map map, MesNumberRuleExt numberRuleDb){ + return method3(map, numberRuleDb); + } + + /** + * 动态字符包含 颜色代码 + * 年月日默认使用工单计划开始时间 + * 年:取年份最后两位数 + * 月份:10月使用大写字母O,11月使用大写字母N,12月使用大写字母D + * 编码规则可增加 日 时 分 秒 前缀 流水号 配置 + */ + private Map method5(Map map, MesNumberRuleExt numberRuleDb){ + return method2(map, numberRuleDb); + } + + /** + * 动态字符包含 物料识别码 + * 年月日默认使用工单计划开始时间 + * 年:取年份最后两位数 + * 月份:10月使用大写字母O,11月使用大写字母N,12月使用大写字母D + * 编码规则可增加 日 时 分 秒 前缀 流水号 配置 + */ + private Map method6(Map map, MesNumberRuleExt numberRuleDb){ + return method3(map, numberRuleDb); + } + + /** + * 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 物料号 供应商定制代码 固定拼接字符 配置 + */ + private Map epmethod1(Map map, MesNumberRuleExt numberRuleDb){ + return commonCheck(map, numberRuleDb, null); + } + + /** + * 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 物料号 供应商定制代码 固定拼接字符 配置 + */ + private Map jxmethod1(Map map, MesNumberRuleExt numberRuleDb){ + return commonCheck(map, numberRuleDb, null); + } + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/bu3/SxPartExtService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/bu3/SxPartExtService.java index ab5e776..1898961 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/bu3/SxPartExtService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/bu3/SxPartExtService.java @@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.util.List; import java.util.Map; @@ -36,6 +37,9 @@ public class SxPartExtService implements ISxPartExtService { @Override public MesPartExt getPartExtByPartNo(String organizeCode, String partNo) { + + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo)) return null; + return partExtRepository.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}); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxProduceSnService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxProduceSnService.java new file mode 100644 index 0000000..8136941 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxProduceSnService.java @@ -0,0 +1,34 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxProduceSnService; +import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pojo.repository.MesProduceSnExtRepository; +import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; +import cn.estsh.i3plus.platform.common.util.MesConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * @PROJECT_NAME: i3plus-mes-panasonic-jx + * @DESCRIPTION: + * @USER: xinwang.yi + * @DATE: 2023-11-29 11:39 + */ +@Service +public class JxProduceSnService implements IJxProduceSnService { + + @Autowired + private MesProduceSnExtRepository produceSnExtRepository; + + @Override + public MesProduceSnExt getProduceSn(String organizeCode, String productSn) { + + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null; + + return produceSnExtRepository.getByProperty( + new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn}); + } +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindSnExcelService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindSnExcelService.java index 9993117..df56481 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindSnExcelService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindSnExcelService.java @@ -242,7 +242,7 @@ public class SxReworkOrderBindSnExcelService implements IExcelImportExtService { } else if (StringUtils.isEmpty(produceSnRepairBySn.getOutWorkCenterTime())) { errorNum ++; cellNum += "B;"; - errorInfo += "条码["+ produceSnExt.getProductSn() +"]已经绑定过其他的返工工单["+ workOrderNo +"]且未下线;"; + errorInfo += "条码["+ produceSnExt.getProductSn() +"]已经绑定过其他的返工工单["+ produceSnExt.getLastWorkOrderNo() +"]且未下线;"; } } } @@ -256,6 +256,7 @@ public class SxReworkOrderBindSnExcelService implements IExcelImportExtService { MesPackageExt packageExt = packageExtService.getPackageByPackNo(organizeCode, packageDetail.getPackageNo()); if (null != packageExt) { packageNo = packageExt.getPackageNo(); + packageExtDbList.add(packageExt); } } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindZjSnExcelService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindZjSnExcelService.java index 94bed57..0546ced 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindZjSnExcelService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/excel/jx/SxReworkOrderBindZjSnExcelService.java @@ -176,8 +176,12 @@ public class SxReworkOrderBindZjSnExcelService implements IExcelImportExtService partMap.put(workOrderExt.getPartNo(), partExt); - // 组件 - if (!StringUtils.isEmpty(partExt.getCategoryCode3()) && partExt.getCategoryCode3().equals("10")) { + if (StringUtils.isEmpty(partExt.getCategoryCode3())) { + errorNum ++; + cellNum += "A;"; + errorInfo += "第A列数据工单[" + workOrderNo + "]关联物料["+ workOrderExt.getPartNo() +"]未维护物料分类3,无法确定为成品或是组件;"; + } else if (partExt.getCategoryCode3().equals("10")) { + // 10 则为成品 errorNum ++; cellNum += "A;"; errorInfo += "第A列数据工单[" + workOrderNo + "]关联物料["+ workOrderExt.getPartNo() +"]不为组件;"; diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/bean/MesProduceSnRepair.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/bean/MesProduceSnRepair.java index f36d3fb..5e6466f 100644 --- a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/bean/MesProduceSnRepair.java +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/bean/MesProduceSnRepair.java @@ -26,6 +26,7 @@ import java.io.Serializable; @Table(name = "MES_PRODUCE_SN_REPAIR", indexes = { @Index(columnList = "WORK_ORDER_NO"), @Index(columnList = "SERIAL_NUMBER"), + @Index(columnList = "PRODUCT_SN"), @Index(columnList = "SERIAL_NUMBER,WORK_ORDER_NO"), @Index(columnList = "WORK_ORDER_NO, WORK_TIME, SHIFT_CODE") }) diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/GenerateWorkOrderDto.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/GenerateWorkOrderDto.java index 9ce19ae..83792ef 100644 --- a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/GenerateWorkOrderDto.java +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/GenerateWorkOrderDto.java @@ -1,9 +1,12 @@ package cn.estsh.i3plus.ext.mes.pojo.model; +import cn.estsh.i3plus.ext.mes.pojo.bean.MesPartExt; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiParam; import lombok.Data; +import java.util.List; + /** * @author yumingxing * @version 1.0 @@ -58,4 +61,22 @@ public class GenerateWorkOrderDto { @ApiParam("Erp库存地") private String erpWarehouse; + @ApiParam("产品条码起始") + private String productSnStart; + + @ApiParam("产品条码截至") + private String productSnEnd; + + @ApiParam("工厂代码") + private String organizeCode; + + @ApiParam("操作人") + private String userInfo; + + @ApiParam + private MesPartExt partExt; + + @ApiParam + private List packSnList; + } 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 d2b312c..40e3cca 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 @@ -904,4 +904,47 @@ public class MesExtConstWords { //节拍限制值配置 public static final String SX_WORK_CELL_TAKT_LIMIT_CFG = "SX_WORK_CELL_TAKT_LIMIT_CFG"; + public static final String NUMBER_RULE_EXT = "NUMBER_RULE_EXT"; + //前缀 + public static final String PREFIX_BIG = "PREFIX"; + //物料号 + public static final String PARTNO = "PARTNO"; + //年 + public static final String YEAR = "YEAR"; + //月 + public static final String MONTH_UPPER_CASE = "MONTH"; + //日 + public static final String DAY_UPPER_CASE = "DAY"; + //时 + public static final String HOUR = "HOUR"; + //分 + public static final String MINUTE = "MINUTE"; + //秒 + public static final String SECOND = "SECOND"; + //日文 + public static final String J = "J"; + //物料号长度代号P + public static final String P = "P"; + //变更号长度代号L + public static final String L = "L"; + //数量代号 + public static final String N = "N"; + //供应商码 + public static final String SUPPLIERRULE = "SUPPLIERRULE"; + //流水号 + public static final String SERIALNO = "SERIALNO"; + public static final String SERIALNO2 = "SERIALNO2"; + public static final String SEQNO = "SEQNO"; + public static final String SEQNO2 = "SEQNO2"; + //不携带流水号 + public static final String SN_WITHOUT_SEQNO = "SN_WITHOUT_SEQNO"; + //固定拼接字符 + public static final String SPILTRULE = "SPILTRULE"; + //动态拼接字符 + public static final String DYNAMICRULE = "DYNAMICRULE"; + //PART + public static final String PART_EXT = "PART_EXT"; + public static final String LEFT_BRACE = "{"; + public static final String RIGHT_BRACE = "}"; + }