feat(wms): 增加钢卷查询时过滤已发货的功能

- 在 WmsMaterialCoilBo 中新增 onlyUnshippedAndUnplanned 字段用于控制查询条件
- 修改 WmsMaterialCoilServiceImpl,在查询中增加对未发货且未绑定发货计划钢卷的筛选逻辑
- 删除原有的 queryAvailableForDelivery 方法及相关查询构建方法
- 移除了控制器中 /availableForDelivery 接口的独立实现
- 使用 NOT EXISTS + FIND_IN_SET 优化了钢卷是否被发货计划引用的判断逻辑
This commit is contained in:
2025-12-10 14:15:08 +08:00
parent e9a79e4069
commit db309d67a1
4 changed files with 13 additions and 89 deletions

View File

@@ -450,6 +450,17 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
qw.in("mc.coil_id", coilIdList);
}
}
// 仅查询未发货且未绑定在发货计划里的钢卷
if (Boolean.TRUE.equals(bo.getOnlyUnshippedAndUnplanned())) {
// 未发货:排除状态=1已出库/已发货)
qw.ne("mc.status", 1);
// 未绑定在任一有效发货计划计划未删除coil 字段包含当前 coil_id
// 这里使用 NOT EXISTS + FIND_IN_SET避免将所有计划加载到内存
qw.apply("NOT EXISTS (SELECT 1 FROM wms_delivery_plan dp " +
"WHERE dp.del_flag = 0 AND dp.coil IS NOT NULL AND dp.coil <> '' " +
"AND FIND_IN_SET(CAST(mc.coil_id AS CHAR), dp.coil))");
}
//逻辑删除
qw.eq("mc.del_flag", 0);
//把team字段作为筛选条件
@@ -1856,84 +1867,6 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
return lqw;
}
/**
* 查询可用于发货计划的钢卷(未被任何发货计划引用的钢卷)
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 钢卷分页列表
*/
@Override
public TableDataInfo<WmsMaterialCoilVo> queryAvailableForDelivery(WmsMaterialCoilBo bo, PageQuery pageQuery) {
// 构建查询条件
LambdaQueryWrapper<WmsMaterialCoil> lqw = buildAvailableCoilQueryWrapper(bo);
Page<WmsMaterialCoilVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 构建可用于发货计划的钢卷查询条件
* 排除已被任何发货计划引用的钢卷
*
* @param bo 查询条件
* @return 查询构造器
*/
private LambdaQueryWrapper<WmsMaterialCoil> buildAvailableCoilQueryWrapper(WmsMaterialCoilBo bo) {
LambdaQueryWrapper<WmsMaterialCoil> lqw = Wrappers.lambdaQuery();
// 基础查询条件
lqw.eq(WmsMaterialCoil::getDelFlag, 0); // 未删除
lqw.eq(WmsMaterialCoil::getStatus, 0); // 在库状态
lqw.eq(WmsMaterialCoil::getDataType, 1); // 当前数据
// 应用传入的查询条件
if (StringUtils.isNotBlank(bo.getEnterCoilNo())) {
lqw.like(WmsMaterialCoil::getEnterCoilNo, bo.getEnterCoilNo());
}
if (StringUtils.isNotBlank(bo.getCurrentCoilNo())) {
lqw.like(WmsMaterialCoil::getCurrentCoilNo, bo.getCurrentCoilNo());
}
if (StringUtils.isNotBlank(bo.getSupplierCoilNo())) {
lqw.like(WmsMaterialCoil::getSupplierCoilNo, bo.getSupplierCoilNo());
}
if (bo.getWarehouseId() != null) {
lqw.eq(WmsMaterialCoil::getWarehouseId, bo.getWarehouseId());
}
if (bo.getItemId() != null) {
lqw.eq(WmsMaterialCoil::getItemId, bo.getItemId());
}
if (StringUtils.isNotBlank(bo.getItemType())) {
lqw.eq(WmsMaterialCoil::getItemType, bo.getItemType());
}
// 排除已被发货计划引用的钢卷
LambdaQueryWrapper<WmsDeliveryPlan> planQuery =Wrappers.lambdaQuery();
planQuery.eq(WmsDeliveryPlan::getDelFlag, 0) // 过滤已删除的计划
.isNotNull(WmsDeliveryPlan::getCoil) // 只查有钢卷ID的计划
.ne(WmsDeliveryPlan::getCoil, ""); // 排除空字符串
List<WmsDeliveryPlan> plans = deliveryPlanMapper.selectList(planQuery);
if (!plans.isEmpty()) {
Set<Long> usedCoilIds = new HashSet<>();
for (WmsDeliveryPlan plan : plans) {
if (StringUtils.isNotBlank(plan.getCoil())) {
String[] coilIds = plan.getCoil().split(",");
for (String coilIdStr : coilIds) {
try {
usedCoilIds.add(Long.parseLong(coilIdStr.trim()));
} catch (NumberFormatException ignored) {
// 忽略无效的ID
}
}
}
}
if (!usedCoilIds.isEmpty()) {
lqw.notIn(WmsMaterialCoil::getCoilId, usedCoilIds);
}
}
return lqw;
}
/**