package cn.iocoder.yudao.module.mes.framework.qrcode; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import java.util.LinkedHashMap; import java.util.Map; /** * MES 二维码标签构建器:统一"二维码编码纯码值 + 图片叠加可读文本"的文本组装规则, * 保证批次、托盘、袋码三种标签的关键信息保留一致 */ public final class MesProQrLabelBuilder { private MesProQrLabelBuilder() { } /** * 批次二维码标签 */ public static QrLabelInfo buildBatchLabel(MesProBatchDO batch, Map itemMap, Map userMap) { LinkedHashMap keyValues = new LinkedHashMap<>(); keyValues.put("批次号", batch.getCode()); MesMdmItemDO item = itemMap.get(batch.getItemId()); if (item != null) { keyValues.put("品种", item.getName()); keyValues.put("规格", item.getSpecification()); } keyValues.put("产线", StrUtil.join(" / ", batch.getLineName(), batch.getLineCode())); keyValues.put("生产日期", batch.getProduceDate() == null ? "" : LocalDateTimeUtil.format(batch.getProduceDate(), "yyyy-MM-dd HH:mm")); if (batch.getPlanQuantity() != null) { keyValues.put("计划数量", String.valueOf(batch.getPlanQuantity())); } AdminUserRespDTO user = userMap.get(batch.getOwnerUserId()); if (user != null) { keyValues.put("责任人", user.getNickname()); } return QrLabelInfo.builder().fileName(batch.getCode()).code(batch.getCode()).keyValues(keyValues).build(); } /** * 托盘二维码标签 */ public static QrLabelInfo buildPalletLabel(MesProPalletDO pallet, MesProBatchDO batch, Map itemMap, Map userMap) { LinkedHashMap keyValues = new LinkedHashMap<>(); keyValues.put("托盘码", pallet.getCode()); keyValues.put("托盘序号", pallet.getPalletNo() == null ? "" : String.valueOf(pallet.getPalletNo())); keyValues.put("批次号", pallet.getBatchCode()); if (pallet.getBagCount() != null) { keyValues.put("已装袋数", String.valueOf(pallet.getBagCount())); } if (batch != null) { fillBatchKeyValues(keyValues, batch, itemMap, userMap); } return QrLabelInfo.builder().fileName(pallet.getCode()).code(pallet.getCode()).keyValues(keyValues).build(); } /** * 袋码二维码标签 */ public static QrLabelInfo buildBagCodeLabel(MesProBagCodeDO bagCode, MesProBatchDO batch, Map itemMap, Map userMap) { LinkedHashMap keyValues = new LinkedHashMap<>(); keyValues.put("袋码", bagCode.getCode()); keyValues.put("袋序号", bagCode.getBagNo() == null ? "" : String.valueOf(bagCode.getBagNo())); keyValues.put("批次号", bagCode.getBatchCode()); if (StrUtil.isNotEmpty(bagCode.getPalletCode())) { keyValues.put("绑定托盘", bagCode.getPalletCode()); } if (batch != null) { fillBatchKeyValues(keyValues, batch, itemMap, userMap); } return QrLabelInfo.builder().fileName(bagCode.getCode()).code(bagCode.getCode()).keyValues(keyValues).build(); } /** * 填充批次公共可读文本(品种、规格、产线、生产日期、责任人) */ private static void fillBatchKeyValues(LinkedHashMap keyValues, MesProBatchDO batch, Map itemMap, Map userMap) { MesMdmItemDO item = itemMap.get(batch.getItemId()); if (item != null) { keyValues.put("品种", item.getName()); keyValues.put("规格", item.getSpecification()); } keyValues.put("产线", StrUtil.join(" / ", batch.getLineName(), batch.getLineCode())); keyValues.put("生产日期", batch.getProduceDate() == null ? "" : LocalDateTimeUtil.format(batch.getProduceDate(), "yyyy-MM-dd HH:mm")); AdminUserRespDTO user = userMap.get(batch.getOwnerUserId()); if (user != null) { keyValues.put("责任人", user.getNickname()); } } }