Browse Source

当前端传了customerId时,根据客户编码解析标签编号

master
han\hanst 2 months ago
parent
commit
03f3891905
  1. 1
      src/main/java/com/gaotao/modules/base/entity/PrintLabelRequest.java
  2. 21
      src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java
  3. 88
      src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java

1
src/main/java/com/gaotao/modules/base/entity/PrintLabelRequest.java

@ -18,6 +18,7 @@ public class PrintLabelRequest {
private String userId; // 用户ID
private String username; // 用户名
private String site; // 站点
private String customerId; // 客户编码
private String receiptNo; // 采购接收单号
private String unitId; // HandlingUnit ID
private List<String> unitIds;

21
src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java

@ -40,6 +40,7 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
// 数据源字段的正则表达式匹配 #{field_name} 格式
private static final Pattern DATA_SOURCE_PATTERN = Pattern.compile("#\\{([^}]+)\\}");
private static final String CUSTOM_FIELDS_CONTEXT_KEY = "__CUSTOM_FIELDS_CONTEXT__";
private static final String RESOLVED_LABEL_DATA_LIST_KEY = "__RESOLVED_LABEL_DATA_LIST__";
/**
* 从数据映射中取值保持原有精确匹配逻辑未命中时再从前端补充字段中按大小写不敏感匹配
@ -1765,6 +1766,7 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
log.info("总共需要生成 {} 张标签", recordCount);
// 4. 为每条记录生成ZPL代码
List<Map<String, Object>> resolvedLabelDataList = new ArrayList<>();
for (int i = 0; i < recordCount; i++) {
java.util.Map<String, Object> realDataMap = new java.util.HashMap<>();
if (!customFields.isEmpty()) {
@ -1804,10 +1806,16 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
// 4.4 使用当前记录的数据生成ZPL
String zplCode = generateZplWithData(elements, realDataMap, labelSetting, printFlag);
zplCodeList.add(zplCode);
resolvedLabelDataList.add(buildLabelDataForReuse(realDataMap));
log.debug("第 {} 条记录生成ZPL成功,数据字段数: {}", i + 1, realDataMap.size());
}
// 将已解析的标签数据写回queryParams供调用方复用避免重复查询IFS
if (queryParams != null) {
queryParams.put(RESOLVED_LABEL_DATA_LIST_KEY, resolvedLabelDataList);
}
log.info("成功生成 {} 个ZPL代码", zplCodeList.size());
return zplCodeList;
@ -1817,6 +1825,19 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
}
}
/**
* 构建可复用的标签数据移除内部上下文字段
*/
private Map<String, Object> buildLabelDataForReuse(Map<String, Object> realDataMap) {
Map<String, Object> reusableData = new HashMap<>();
if (realDataMap == null || realDataMap.isEmpty()) {
return reusableData;
}
reusableData.putAll(realDataMap);
reusableData.remove(CUSTOM_FIELDS_CONTEXT_KEY);
return reusableData;
}
/**
* 从查询参数中提取前端补充字段
*/

88
src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java

@ -32,6 +32,7 @@ import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
@Service
public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMapper, ReportLabelList> implements ReportLabelListService {
private static final String RESOLVED_LABEL_DATA_LIST_KEY = "__RESOLVED_LABEL_DATA_LIST__";
@Autowired
private BaseService baseService;
@ -331,6 +332,33 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
}
}
/**
* 获取打印所需标签数据优先复用已解析数据避免重复调用IFS
*/
private List<java.util.Map<String, Object>> getLabelDataForPrint(String labelNo, Map<String, Object> queryParams) {
if (queryParams != null) {
Object resolvedDataObj = queryParams.get(RESOLVED_LABEL_DATA_LIST_KEY);
if (resolvedDataObj instanceof List<?> resolvedList && !resolvedList.isEmpty()) {
List<java.util.Map<String, Object>> resolvedLabelDataList = new ArrayList<>();
for (Object item : resolvedList) {
if (item instanceof Map<?, ?> dataMap) {
java.util.Map<String, Object> row = new HashMap<>();
for (Map.Entry<?, ?> entry : dataMap.entrySet()) {
if (entry.getKey() != null) {
row.put(entry.getKey().toString(), entry.getValue());
}
}
resolvedLabelDataList.add(row);
}
}
if (!resolvedLabelDataList.isEmpty()) {
return resolvedLabelDataList;
}
}
}
return getLabelDataForSaving(labelNo, queryParams);
}
/**
* 从Map中安全地获取字符串值
*/
@ -659,8 +687,10 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
@Override
public void printLabelCommon(PrintLabelRequest printRequest) {
String rfidFlag;
// 当前端传了customerId时,根据客户编码解析标签编号
String resolvedReportId = resolveReportIdByCustomer(printRequest);
LabelSettingData labelSettingData = new LabelSettingData();
labelSettingData.setLabelNo(printRequest.getReportId());
labelSettingData.setLabelNo(resolvedReportId);
labelSettingData.setLabelType(printRequest.getLabelType());
List<LabelSettingData> labelSettingDataList = baseService.getLabelSettingList(labelSettingData);
LabelSettingData labelSetting;
@ -708,7 +738,7 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
// 生成带真实数据的ZPL代码和对应的数据
List<String> zplCodeList = previewLabelWithRealData(labelSetting.getLabelNo(), true, queryParams);
// 同时获取原始数据用于保存WMS标签记录
List<java.util.Map<String, Object>> labelDataList = getLabelDataForSaving(labelSetting.getLabelNo(), queryParams);
List<Map<String, Object>> labelDataList = getLabelDataForPrint(labelSetting.getLabelNo(), queryParams);
// 2. 验证ZPL代码
if (zplCodeList == null || zplCodeList.isEmpty()) {
throw new RuntimeException("ZPL代码获取失败");
@ -766,4 +796,58 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
throw new RuntimeException("RFID标签打印失败: " + e.getMessage());
}
}
/**
* 根据客户编码解析标签编号仅当前端传了customerId时生效
*/
private String resolveReportIdByCustomer(PrintLabelRequest printRequest) {
String fallbackReportId = printRequest.getReportId();
String customerId = printRequest.getCustomerId();
if (StringUtils.isBlank(customerId)) {
return fallbackReportId;
}
try {
CustomerLabelSettingData query = new CustomerLabelSettingData();
query.setSearchFlag("Y");
query.setCustomerId(customerId.trim());
query.setLabelType(printRequest.getLabelType());
List<CustomerLabelSettingData> customerLabelList = baseService.getCustomerLabelSettingList(query);
if (customerLabelList == null || customerLabelList.isEmpty()) {
log.warn("客户标签映射未找到,回退前端reportId。customerId={}, labelType={}, reportId={}",
customerId, printRequest.getLabelType(), fallbackReportId);
return fallbackReportId;
}
CustomerLabelSettingData matchedLabel = null;
for (CustomerLabelSettingData item : customerLabelList) {
if (item == null || StringUtils.isBlank(item.getLabelNo())) {
continue;
}
if (StringUtils.isNotBlank(printRequest.getSite())
&& !StringUtils.equalsIgnoreCase(printRequest.getSite(), item.getSite())) {
continue;
}
// 优先主标签SubReportFlag=N
if ("N".equalsIgnoreCase(item.getSubLabelFlag())) {
matchedLabel = item;
break;
}
if (matchedLabel == null) {
matchedLabel = item;
}
}
if (matchedLabel != null && StringUtils.isNotBlank(matchedLabel.getLabelNo())) {
log.info("按客户标签映射解析reportId成功。customerId={}, labelType={}, resolvedReportId={}",
customerId, printRequest.getLabelType(), matchedLabel.getLabelNo());
return matchedLabel.getLabelNo();
}
} catch (Exception e) {
log.warn("按客户编码解析标签编号失败,回退前端reportId。customerId={}, labelType={}, error={}",
customerId, printRequest.getLabelType(), e.getMessage());
}
return fallbackReportId;
}
}
Loading…
Cancel
Save