feat(wms):复核详情增加合计数;库存分配新增通宇专用可分配库存查询(物料+箱号/卡板+Sheet Ref匹配

1. 复核详情(getInfo/getInfoReviewOrderNumber)头表回填totalReviewedQty/totalPlanQty/materialKindCount,
   口径与列表queryList聚合一致(计划量=Σifnull(material_plan_qty,pending+reviewed))
2. 新增 GET /materialInventoryApi/assignableList,按通宇账号分流(TongyuOrgUtil:组织ID=2830或组织名含"通宇"):
   - 通宇:启用新匹配。双模式入参——传outOrderId+materialDetailId(须成对)则匹配值全部后端自取出库单/明细;
     不传则按平铺参数(materialBaseInfoId/materialCode+boxPalletNo+sheetRefNo,多值串自动拆token OR-LIKE)。
     固定条件:del_flag=1且可分配数量(allocation_quantity)>0,不分页全量返回,不套用用户组织数据权限
   - 非通宇:保持原/list行为,内部直调list();进原查询前清除materialDetailId(新接口专用参数,防泄入
     原查询的a.material_detail_id=上架单明细ID条件导致查空)
3. autoAssign自动分配同步分流:通宇走token匹配,非通宇保持原eq精确匹配不变
4. 新增util/BatchNoTokenUtil(批次属性多值拆分)、util/TongyuOrgUtil;库存批次属性回填抽为
   fillBatchAttributes供/list与可分配查询复用,原逻辑行为不变
This commit is contained in:
rcx
2026-08-26 09:30:01 +08:00
parent 7a5e124f98
commit 7d8e1c3872
9 changed files with 355 additions and 13 deletions
@@ -0,0 +1,40 @@
package com.mhd.wms.util;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 出库分配批次属性多值拆分工具。
* 出库明细的箱号/卡板号、Sheet Ref NO's、Batch Ref NO's 可能是「多个值拼接的字符串」
* (如 Excel 导入单元格原样入库),而库存表每行通常只有一个(或多个拼接的)值;
* 直接整串 LIKE 匹配不到任何行,是「可分配库存不完整」的主要根因。
*
* @author rcx
*/
public final class BatchNoTokenUtil {
/** 英文/中文逗号、分号、顿号、斜杠、空白 */
private static final String SEPARATOR_REGEX = "[,;;、/\\s]+";
private BatchNoTokenUtil() {
}
/**
* 按常见分隔符拆分;trim、去空、去重。
*
* @param value 明细上的批次属性原始值
* @return token 列表;无可拆内容时返回 null(表示「不参与匹配」)
*/
public static List<String> splitTokens(String value) {
if (value == null || value.trim().isEmpty()) {
return null;
}
List<String> tokens = Arrays.stream(value.split(SEPARATOR_REGEX))
.map(String::trim)
.filter(s -> !s.isEmpty())
.distinct()
.collect(Collectors.toList());
return tokens.isEmpty() ? null : tokens;
}
}
@@ -0,0 +1,44 @@
package com.mhd.wms.util;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.system.api.model.LoginUser;
/**
* 通宇组织/账号判断工具。
* 口径来源:既有代码约定「通宇组织ID=2830」(见 HandoverTaskOrderDomainService/StockOutOrderApplicationService 注释)。
* 由于测试/生产环境组织 ID 可能不一致(仓库 ID 已知存在差异),同时按组织名称兜底。
*
* @author rcx
*/
public final class TongyuOrgUtil {
/** 通宇组织ID(生产口径,见既有代码注释) */
public static final Long TONGYU_ORGANIZATION_ID = 2830L;
/** 组织名称关键字 */
private static final String TONGYU_KEYWORD = "通宇";
private TongyuOrgUtil() {
}
/**
* 当前登录账号是否属于通宇组织
*/
public static boolean isTongyu(LoginUser loginUser) {
if (loginUser == null || loginUser.getUserPo() == null) {
return false;
}
if (TONGYU_ORGANIZATION_ID.equals(loginUser.getUserPo().getOrganizationId())) {
return true;
}
return StringUtils.isNotBlank(loginUser.getUserPo().getOrganizationName())
&& loginUser.getUserPo().getOrganizationName().contains(TONGYU_KEYWORD);
}
/**
* 按组织ID判断是否通宇(单据维度兜底用)
*/
public static boolean isTongyuOrganizationId(Long organizationId) {
return TONGYU_ORGANIZATION_ID.equals(organizationId);
}
}