diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CustSnPrintStrategy.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CustSnPrintStrategy.java new file mode 100644 index 0000000..42fc015 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CustSnPrintStrategy.java @@ -0,0 +1,169 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy; + +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.BarCodeUtils; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import com.google.zxing.WriterException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.*; + +/** + * @Description : 客户标签打印 + * @Reference : + * @Author : xinwang.yi + * @CreateDate : 2024/9/29 16:43 + * @Modify: + **/ +@Component +@Slf4j +public class CustSnPrintStrategy implements IPrintTemplateStrategyService { + + @Override + public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel model, + MesNumberRule numberRule , StepResult stepResult, StationRequestBean reqBean, + Boolean isStep) { + + Map modelMap = (Map) model.getSourceData(); + + // 工单信息 + MesWorkOrder workOrder = (MesWorkOrder) modelMap.get("mesWorkOrder"); + + if (workOrder == null) { + log.info("CustSnPrintStrategy --- execute --- 工单信息为空"); + return null; + } + + // 客户零件号 + String custPartNo = workOrder.getCustPartNo(); + // 客户零件号 前缀 排除后四位 + String custPartNoPrefix = StringUtils.isEmpty(custPartNo) ? "" : custPartNo.substring(0, custPartNo.length() - 4); + // 客户零件号 后四位 + String custPartNoAfterFour = StringUtils.isEmpty(custPartNo) ? "" : custPartNo.substring(custPartNo.length() - 4).toUpperCase(); + + // 返回的结果集合 + List> printDataMapList = new ArrayList<>(); + // 单个标签参数值 + Map resultMap = new HashMap<>(); + // 客户条码 + resultMap.put(MesPcnExtConstWords.CUST_SN, workOrder.getCustSn()); + // 客户零件号 前缀 排除后四位 + resultMap.put(MesPcnExtConstWords.CUST_PART_NO_PERFIX, custPartNoPrefix); + // 客户零件号 后四位 + resultMap.put(MesPcnExtConstWords.CUST_PART_NO_AFTER_FOUR, custPartNoAfterFour); + + String snOriginal = workOrder.getCustSn(); + + String[] split = snOriginal.split(""); + StringBuilder rsStr = new StringBuilder(); + for (int i = 0; i < split.length-1; i++) { + rsStr.append(split[i]).append("%RS%"); + } + rsStr.append(split[split.length - 1]); + StringBuilder gsStr = new StringBuilder(); + String[] split1 = rsStr.toString().split(""); + for (int i = 0; i < split1.length-1; i++) { + gsStr.append(split1[i]).append("%GS%"); + } + gsStr.append(split1[split1.length-1]); + String[] split2 = gsStr.toString().split(""); + + String sn = split2[0]+"%EOT%"; + + if (numberRule == null) { + log.error("CustSnPrintStrategy --- exec --- numberRule 为空"); + return model; + } + + if (StringUtils.isEmpty(numberRule.getRuleLengthSpiltExt())) { + log.error("CustSnPrintStrategy --- exec --- 规则属性长度拼接 为空"); + return model; + } + + // 规则属性长度拼接 + String[] ruleLengthSpiltExt = numberRule.getRuleLengthSpiltExt().split(MesPcnExtConstWords.COMMA); + + /* + * 1 2 3 4 5 6 7 8 9 10 11 12 + * 编码规则:{spiltRule}{spiltRule}{spiltRule}{partNo}{spiltRule}{spiltRule}{spiltRule}{year}{day}{spiltRule}{serialNo}{spiltRule} + * 规则属性长度拼接:14,14,5,8,7,9,7,2,3,5,4,9 + * 拼接固定字符:[)>%RS%06%GS%Y,4110000000000X,%GS%P,%GS%12V,545238347,%GS%T1A,A2B4C,%RS%%EOT% + * 条码:[)>06Y4110000000000XP26560848Z12V545238347T1A24269A2B4C0005 + * 转换后条码:[)>%RS%06%GS%Y4110000000000X%GS%P26560850%GS%12V545238347%GS%T1A24269A2B4C0019%RS + * 客户条码 VPPS 取 第 2 + * 客户条码 DUNS 取 第 5 + * 客户条码后半部分取 7 的后两位 A1到 11 + * */ + + int vppsLengthStart = 0; + int vppsLengthEnd = 0; + int dunsLengthStart = 0; + int dunsLengthEnd = 0; + int afterContentPerfixLengthStart = 0; + int afterContentPerfixLengthEnd = 0; + int afterContentLengthStart = 0; + int afterContentLengthEnd = 0; + for (int index = 0; index < ruleLengthSpiltExt.length; index++) { + if (index < 1) vppsLengthStart += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 2) vppsLengthEnd += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 5) dunsLengthStart += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 6) dunsLengthEnd += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 6) afterContentPerfixLengthStart += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 7) afterContentPerfixLengthEnd += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 8) afterContentLengthStart += Integer.parseInt(ruleLengthSpiltExt[index]); + if (index < 11) afterContentLengthEnd += Integer.parseInt(ruleLengthSpiltExt[index]); + } + + String custSnVPPS = sn.substring(vppsLengthStart, vppsLengthEnd); + String custSnDUNS = sn.substring(dunsLengthStart, dunsLengthEnd); + String custSnAfterPerfixContent = sn.substring(afterContentPerfixLengthStart, afterContentPerfixLengthEnd); + custSnAfterPerfixContent = custSnAfterPerfixContent.substring(custSnAfterPerfixContent.length() - 2, custSnAfterPerfixContent.length()); + String custSnAfterContent = custSnAfterPerfixContent + sn.substring(afterContentLengthStart, afterContentLengthEnd); + + // 客户条码 VPPS + resultMap.put(MesPcnExtConstWords.CUST_SN_VPPS, custSnVPPS); + // 客户条码 DUNS + resultMap.put(MesPcnExtConstWords.CUST_SN_DUNS, custSnDUNS); + // 客户条码 CUST_AFTER_CONTENT + resultMap.put(MesPcnExtConstWords.CUST_SN_AFTER_CONTENT, custSnAfterContent); + // 客户条码 dataMatrix + ByteArrayOutputStream dataMatrixCode = null; + try { + dataMatrixCode = BarCodeUtils.createDataMatrixCode(workOrder.getCustSn()); + } catch (WriterException e) { + log.error("CustSnPrintStrategy --- execute --- 报错:{}", e.getMessage()); + return model; + } catch (IOException e) { + log.error("CustSnPrintStrategy --- execute --- 报错:{}", e.getMessage()); + return model; + } + resultMap.put(MesPcnExtConstWords.CUST_SN_DATA_MATRIX, dataMatrixCode); + + printDataMapList.add(resultMap); + + model.setPrintContextList(packResultMapList(model, printDataMapList)); + + return model; + } + + private List> packResultMapList(MesProduceSnPrintModel printModel, List> printTemplateDateList) { + List> resultMapList = new ArrayList<>(); + Map resultMap = new HashMap<>(); + resultMap.put(MesPcnExtConstWords.LABEL_TEMPLATE, printModel.getMesLabelTemplate()); + resultMap.put(MesPcnExtConstWords.TEMPLATE_DATA, printTemplateDateList); + resultMap.put(MesPcnExtConstWords.TEMPLATE_CODE, printModel.getMesLabelTemplate().getTemplateCode()); + resultMap.put(MesPcnExtConstWords.PRINTER, printModel.getPrinter()); + resultMapList.add(resultMap); + return resultMapList; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnPrintSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnPrintSortStepService.java new file mode 100644 index 0000000..f1d8f7e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnPrintSortStepService.java @@ -0,0 +1,238 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.*; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +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.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @Description : 打印客户条码 + * @Reference : + * @Author : Castle + * @CreateDate : 2024/6/6 13:39 + * @Modify: + **/ +@Slf4j +@Service +public class MesProductSnPrintSortStepService extends BaseStepService { + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private MesLabelTemplateRepository labelTemplateRao; + + @Autowired + private MesLabelTemplateParamRepository labelTemplateParamRao; + + @Autowired + private IMesPrintedSnLogRepository snLogRao; + + @Autowired + private MesWorkOrderRepository workOrderRepository; + + @Autowired + private MesNumberRuleRepository numberRuleRepository; + + @Override + public StepResult execute(StationRequestBean reqBean) { +// /** +// * Map +// * valueList:List> +// * paramInfo:{ +// * templateContent:xxxx, +// * labelTemplateParamList: List> +// * } +// * +// * 根据foreign找出加工规则对应的上下文,判断是否需要打印 +// * +// */ + String organizeCode = reqBean.getOrganizeCode(); + StationResultBean resultBean = new StationResultBean(); + StepResult stepResult = StepResult.getSuccessComplete(); + + //返回打印标识 给前端 + //1. 获取上下文中生成的主条码 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + // 排除掉空腔的partContext数据 + productionPartContextList = CollectionUtils.isEmpty(productionPartContextList) ? null :productionPartContextList.stream().filter(o -> o.getForeignKey() != null).collect(Collectors.toList()); + + /** + * 重构,返回给前端打印数据 + */ + List printModelList = new ArrayList<>(); + //2. 获取条码需要模板、模板代码、打印机 --- 循环遍历条码 封装数据 + + if (CollectionUtils.isEmpty(productionPartContextList)) return stepResult; + + // 根据工单号分组 + Map workOrderMap = getMesWorkOrderMap(reqBean, productionPartContextList); + + // 获取零件信息上下文 + Map partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean); + + List needModifyWorkOrderList = new ArrayList<>(); + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack("WH_CUST_SN_RULE", MesPcnExtConstWords.RULE_CODE, packBean); + MesNumberRule numberRule = numberRuleRepository.getByProperty(packBean); + + if (numberRule == null) { + log.error("MesCustSnPrintStepService --- exec --- 客户条码编码规则[WH_CUST_SN_RULE]无效"); + return stepResult; + } + + for (MesProductionPartContext sn : productionPartContextList) { + + // 根据工单号获取工单信息 + MesWorkOrder workOrder = workOrderMap.get(sn.getWorkOrderNo()); + + if (workOrder == null) { + log.error("MesCustSnPrintStepService --- exec --- 工单号:{}无效", sn.getWorkOrderNo()); + continue; + } + + if ((partDataContext == null) || (!partDataContext.containsKey(workOrder.getPartNo()))) { + log.error("MesCustSnPrintStepService --- exec --- 工单号:{}零件{}丢失缓存", sn.getWorkOrderNo(), sn.getPartNo()); + continue; + } + + // 从物料信息中获取标签模板 + String labelTemplateCode = partDataContext.get(sn.getPartNo()).getProductLabelTemplate(); + + // 从物料信息中获取打印机 + String productPrinterCode = partDataContext.get(sn.getPartNo()).getProductPrinterCode(); + + if (labelTemplateCode == null) { + stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]零件号[%s]未在ERP物料信息维护打印模板,请检查并修改!", sn.getWorkOrderNo(), sn.getPartNo())); + } + + if (StringUtils.isEmpty(productPrinterCode)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]零件号[%s]未在ERP物料信息维护打印机,请检查并修改!", sn.getWorkOrderNo(), sn.getPartNo())); + } + + MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel(); + // 查模板代码 + MesLabelTemplate labelTemplate = getLabelTemplate(labelTemplateCode, organizeCode); + + if (labelTemplate == null) { + stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]零件号[%s]的模板代码[%s]无效,请检查并修改!", sn.getWorkOrderNo(), sn.getPartNo(), labelTemplateCode)); + } + + mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate); + mesProduceSnPrintModel.setPrinter(productPrinterCode); + mesProduceSnPrintModel.setPartNo(sn.getPartNo()); + mesProduceSnPrintModel.setOrganizeCode(organizeCode); + mesProduceSnPrintModel.setSourceData(workOrder); + + //根据反射获取策略类--封装打印数据 + String methodCode = labelTemplate.getMethodCode(); + //模板信息丢失抛出异常 + if (StringUtils.isEmpty(methodCode)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]零件号[%s]的模板代码[%s]的反射类丢失,请配置!", sn.getWorkOrderNo(), sn.getPartNo(), labelTemplateCode)); + } + IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(methodCode); + // GenSerialNoModel model , MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, Boolean isStep + MesProduceSnPrintModel printModel = strategyService.execute(null, mesProduceSnPrintModel, null, stepResult, reqBean, true); + printModelList.add(printModel); + needModifyWorkOrderList.add(workOrder); + + } + + //前端接收到busiTyep是customComponent,并且 dataType是file类型的消息,就需要打印后续消息里的数据,一个模板对应多个打印数据 + resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue()); + resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue()); + resultBean.setResultObj(printModelList); + //3. 发送数据给到前端 + this.sendMessage(reqBean, resultBean); + List snLogList = printModelList.stream().map(MesProduceSnPrintModel::getMesPrintedSnLogList).flatMap(List::stream).collect(Collectors.toList()); + //更新打印状态 + for (MesWorkOrder workOrder : needModifyWorkOrderList) { + MesPrintedSnLog snLog = new MesPrintedSnLog(); + snLog.setBarcode(workOrder.getCustSn()); + snLog.setCustPartNo(workOrder.getCustPartNo()); + snLog.setWorkOrderNo(workOrder.getWorkOrderNo()); + snLog.setPartNo(workOrder.getPartNo()); + snLog.setPartName(workOrder.getPartName()); + ConvertBean.serviceModelInitialize(snLog, reqBean.getUserInfo()); + snLog.setOrganizeCode(reqBean.getOrganizeCode()); + snLogList.add(snLog); + } + //保存打印条码记录 + snLogRao.saveAll(snLogList); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "打印成功!"); + } + + private Map getMesWorkOrderMap(StationRequestBean reqBean, List productionPartContextList) { + // 从产成物料上下文中获取 工单号集合 + List workOrderNoList = productionPartContextList.stream().map(MesProductionPartContext::getWorkOrderNo).distinct().collect(Collectors.toList()); + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + List workOrderList = workOrderRepository.findByHqlWhere(packBean); + + // 根据工单号分组 + Map workOrderMap = workOrderList.stream().collect(Collectors.toMap(MesWorkOrder::getWorkOrderNo, Function.identity(), (x, y) -> y)); + return workOrderMap; + } + + //验证加工结果是否满足参数条件: 可疑/报废是否打印 + private Boolean checkIsMatchProdResult(StationRequestBean reqBean, String prodResult, MesExtEnumUtil.PRODUCT_RESULT_EQUIP_PARAM prodResultEnum) { + + if (StringUtils.isEmpty(prodResult)) return false; + if (!prodResult.equals(prodResultEnum.getCode())) return false; + + Optional> stepParamMap = getStepParams(reqBean); + String unPrintParam = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(prodResultEnum.name())) ? stepParamMap.get().get(prodResultEnum.name()).getParamValue() : null; + if (StringUtils.isEmpty(unPrintParam)) return false; + + return true; + + } + + /** + * 根据templateCode 获取模板信息 + * + * @param templateCode + * @param organizeCode + * @return + */ + private MesLabelTemplate getLabelTemplate(String templateCode, String organizeCode) { + DdlPackBean templatePackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(templateCode, "templateCode", templatePackBean); + List mesLabelTemplateList = labelTemplateRao.findByHqlWhere(templatePackBean); + MesLabelTemplate mesLabelTemplate = null; + if (!mesLabelTemplateList.isEmpty()) { + mesLabelTemplate = mesLabelTemplateList.get(0); + //级联获取labelTemplateParam + DdlPackBean templateParamPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(mesLabelTemplate.getId(), "templateId", templateParamPackBean); + List params = labelTemplateParamRao.findByHqlWhere(templateParamPackBean); + mesLabelTemplate.setLabelTemplateParamList(params); + } + return mesLabelTemplate; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/util/BarCodeUtils.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/util/BarCodeUtils.java new file mode 100644 index 0000000..1d01caf --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/util/BarCodeUtils.java @@ -0,0 +1,113 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.util; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.datamatrix.encoder.SymbolShapeHint; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description : 描述 + * @Reference : 关联 + * @Author : duan.yang + * @CreateDate : 2021-09-03 15:54 + * @Modify: 修改 + **/ +public class BarCodeUtils { + public static ByteArrayOutputStream createBarCode(String code) throws WriterException, IOException { + // 二维码基本参数设置 + Map hints = new HashMap<>(); + // 设置编码字符集utf-8 + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别,当前设置等级为最高等级H,最低L + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + // 可设置距离边界的范围0-10 + hints.put(EncodeHintType.MARGIN, 1); + // 生成图片类型为条码 + BarcodeFormat format = BarcodeFormat.CODE_39; + // 创建位矩阵对象 + BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.CODE_93_WIDTH, MesPcnExtConstWords.CODE_93_HEIGHT, hints); + // 设置位矩阵转图片的参数 + // MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB()); + // 位矩阵对象转流对象 + ByteArrayOutputStream os = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, "png", os); + return os; + } + + public static ByteArrayOutputStream createPalletBarCode(String code) throws WriterException, IOException { + // 二维码基本参数设置 + Map hints = new HashMap<>(); + // 设置编码字符集utf-8 + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别,当前设置等级为最高等级H,最低L + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + // 可设置距离边界的范围0-10 + hints.put(EncodeHintType.MARGIN, 1); + // 生成图片类型为条码 + BarcodeFormat format = BarcodeFormat.CODE_93; + // 创建位矩阵对象 + BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.PALLET_CODE_93_WIDTH, MesPcnExtConstWords.PALLET_CODE_93_HEIGHT, hints); + // 设置位矩阵转图片的参数 + // MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB()); + // 位矩阵对象转流对象 + ByteArrayOutputStream os = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, "png", os); + return os; + } + + public static ByteArrayOutputStream createPalletBarCodeToQr(String code) throws WriterException, IOException { + // 二维码基本参数设置 + Map hints = new HashMap<>(); + // 设置编码字符集utf-8 + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别,当前设置等级为最高等级H,最低L + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + // 可设置距离边界的范围0-10 + hints.put(EncodeHintType.MARGIN, 1); + // 生成图片类型为二维码 + BarcodeFormat format = BarcodeFormat.QR_CODE; + // 创建位矩阵对象 + BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.PALLET_QR_CODE_LENTH, MesPcnExtConstWords.PALLET_QR_CODE_LENTH, hints); + // 设置位矩阵转图片的参数 + // MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB()); + // 位矩阵对象转流对象 + ByteArrayOutputStream os = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, "png", os); + return os; + } + + public static ByteArrayOutputStream createDataMatrixCode(String code) throws WriterException, IOException { + // 二维码基本参数设置 + Map hints = new HashMap<>(); + // 设置编码字符集utf-8 + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别,当前设置等级为最高等级H,最低L + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + //DATA_MATRIX_SHAPE设置二维码的形状,如果不设置会默认为null,FORCE_SQUARE为正方形 + hints.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE); + // 可设置距离边界的范围0-10 + hints.put(EncodeHintType.MARGIN, 1); + // 生成图片类型为数字矩阵 + BarcodeFormat format = BarcodeFormat.DATA_MATRIX; + // 创建位矩阵对象 + BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.DATA_MATRIX_CODE_WIDTH, MesPcnExtConstWords.DATA_MATRIX_CODE_HEIGHT, hints); + // 设置位矩阵转图片的参数 +// MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB()); + //输出图片文件 +// MatrixToImageWriter.writeToPath(bitMatrix, "png", Paths.get("D://sn.png")); + // 位矩阵对象转流对象 + ByteArrayOutputStream os = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, "png", os); + return os; + } +} 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 41cb7e8..0115a0e 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 @@ -514,6 +514,16 @@ public class MesPcnExtConstWords { public static final String PRINTER = "printer"; //客户零件号 public static final String CUST_PART_NO = "custPartNo"; + //客户零件号 前缀 排除后四位 + public static final String CUST_PART_NO_PERFIX = "custPartNoPerfix"; + //客户零件号 后四位 + public static final String CUST_PART_NO_AFTER_FOUR = "custPartNoAfterFour"; + //客户条码VPPS + public static final String CUST_SN_VPPS = "custSnVPPS"; + //客户条码DUNS + public static final String CUST_SN_DUNS = "custSnDUNS"; + //客户条码 后部分内容 + public static final String CUST_SN_AFTER_CONTENT = "custSnAfterContent"; //生产日期 public static final String LOT_NO = "lotNo"; @@ -588,4 +598,21 @@ public class MesPcnExtConstWords { // 产线名称 public static final String WORK_CENTER_NAME = "workCenterName"; + + // + public static final int PALLET_CODE_93_WIDTH = 93; + // + public static final int PALLET_CODE_93_HEIGHT = 93; + + public static final int PALLET_QR_CODE_LENTH = 90; + + public static final int CODE_93_WIDTH = 93; + + public static final int CODE_93_HEIGHT = 93; + + public static final int DATA_MATRIX_CODE_WIDTH = 60; + + public static final int DATA_MATRIX_CODE_HEIGHT = 80; + // dataMatrix 形式的客户条码 + public static final String CUST_SN_DATA_MATRIX = "custSnDataMatrix"; }