demand: 组树规则重构,虚拟单增加香港-缅甸快递逻辑。

committer: heyu
This commit is contained in:
aike 2025-06-25 17:27:18 +08:00
parent e2e6b78e5c
commit ed5eea160e
2 changed files with 45 additions and 7 deletions

View File

@ -2844,7 +2844,7 @@ public class EmisBaseService {
}
}
if ("002".equals(waybill.getTransLineType()) && StringUtil.isNotBlank(waybill.getVirtualRemark())) {
if (("078".equals(waybill.getTransLineType()) || "002".equals(waybill.getTransLineType())) && StringUtil.isNotBlank(waybill.getVirtualRemark())) {
Date sendDate = waybill.getSendDate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date limitDate = null;
@ -4026,9 +4026,47 @@ public class EmisBaseService {
continue;
}
// 按productType分组
Map<String, List<EmisTransPlanRule>> groupByProductType = lineRules.stream()
.collect(Collectors.groupingBy(EmisTransPlanRule::getProductType));
// 按productType分组(支持productType和productTypeName为逗号分隔的多个类型,且一一对应,且每个rule只保留一个type和typeName)
Map<String, List<EmisTransPlanRule>> groupByProductType = new HashMap<>();
for (EmisTransPlanRule rule : lineRules) {
if (rule.getProductType() != null) {
String[] types = rule.getProductType().split(",");
String[] typeNames = rule.getProductTypeName() != null ? rule.getProductTypeName().split(",") : new String[0];
for (int i = 0; i < types.length; i++) {
String type = types[i].trim();
if (!type.isEmpty()) {
EmisTransPlanRule newRule = new EmisTransPlanRule();
BeanUtils.copyProperties(rule, newRule);
newRule.setProductType(type);
if (i < typeNames.length) {
newRule.setProductTypeName(typeNames[i].trim());
} else {
newRule.setProductTypeName(null);
}
groupByProductType.computeIfAbsent(type, k -> new ArrayList<>()).add(newRule);
}
}
}
}
// 分组内去重(lineCode、productType、startSiteCode、nextSiteCode、supplierCode、startDate、endDate都相同只保留一条)
for (Map.Entry<String, List<EmisTransPlanRule>> entry : groupByProductType.entrySet()) {
List<EmisTransPlanRule> rules = entry.getValue();
Set<String> uniqueKeys = new HashSet<>();
List<EmisTransPlanRule> deduped = new ArrayList<>();
for (EmisTransPlanRule rule : rules) {
String key = (rule.getLineCode() == null ? "" : rule.getLineCode()) + "|"
+ (rule.getProductType() == null ? "" : rule.getProductType()) + "|"
+ (rule.getStartSiteCode() == null ? "" : rule.getStartSiteCode()) + "|"
+ (rule.getNextSiteCode() == null ? "" : rule.getNextSiteCode()) + "|"
+ (rule.getSupplierCode() == null ? "" : rule.getSupplierCode()) + "|"
+ (rule.getStartDate() == null ? "" : rule.getStartDate().toString()) + "|"
+ (rule.getEndDate() == null ? "" : rule.getEndDate().toString());
if (uniqueKeys.add(key)) {
deduped.add(rule);
}
}
entry.setValue(deduped);
}
// 处理每个productType分组
for (Map.Entry<String, List<EmisTransPlanRule>> productEntry : groupByProductType.entrySet()) {
@ -4840,7 +4878,7 @@ public class EmisBaseService {
Map<String, Object> scanDatePromItem = new HashMap<>();
scanDatePromItem.put("billCode", emisWaybillSave.getBillCode());
if ("002".equals(emisWaybillSave.getTransLineType())) {
if ("078".equals(emisWaybillSave.getTransLineType()) || "002".equals(emisWaybillSave.getTransLineType())) {
scanDatePromItem.put("problemType", "173");
scanDatePromItem.put("remark", "出口虚拟面单");
} else {
@ -4891,7 +4929,7 @@ public class EmisBaseService {
if (emisWaybillSave.getMasterBillCode().equals(emisWaybillSave.getBillCode())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "运单号主单号不能相同");
}
if (!"002".equals(emisWaybillSave.getTransLineType()) && !"012".equals(emisWaybillSave.getTransLineType())
if (!"078".equals(emisWaybillSave.getTransLineType()) && !"002".equals(emisWaybillSave.getTransLineType()) && !"012".equals(emisWaybillSave.getTransLineType())
&& !"014".equals(emisWaybillSave.getTransLineType())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单只支持线路为缅甸快递/缅甸快递进口/柬埔寨快递进口");
}

View File

@ -150,7 +150,7 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi
emisTransPlanRule.setProductType(emisWaybill.getProductType());
List<EmisTransPlanRule> list = emisTransPlanRuleMapper.checkTransPlanRule(emisTransPlanRule);
if (CollectionUtil.isEmpty(list)) {
throw new EmisBizError(EmisBizErrorType.FAIL, "组批次起始网点、下一网点、供应商与规则不匹配");
throw new EmisBizError(EmisBizErrorType.FAIL, emisWaybill.getBillCode()+"组批次起始网点、下一网点、供应商与规则不匹配");
}
}