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
@@ -396,6 +396,63 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
group by a.MATERIAL_INVENTORY_ID order by sort_order, a.update_time desc
</select>
<!-- ============ 出库单明细可分配库存(库存分配弹窗专用) ============
列复用通用片段;条件独立成段,不改动 selectMaterialInventoryPo1,库存查询页零影响。
与 /list 的三点差异:
1) 多值 token OR-LIKE(出库明细的箱号/卡板、Sheet Ref NO's 可能是多值拼接串,整串 LIKE 匹配不到行)
2) 只按出库单货主+仓库过滤,不走 customerName 换算、不叠加 b.shipper_id、不强制用户组织
3) 可分配数量(allocation_quantity=可用数量)>0 才返回,比排除 inventory_quantity=0 更准 -->
<select id="queryAssignableList" parameterType="com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO"
resultMap="MaterialInventoryResult">
select
<include refid="selectMaterialInventoryPo"/>
<include refid="com.mhd.wms.domain.materialBaseInfo.repository.mapper.MaterialBaseInfoMapper.JoinMaterialBaseInfoPo"/>
from material_inventory a
left join material_base_info b on a.material_base_info_id = b.material_base_info_id
<where>
a.del_flag = 1
and IFNULL(a.allocation_quantity, 0) &gt; 0
<if test="shipperId != null">
and a.shipper_id = #{shipperId}
</if>
<if test="warehouseId != null">
and a.warehouse_id = #{warehouseId}
</if>
<if test="materialBaseInfoId != null">
and a.material_base_info_id = #{materialBaseInfoId}
</if>
<if test="materialCode != null and materialCode != ''">
and b.material_code = #{materialCode}
</if>
<!-- 有箱号/卡板则同时匹配:任一 token 命中即保留(LIKE 兼容库存列本身也是多值串的情况) -->
<if test="boxPalletNoList != null and boxPalletNoList.size() > 0">
and (
<foreach collection="boxPalletNoList" item="token" separator=" or ">
a.BOX_PALLET_NO like concat('%', #{token}, '%')
</foreach>
)
</if>
<!-- 有 Sheet Ref NO's 则同时匹配 -->
<if test="sheetRefNoList != null and sheetRefNoList.size() > 0">
and (
<foreach collection="sheetRefNoList" item="token" separator=" or ">
a.SHEET_REF_NO like concat('%', #{token}, '%')
</foreach>
)
</if>
<!-- Batch Ref NO's:默认不启用(需求只要求 物料+箱号卡板+SheetRef),需要时由服务层显式赋值 -->
<if test="batchRefNoList != null and batchRefNoList.size() > 0">
and (
<foreach collection="batchRefNoList" item="token" separator=" or ">
a.BATCH_REF_NO like concat('%', #{token}, '%')
</foreach>
)
</if>
</where>
group by a.MATERIAL_INVENTORY_ID
order by sort_order, a.update_time desc
</select>
<select id="queryListByWlKw" parameterType="com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO" resultMap="MaterialInventoryResult">
select
<include refid="selectMaterialInventoryPo"/>