Merge remote-tracking branch 'gitee/0.8.X' into 0.8.X
This commit is contained in:
@@ -189,6 +189,17 @@ public class WmsMaterialCoilBo extends BaseEntity {
|
||||
|
||||
private Boolean onlyUnshippedAndUnplanned;
|
||||
|
||||
/**
|
||||
* 是否排除已被发货单明细绑定的钢卷(true=列表不返回已绑定钢卷)
|
||||
*/
|
||||
private Boolean excludeBound;
|
||||
|
||||
/**
|
||||
* 是否在列表中返回“发货单明细绑定信息”(true=返回 bound + 绑定来源信息)
|
||||
* 默认不返回,避免不需要的场景变慢。
|
||||
*/
|
||||
private Boolean includeBindInfo;
|
||||
|
||||
//销售id
|
||||
private Long saleId;
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.klp.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 钢卷绑定信息(发货单明细 -> 发货单 -> 发货计划)
|
||||
* 用于快速标记钢卷是否已被发货单明细占用,并返回占用来源信息。
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class WmsCoilBindInfoVo implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Long coilId;
|
||||
|
||||
private Long detailId;
|
||||
|
||||
private Long waybillId;
|
||||
private String waybillNo;
|
||||
private String waybillName;
|
||||
|
||||
private Long planId;
|
||||
private String planName;
|
||||
private Date planDate;
|
||||
}
|
||||
|
||||
@@ -333,5 +333,24 @@ public class WmsMaterialCoilVo extends BaseEntity {
|
||||
* 独占状态(0=未独占,1=特殊分卷中)
|
||||
*/
|
||||
private Integer exclusiveStatus;
|
||||
|
||||
// ========== 发货绑定信息(由发货单明细占用) ==========
|
||||
|
||||
/**
|
||||
* 是否已被发货单明细绑定(true=不可再次绑定)
|
||||
*/
|
||||
private Boolean bound;
|
||||
|
||||
private Long bindDetailId;
|
||||
|
||||
private Long bindWaybillId;
|
||||
private String bindWaybillNo;
|
||||
private String bindWaybillName;
|
||||
|
||||
private Long bindPlanId;
|
||||
private String bindPlanName;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private Date bindPlanDate;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
package com.klp.mapper;
|
||||
|
||||
import com.klp.domain.WmsDeliveryWaybillDetail;
|
||||
import com.klp.domain.vo.WmsCoilBindInfoVo;
|
||||
import com.klp.domain.vo.WmsDeliveryWaybillDetailVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 发货单明细Mapper接口
|
||||
@@ -12,4 +17,13 @@ import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
*/
|
||||
public interface WmsDeliveryWaybillDetailMapper extends BaseMapperPlus<WmsDeliveryWaybillDetailMapper, WmsDeliveryWaybillDetail, WmsDeliveryWaybillDetailVo> {
|
||||
|
||||
/**
|
||||
* 按钢卷ID批量查询绑定来源信息(明细->发货单->发货计划)
|
||||
*/
|
||||
List<WmsCoilBindInfoVo> selectBindInfoByCoilIds(@Param("coilIds") Collection<Long> coilIds);
|
||||
|
||||
/**
|
||||
* 按钢卷ID查询绑定来源信息(明细->发货单->发货计划)
|
||||
*/
|
||||
WmsCoilBindInfoVo selectBindInfoByCoilId(@Param("coilId") Long coilId);
|
||||
}
|
||||
|
||||
@@ -7,11 +7,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.common.exception.ServiceException;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.domain.bo.WmsDeliveryWaybillDetailBo;
|
||||
import com.klp.domain.vo.WmsDeliveryWaybillDetailVo;
|
||||
import com.klp.domain.WmsDeliveryWaybillDetail;
|
||||
import com.klp.domain.vo.WmsCoilBindInfoVo;
|
||||
import com.klp.mapper.WmsDeliveryWaybillDetailMapper;
|
||||
import com.klp.service.IWmsDeliveryWaybillDetailService;
|
||||
|
||||
@@ -105,7 +107,32 @@ public class WmsDeliveryWaybillDetailServiceImpl implements IWmsDeliveryWaybillD
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(WmsDeliveryWaybillDetail entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
if (entity == null || entity.getCoilId() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 同一个钢卷只能被一个发货单明细绑定(排除当前记录)
|
||||
LambdaQueryWrapper<WmsDeliveryWaybillDetail> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(WmsDeliveryWaybillDetail::getCoilId, entity.getCoilId());
|
||||
lqw.eq(WmsDeliveryWaybillDetail::getDelFlag, 0);
|
||||
lqw.ne(entity.getDetailId() != null, WmsDeliveryWaybillDetail::getDetailId, entity.getDetailId());
|
||||
lqw.last("LIMIT 1");
|
||||
WmsDeliveryWaybillDetail exists = baseMapper.selectOne(lqw);
|
||||
if (exists == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 拼接提示:在哪个计划/发货单下已被绑定
|
||||
WmsCoilBindInfoVo bindInfo = baseMapper.selectBindInfoByCoilId(entity.getCoilId());
|
||||
if (bindInfo != null) {
|
||||
throw new ServiceException(
|
||||
"该钢卷已被绑定,不能重复选择;" +
|
||||
"发货计划:" + bindInfo.getPlanName() +
|
||||
",发货单:" + bindInfo.getWaybillNo() +
|
||||
"(" + bindInfo.getWaybillName() + ")"
|
||||
);
|
||||
}
|
||||
throw new ServiceException("该钢卷已被绑定,不能重复选择");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -95,6 +95,12 @@ public class WmsDeliveryWaybillServiceImpl implements IWmsDeliveryWaybillService
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(WmsDeliveryWaybillBo bo) {
|
||||
// 现根据bo.getWaybillId()查询出数据库中的数据
|
||||
// 如果这条数据的status是1 则抛异常为不允许修改
|
||||
WmsDeliveryWaybill db = baseMapper.selectById(bo.getWaybillId());
|
||||
if (db.getStatus() == 1) {
|
||||
throw new RuntimeException("已发货的发货单不能修改");
|
||||
}
|
||||
WmsDeliveryWaybill update = BeanUtil.toBean(bo, WmsDeliveryWaybill.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
|
||||
@@ -70,6 +70,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
private final WmsDeliveryPlanMapper deliveryPlanMapper;
|
||||
private final WmsProductMapper productMapper;
|
||||
private final WmsRawMaterialMapper rawMaterialMapper;
|
||||
private final WmsDeliveryWaybillDetailMapper deliveryWaybillDetailMapper;
|
||||
|
||||
/**
|
||||
* 查询钢卷物料表
|
||||
@@ -305,6 +306,47 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
// 批量查询当前页钢卷的“发货单明细绑定”信息(用于禁选/置灰/提示来源)
|
||||
// 仅当前端明确需要时才查询,避免不必要的性能开销
|
||||
if (Boolean.TRUE.equals(bo.getIncludeBindInfo())) {
|
||||
try {
|
||||
List<Long> coilIds = records.stream()
|
||||
.map(WmsMaterialCoilVo::getCoilId)
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (!coilIds.isEmpty()) {
|
||||
Map<Long, WmsCoilBindInfoVo> bindMap = deliveryWaybillDetailMapper
|
||||
.selectBindInfoByCoilIds(coilIds)
|
||||
.stream()
|
||||
.collect(Collectors.toMap(
|
||||
WmsCoilBindInfoVo::getCoilId,
|
||||
v -> v,
|
||||
(a, b) -> a
|
||||
));
|
||||
|
||||
for (WmsMaterialCoilVo vo : records) {
|
||||
WmsCoilBindInfoVo bind = bindMap.get(vo.getCoilId());
|
||||
if (bind != null) {
|
||||
vo.setBound(Boolean.TRUE);
|
||||
vo.setBindDetailId(bind.getDetailId());
|
||||
vo.setBindWaybillId(bind.getWaybillId());
|
||||
vo.setBindWaybillNo(bind.getWaybillNo());
|
||||
vo.setBindWaybillName(bind.getWaybillName());
|
||||
vo.setBindPlanId(bind.getPlanId());
|
||||
vo.setBindPlanName(bind.getPlanName());
|
||||
vo.setBindPlanDate(bind.getPlanDate());
|
||||
} else {
|
||||
vo.setBound(Boolean.FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ignore) {
|
||||
// 绑定信息属于增强字段,查询失败时不影响钢卷列表主流程
|
||||
}
|
||||
}
|
||||
|
||||
Set<String> userNames = records.stream()
|
||||
.flatMap(v -> java.util.stream.Stream.of(v.getCreateBy(), v.getUpdateBy(), v.getExportBy()))
|
||||
.filter(StringUtils::isNotBlank)
|
||||
@@ -408,6 +450,11 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
||||
qw.in("mc.quality_status", java.util.Arrays.asList("C+", "C", "C-", "D+", "D", "D-"));
|
||||
}
|
||||
|
||||
// 排除已被发货单明细绑定的钢卷(SQL级过滤,分页总数准确)
|
||||
if (Boolean.TRUE.equals(bo.getExcludeBound())) {
|
||||
qw.apply("NOT EXISTS (SELECT 1 FROM wms_delivery_waybill_detail d WHERE d.del_flag = 0 AND d.coil_id = mc.coil_id)");
|
||||
}
|
||||
|
||||
// 组合 item_id 条件:改为使用 EXISTS 子查询,替代预查询 + IN
|
||||
boolean hasSelectType = StringUtils.isNotBlank(bo.getSelectType());
|
||||
boolean hasAnyItemFilter = StringUtils.isNotBlank(bo.getItemMaterial())
|
||||
@@ -505,16 +552,16 @@ 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))");
|
||||
}
|
||||
// // 仅查询未发货且未绑定在发货计划里的钢卷
|
||||
// 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字段作为筛选条件
|
||||
|
||||
@@ -27,5 +27,53 @@
|
||||
<result property="updateBy" column="update_by"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap type="com.klp.domain.vo.WmsCoilBindInfoVo" id="WmsCoilBindInfoResult">
|
||||
<result property="coilId" column="coil_id"/>
|
||||
<result property="detailId" column="detail_id"/>
|
||||
<result property="waybillId" column="waybill_id"/>
|
||||
<result property="waybillNo" column="waybill_no"/>
|
||||
<result property="waybillName" column="waybill_name"/>
|
||||
<result property="planId" column="plan_id"/>
|
||||
<result property="planName" column="plan_name"/>
|
||||
<result property="planDate" column="plan_date"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectBindInfoByCoilIds" resultMap="WmsCoilBindInfoResult">
|
||||
SELECT
|
||||
d.coil_id,
|
||||
d.detail_id,
|
||||
w.waybill_id,
|
||||
w.waybill_no,
|
||||
w.waybill_name,
|
||||
p.plan_id,
|
||||
p.plan_name,
|
||||
p.plan_date
|
||||
FROM wms_delivery_waybill_detail d
|
||||
INNER JOIN wms_delivery_waybill w ON w.waybill_id = d.waybill_id AND w.del_flag = 0
|
||||
INNER JOIN wms_delivery_plan p ON p.plan_id = w.plan_id AND p.del_flag = 0
|
||||
WHERE d.del_flag = 0
|
||||
AND d.coil_id IN
|
||||
<foreach collection="coilIds" item="id" open="(" close=")" separator=",">
|
||||
#{id}
|
||||
</foreach>
|
||||
</select>
|
||||
|
||||
<select id="selectBindInfoByCoilId" resultMap="WmsCoilBindInfoResult">
|
||||
SELECT
|
||||
d.coil_id,
|
||||
d.detail_id,
|
||||
w.waybill_id,
|
||||
w.waybill_no,
|
||||
w.waybill_name,
|
||||
p.plan_id,
|
||||
p.plan_name,
|
||||
p.plan_date
|
||||
FROM wms_delivery_waybill_detail d
|
||||
INNER JOIN wms_delivery_waybill w ON w.waybill_id = d.waybill_id AND w.del_flag = 0
|
||||
INNER JOIN wms_delivery_plan p ON p.plan_id = w.plan_id AND p.del_flag = 0
|
||||
WHERE d.del_flag = 0
|
||||
AND d.coil_id = #{coilId}
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -102,6 +102,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
mc.temper_grade,
|
||||
mc.exclusive_status,
|
||||
su.nick_name AS saleName,
|
||||
w.warehouse_name AS warehouseName,
|
||||
aw.actual_warehouse_name AS actualWarehouseName,
|
||||
CASE WHEN mc.item_type = 'raw_material' THEN rm.specification
|
||||
WHEN mc.item_type = 'product' THEN p.specification
|
||||
|
||||
Reference in New Issue
Block a user