排序产线客户条码打印

tags/yfai-pcn-ext-v2.3
yxw 8 months ago
parent b8cf5c7cfe
commit a536b82cfd

@ -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<String, Object> modelMap = (Map<String, Object>) 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<Map<String, Object>> printDataMapList = new ArrayList<>();
// 单个标签参数值
Map<String, Object> 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<Map<String, Object>> packResultMapList(MesProduceSnPrintModel printModel, List<Map<String, Object>> printTemplateDateList) {
List<Map<String, Object>> resultMapList = new ArrayList<>();
Map<String, Object> 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;
}
}

@ -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<String,Object>
// * valueList:List<Map<String,Object>>
// * paramInfo:{
// * templateContent:xxxx,
// * labelTemplateParamList: List<Map<String,Object>>
// * }
// *
// * 根据foreign找出加工规则对应的上下文判断是否需要打印
// *
// */
String organizeCode = reqBean.getOrganizeCode();
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//返回打印标识 给前端
//1. 获取上下文中生成的主条码
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
// 排除掉空腔的partContext数据
productionPartContextList = CollectionUtils.isEmpty(productionPartContextList) ? null :productionPartContextList.stream().filter(o -> o.getForeignKey() != null).collect(Collectors.toList());
/**
*
*/
List<MesProduceSnPrintModel> printModelList = new ArrayList<>();
//2. 获取条码需要模板、模板代码、打印机 --- 循环遍历条码 封装数据
if (CollectionUtils.isEmpty(productionPartContextList)) return stepResult;
// 根据工单号分组
Map<String, MesWorkOrder> workOrderMap = getMesWorkOrderMap(reqBean, productionPartContextList);
// 获取零件信息上下文
Map<String, MesPart> partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean);
List<MesWorkOrder> 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<MesPrintedSnLog> 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<String, MesWorkOrder> getMesWorkOrderMap(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
// 从产成物料上下文中获取 工单号集合
List<String> 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<MesWorkOrder> workOrderList = workOrderRepository.findByHqlWhere(packBean);
// 根据工单号分组
Map<String, MesWorkOrder> 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<Map<String, MesProdRouteOptParam>> 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<MesLabelTemplate> 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<MesLabelTemplateParam> params = labelTemplateParamRao.findByHqlWhere(templateParamPackBean);
mesLabelTemplate.setLabelTemplateParamList(params);
}
return mesLabelTemplate;
}
}

@ -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<EncodeHintType, Object> 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<EncodeHintType, Object> 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<EncodeHintType, Object> 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<EncodeHintType, Object> 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;
}
}

@ -514,6 +514,16 @@ public class MesPcnExtConstWords {
public static final String PRINTER = "printer"; public static final String PRINTER = "printer";
//客户零件号 //客户零件号
public static final String CUST_PART_NO = "custPartNo"; 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"; 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 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";
} }

Loading…
Cancel
Save