diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java index 34562ed..1dae6a3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java @@ -24,13 +24,11 @@ import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ResultBean; -import cn.estsh.impp.framework.boot.util.ValidatorBean; 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.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -113,45 +111,122 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService { @Override public MesProduceSnPrintModel doPrint(MesProduceSnPrintModel mesProduceSnPrintModel) { + String organizeCode = mesProduceSnPrintModel.getOrganizeCode(); // 获取工厂名称 - MesConfig mesConfig = configService.getMesConfigByCfgCode(MesPcnExtConstWords.ORGANIZE_NAME,mesProduceSnPrintModel.getOrganizeCode()); - if (null == mesConfig || StringUtils.isEmpty(mesConfig.getCfgValue())){ + MesConfig mesConfig = configService.getMesConfigByCfgCode(MesPcnExtConstWords.ORGANIZE_NAME, organizeCode); + if (null == mesConfig || StringUtils.isEmpty(mesConfig.getCfgValue())) { throw ImppExceptionBuilder.newInstance().setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode()).setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()).setErrorDetail("没有维护当前工厂的系统参数!").build(); } //获取工厂名称 String organizeName = mesConfig.getCfgValue(); //物料信息 - MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), mesProduceSnPrintModel.getOrganizeCode()); + MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), organizeCode); + //打印模板 + String printTemplate = mesProduceSnPrintModel.getPrintTemplate(); + //打印规则 + String snRule = mesProduceSnPrintModel.getSnRule(); + //获取条码规则,根据条码规则中的序列号长度截取序列号 + DdlPackBean mesRulePackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(snRule, "ruleCode", mesRulePackBean); + List ruleList = mesNumberRuleRDao.findByHqlWhere(mesRulePackBean); + if (ruleList.isEmpty()) { + MesPcnException.throwMesBusiException("零件号【】打印规则查询不到!", mesPart.getPartNo()); + } + MesNumberRule numberRule = ruleList.get(0); + //打印日期格式 String format = "yyyy/MM/dd"; - if (MesPcnEnumUtil.PRINT_TEMPLATE.NO_SORT_BAR_CODE_GZ.getCode().equals(mesProduceSnPrintModel.getPrintTemplate()) || MesPcnEnumUtil.PRINT_TEMPLATE.NO_SORT_BAR_CODE_GZ_NEW.getCode().equals(mesProduceSnPrintModel.getPrintTemplate())) { + if (MesExtEnumUtil.MES_PRINT_TEMPLATE.NO_SORT_BAR_CODE_GZ.getCode().equals(printTemplate) || MesExtEnumUtil.MES_PRINT_TEMPLATE.XIAO_PENG.getCode().equals(printTemplate) || MesExtEnumUtil.MES_PRINT_TEMPLATE.XIAO_PENG_NEW.getCode().equals(printTemplate)) { format = DateUtil.BASE_FORMAT; } - //条码生成 - if (StringUtils.isEmpty(mesProduceSnPrintModel.getProductSn())) { - ValidatorBean.checkNotNull(mesProduceSnPrintModel.getSnRule(), "条码规则不能为空"); - ValidatorBean.checkNotNull(mesProduceSnPrintModel.getPrintTemplate(), "打印模板不能为空"); - //获取条码规则,根据条码规则中的序列号长度截取序列号 - DdlPackBean mesRulePackBean = DdlPackBean.getDdlPackBean(mesProduceSnPrintModel.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(mesProduceSnPrintModel.getSnRule(),"ruleCode", mesRulePackBean); - List ruleList = mesNumberRuleRDao.findByHqlWhere(mesRulePackBean); - if (ruleList.isEmpty()){ - MesPcnException.throwMesBusiException("打印模板规则查询不到!"); + int printQty = mesProduceSnPrintModel.getPrintQty(); + Date date = new Date(); + + //if 1B2M || GQAA_BARCODE + if (MesExtEnumUtil.MES_PRINT_TEMPLATE.B2M.getCode().equals(printTemplate) || MesExtEnumUtil.MES_PRINT_TEMPLATE.GQAA.getCode().equals(printTemplate)) { + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(); + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + //${SPILTRULE}${partNo}${SPILTRULE}${SPILTRULE}${year}${month}${day}${serialNo}${SPILTRULE} + //规格号,零件号,供应商,生产线代码,年,月,日,序列号,软件版本号 + // ----广汽 1B2M & 广新 GQAA_BARCODE 21位 + //规格号 ${SPILTRULE} + + //零件简号 {partNo} - mesPart.getPartSnParam() + genSerialNoModel.setPartNo(mesPart.getPartSnParam()); + //供应商号 supplierNo ---固定VD501 ${SPILTRULE}拼接 + //生产线代码 workCenterCode 或者 fixWorkCenterCode (取配置值) ${SPILTRULE} + //日期${dateShort} + genSerialNoModel.setYear(getYearShort(date)); + genSerialNoModel.setMonth(getMonthShort(date)); + genSerialNoModel.setDay(getDayShort(date)); + //获取客户零件号 + String custPartNo = getMesCustomerPart(mesProduceSnPrintModel).getCustPartNo(); + //供应商生产流水号 ${serialNo} 采用34进制 获取条码是十进制,需要截取转换成34位 + //软件版本号${versionNo} ${SPILTRULE} + for (int i = 0; i < printQty; i++) { + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + int versionNoLength = numberRule.getSpiltRule().substring(numberRule.getSpiltRule().lastIndexOf(",") + 1).length(); + Integer serialNoLength = numberRule.getSerialnoLength(); + String snPrefix = sn.substring(0, sn.length() - versionNoLength - serialNoLength); + String snSuffix = sn.substring(sn.length() - versionNoLength); + String serialNo = sn.substring(sn.length() - versionNoLength - serialNoLength, sn.length() - versionNoLength); + String serialNo34 = toBase34(Integer.parseInt(serialNo)); + serialNo34 = stringFormat(serialNo34, 4, false, "0"); + sn = snPrefix + serialNo34 + snSuffix; + //保存条码信息 + MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty(), format); + //封装打印信息 + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(produceSn, serialNo, custPartNo, organizeName)); + mesProduceSnRDao.insert(produceSn); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + snLog.setSn(sn); + mesPrintedSnRao.insert(snLog); } - MesNumberRule mesNumberRule = ruleList.get(0); - int serialNoLength = mesNumberRule.getSerialnoLength(); + + } else if (MesExtEnumUtil.MES_PRINT_TEMPLATE.GQXNY.getCode().equals(printTemplate)) { + + // else if GQXNY + //----广乘 45位 GQXNY + //{custPartNo}{SPILTURE}{custCode}{spiltrure}{spiltrule}{year}{serialNo}{spilture}{spiltrule} + //客户零件号-扩展位-客户代码-预留位000-产线1-年月日-条码-扩展0000-追溯位+ + //零件长号---17位,不足17位 右边补* GenSerialNoModel genSerialNoModel = new GenSerialNoModel(); - genSerialNoModel.setRuleCode(mesPart.getProductMatchRule()); - genSerialNoModel.setPartNo(mesPart.getPartNo()); - int printQty = mesProduceSnPrintModel.getPrintQty(); - String sn; + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + //获取客户零件号 + String custPartNo = getMesCustomerPart(mesProduceSnPrintModel).getCustPartNo(); + String custPartNoFormat = stringFormat(custPartNo, 17); + genSerialNoModel.setCustPartNo(custPartNoFormat); + //拓展位 2位 00 包含0~9,A~Z 不使用时,补“0”填充 {SPILTRULE} + //供应商代码 7位 供应商代码 0~9,A~Z;不足7位 右测补* + MesConfig supplierConfig = configService.getMesConfigByCfgCodeKeyOrg(MesPcnExtConstWords.SUPPLIER_CODE, MesExtEnumUtil.MES_PRINT_TEMPLATE.GQXNY.getValue(), organizeCode); + String supplierCode = supplierConfig.getCfgValue(); + String supplierCodeFormat = stringFormat(supplierCode, 7); + genSerialNoModel.setCustCode(supplierCodeFormat); + //扩展位 3位 预留扩展位0~9 A~Z 不使用时,补 0 {SPILTRULE} + //产线 1位 供应商产线号,表示由数字1~9 和字母A~Z(I/O除外)组成; {SPILTRULE} + //年月日 6位 yyMMdd 零部件生产日期,年月日各2位 + String year = TimeTool.pareDateToString("yyMMdd", date); + genSerialNoModel.setYear(year); + //流水号 4位 采用34进制 0001~ZZZZ (I、O除外)顺位进行标注 (同广汽 & 广新) {serialNo} + //扩展位 4位 预留扩展位信息,包含0~9和字母A~Z,不使用时,补“0” 填充; {SPILTRULE} + //追溯标识 1位 + 代表精确按件追溯,$标识按批追溯, % 代表按生产方式追溯 {SPILTRULE} for (int i = 0; i < printQty; i++) { - ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getOrganizeCode(), 1); - sn = resultBean.getResultList().get(0).toString(); + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + String snPrefix = sn.substring(0, sn.length() - 12); + String snSuffix = sn.substring(sn.length() - 5); + String serialNo = sn.substring(sn.length() - 12, sn.length() - 5); + String serialNo34 = toBase34(Integer.parseInt(serialNo)); + serialNo34 = stringFormat(serialNo34, 4, false, "0"); + sn = snPrefix + serialNo34 + snSuffix; //保存条码信息 MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty(), format); //封装打印信息 - mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(produceSn, sn.substring(sn.length()-serialNoLength), mesProduceSnPrintModel.getCustPartNo(), organizeName)); + MesProduceSnPrintDataModel model = getModel(produceSn, serialNo, custPartNo, organizeName); + model.setSupplierCode(supplierCode); + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(model); mesProduceSnRDao.insert(produceSn); //保存打印记录 MesPrintedSnLog snLog = new MesPrintedSnLog(); @@ -160,25 +235,94 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService { mesPrintedSnRao.insert(snLog); } - //条码补打 - } else { - ValidatorBean.checkNotNull(mesPart.getProductLabelTemplate(), "打印模板不能为空"); - mesProduceSnPrintModel.setPrintTemplate(mesPart.getProductLabelTemplate()); - MesProduceSn mesProduceSn = findMesProduceSn(mesProduceSnPrintModel); - String no = ""; - String custPartNo = ""; - if (MesPcnEnumUtil.PRINT_TEMPLATE.GQXNY.getCode().equals(mesProduceSnPrintModel.getPrintTemplate()) - && !Objects.isNull(mesProduceSn.getProductSn()) - && mesProduceSn.getProductSn().length() >= 40) { - //获取客户零件号 - custPartNo = getMesCustomerPart(mesProduceSnPrintModel).getCustPartNo(); - no = mesProduceSn.getProductSn().substring(36, 40); + } else if (MesExtEnumUtil.MES_PRINT_TEMPLATE.NO_SORT_BAR_CODE_GZ.getCode().equals(printTemplate)) { + // noSortBarCodeGz + //{partNo}{year}{month}{day}{serialNo} + //内部条码, 批量打印 NoSortBarCodeGZ + //零件号 partNo + String partNo = mesPart.getPartNo(); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(); + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + genSerialNoModel.setPartNo(partNo); + //年月日 yyyyMMdd + //流水号 4位 每天从1开始 + for (int i = 0; i < printQty; i++) { + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //保存条码信息 + MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty(), format); + //封装打印信息 + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(produceSn, serialNo, mesProduceSnPrintModel.getCustPartNo(), organizeName)); + mesProduceSnRDao.insert(produceSn); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + snLog.setSn(sn); + mesPrintedSnRao.insert(snLog); + } + } else if (MesExtEnumUtil.MES_PRINT_TEMPLATE.XIAO_PENG.getCode().equals(printTemplate)) { + format = DateUtil.BASE_FORMAT; + // XIAO_PENG 原客户条码.小鹏汽车 NoSortBarCodeGZ-new + //{custPartNo}{SPILTRULE}{year}{month}{day}{hour}{minute}{second}{serialNo} + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(); + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + //客户零件号 + String custPartNo = getMesCustomerPart(mesProduceSnPrintModel).getCustPartNo(); + genSerialNoModel.setCustPartNo(custPartNo); + //中杠 - + //生产日期 + 时间 yyyyMMddHHmmss + //流水号 5位 每天从1开始 + for (int i = 0; i < printQty; i++) { + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //保存条码信息 + MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty(), format); + //封装打印信息 + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(produceSn, serialNo, mesProduceSnPrintModel.getCustPartNo(), organizeName)); + mesProduceSnRDao.insert(produceSn); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + snLog.setSn(sn); + mesPrintedSnRao.insert(snLog); + } + + } else if (MesExtEnumUtil.MES_PRINT_TEMPLATE.XIAO_PENG_NEW.getCode().equals(printTemplate)) { + format = "yyyy-MM-dd"; + //gz-xiaopeng + //客户条码-小鹏汽车 gz-xiaopeng + //{custPartNo}{year}{month}{day}{serialNo} + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(); + //客户零件号 + String custPartNo = getMesCustomerPart(mesProduceSnPrintModel).getCustPartNo(); + genSerialNoModel.setCustPartNo(custPartNo); + //年月日缩写 + genSerialNoModel.setYear(getYearShort(date)); + genSerialNoModel.setMonth(getMonthShort(date)); + genSerialNoModel.setDay(getDayShort(date)); + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + //流水号 5位 每天从1开始 + for (int i = 0; i < printQty; i++) { + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //保存条码信息 + MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty(), format); + produceSn.setCustPartNo(custPartNo); + //封装打印信息 + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(produceSn, serialNo, custPartNo, organizeName)); + mesProduceSnRDao.insert(produceSn); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + snLog.setSn(sn); + mesPrintedSnRao.insert(snLog); } - mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(getModel(mesProduceSn, no, custPartNo, organizeName)); - MesPrintedSnLog snLog = new MesPrintedSnLog(); - ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); - snLog.setSn(mesProduceSn.getProductSn()); - mesPrintedSnRao.insert(snLog); } //获取打印模板信息 mesProduceSnPrintModel.setMesLabelTemplate(mesTemplateService.getMesLabelTemplate(mesProduceSnPrintModel.getPrintTemplate())); @@ -310,6 +454,26 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService { return dateTime.append(yearStr).append(monthStr).append(TimeTool.getDay(date)).toString(); } + private String getYearShort(Date date) { + String yearStr = MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date))); + if (StringUtils.isEmpty(yearStr)) { + MesPcnException.throwMesBusiException("【%s】年月简号不存在", TimeTool.getYear(date)); + } + return yearStr; + } + + private String getMonthShort(Date date) { + String monthStr = MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date))); + if (StringUtils.isEmpty(monthStr)) { + MesPcnException.throwMesBusiException("【%s】月简号不存在", TimeTool.getMonth(date)); + } + return monthStr; + } + + private String getDayShort(Date date) { + String day = TimeTool.getDay(date); + return day; + } private String stringFormat(String data, Integer length) { return stringFormat(data, length, true, "*"); @@ -321,15 +485,19 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService { return data; } StringBuilder dataBuffer = new StringBuilder(); - //左拼接 + //右拼接 if (left) { dataBuffer.append(data); + for (int i = 0; i < length - data.length(); i++) { + dataBuffer.append(symbol); + } } - for (int i = 0; i < length - data.length(); i++) { - dataBuffer.append(symbol); - } - //右拼接 + + //左拼接 if (!left) { + for (int i = 0; i < length - data.length(); i++) { + dataBuffer.append(symbol); + } dataBuffer.append(data); } return dataBuffer.toString(); diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 00eee90..26a00d1 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -27,6 +27,8 @@ public class MesPcnExtConstWords { public static final String ORGANIZE_CODE = "organizeCode"; //工厂名称常量 public static final String ORGANIZE_NAME = "ORGANIZE_NAME"; + //供应商常量 + public static final String SUPPLIER_CODE = "SUPPLIER_CODE"; // 系统配置代码 public static final String CFG_CODE = "cfgCode"; // 用户ID