Files
klp-oa/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml
Joshi bfba3ce49a feat(warehouse): 添加库位排序号修正功能并优化钢卷查询排序
- 在 IWmsActualWarehouseService 中新增 fixSortNoByParentId 方法用于修正库位排序号
- 在 WmsActualWarehouseController 中新增 /fixSortNo/{parentId} 接口
- 实现 WmsActualWarehouseServiceImpl 中的 fixSortNoByParentId 业务逻辑
- 添加正则表达式处理库位编码的排序键解析
- 新增 WmsMaterialCoilMapper 的 selectVoPagePlusOrderBy 查询方法
- 重构 WmsMaterialCoilMapper.xml 中的排序辅助字段查询逻辑
- 修改 WmsMaterialCoilServiceImpl 中的分页查询逻辑以支持排序功能
2026-03-12 17:05:22 +08:00

857 lines
38 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.mapper.WmsMaterialCoilMapper">
<resultMap type="com.klp.domain.WmsMaterialCoil" id="WmsMaterialCoilResult">
<result property="coilId" column="coil_id"/>
<result property="parentCoilId" column="parent_coil_id"/>
<result property="enterCoilNo" column="enter_coil_no"/>
<result property="currentCoilNo" column="current_coil_no"/>
<result property="supplierCoilNo" column="supplier_coil_no"/>
<result property="dataType" column="data_type"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="nextWarehouseId" column="next_warehouse_id"/>
<result property="qrcodeRecordId" column="qrcode_record_id"/>
<result property="team" column="team"/>
<result property="hasMergeSplit" column="has_merge_split"/>
<result property="parentCoilNos" column="parent_coil_nos"/>
<result property="itemType" column="item_type"/>
<result property="itemId" column="item_id"/>
<result property="grossWeight" column="gross_weight"/>
<result property="netWeight" column="net_weight"/>
<result property="length" column="length"/>
<result property="actualLength" column="actual_length"/>
<result property="actualWidth" column="actual_width"/>
<result property="status" column="status"/>
<result property="remark" column="remark"/>
<result property="delFlag" column="del_flag"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="updateTime" column="update_time"/>
<result property="updateBy" column="update_by"/>
</resultMap>
<!-- 统计查询专用的ResultMap -->
<resultMap type="com.klp.domain.vo.WmsMaterialCoilVo" id="WmsMaterialCoilDistributionResult">
<result property="warehouseId" column="warehouse_id"/>
<result property="warehouseName" column="warehouse_name"/>
<result property="itemType" column="item_type"/>
<result property="coilCount" column="coil_count"/>
<result property="totalGrossWeight" column="total_gross_weight"/>
<result property="totalNetWeight" column="total_net_weight"/>
</resultMap>
<!-- 查询各个库区中钢卷的汇总分布情况(按仓库汇总) -->
<select id="getDistributionByWarehouse" resultType="java.util.Map">
SELECT
w.warehouse_id,
w.warehouse_name,
COUNT(mc.coil_id) as coil_count,
COALESCE(SUM(mc.gross_weight), 0) as total_gross_weight,
COALESCE(SUM(mc.net_weight), 0) as total_net_weight
FROM wms_warehouse w
LEFT JOIN wms_material_coil mc ON w.warehouse_id = mc.warehouse_id
AND mc.data_type = 1
AND mc.del_flag = '0'
and (mc.material_type='成品' or mc.material_type='原料')
and mc.status!=1
WHERE w.del_flag = '0'
<if test="itemType != null and itemType != ''">
AND mc.item_type = #{itemType}
</if>
<if test="itemId != null">
AND mc.item_id = #{itemId}
</if>
GROUP BY w.warehouse_id, w.warehouse_name
ORDER BY w.warehouse_id
</select>
<select id="selectVoPagePlus" resultType="com.klp.domain.vo.WmsMaterialCoilVo">
SELECT
mc.coil_id,
mc.parent_coil_id,
mc.export_time,
mc.export_by,
mc.enter_coil_no,
mc.current_coil_no,
mc.supplier_coil_no,
mc.data_type,
mc.material_type,
mc.next_warehouse_id,
mc.qrcode_record_id,
mc.team,
mc.has_merge_split,
mc.parent_coil_nos,
mc.item_type,
mc.item_id,
mc.gross_weight,
mc.net_weight,
mc.status,
mc.remark,
mc.warehouse_id,
mc.actual_warehouse_id,
mc.del_flag,
mc.create_time,
mc.update_time,
mc.create_by,
mc.update_by,
mc.quality_status,
mc.trimming_requirement,
mc.packaging_requirement,
mc.packing_status,
mc.sale_id AS saleId,
mc.length,
mc.actual_length,
mc.actual_width,
mc.coating_type,
mc.temper_grade,
mc.business_purpose,
mc.is_related_to_order,
mc.exclusive_status,
su.nick_name AS saleName,
w.warehouse_name AS warehouseName,
nw.warehouse_name AS nextWarehouseName,
aw.actual_warehouse_name AS actualWarehouseName,
CASE WHEN mc.item_type = 'raw_material' THEN rm.specification
WHEN mc.item_type = 'product' THEN p.specification
ELSE NULL END AS specification,
CASE WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL END AS material,
CASE WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL END AS manufacturer,
CASE WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL END AS zincLayer,
-- 物品名称和编号(用于兼容)
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode,
-- 异常数量统计
COALESCE(ca.abnormal_count, 0) AS abnormalCount
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_warehouse nw ON mc.next_warehouse_id = nw.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN sys_user su ON mc.sale_id = su.user_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
LEFT JOIN (
SELECT coil_id, COUNT(*) AS abnormal_count
FROM wms_coil_abnormal
WHERE del_flag = 0
GROUP BY coil_id
) ca ON mc.coil_id = ca.coil_id
${ew.customSqlSegment}
</select>
<!-- orderBy=true 专用包含库位排序辅助字段aw_sort_key/aw_layer_key/aw_id_key以及父库位 join -->
<select id="selectVoPagePlusOrderBy" resultType="com.klp.domain.vo.WmsMaterialCoilVo">
SELECT
mc.coil_id,
mc.parent_coil_id,
mc.export_time,
mc.export_by,
mc.enter_coil_no,
mc.current_coil_no,
mc.supplier_coil_no,
mc.data_type,
mc.material_type,
mc.next_warehouse_id,
mc.qrcode_record_id,
mc.team,
mc.has_merge_split,
mc.parent_coil_nos,
mc.item_type,
mc.item_id,
mc.gross_weight,
mc.net_weight,
mc.status,
mc.remark,
mc.warehouse_id,
mc.actual_warehouse_id,
mc.del_flag,
mc.create_time,
mc.update_time,
mc.create_by,
mc.update_by,
mc.quality_status,
mc.trimming_requirement,
mc.packaging_requirement,
mc.packing_status,
mc.sale_id AS saleId,
mc.length,
mc.actual_length,
mc.actual_width,
mc.coating_type,
mc.temper_grade,
mc.business_purpose,
mc.is_related_to_order,
mc.exclusive_status,
su.nick_name AS saleName,
w.warehouse_name AS warehouseName,
nw.warehouse_name AS nextWarehouseName,
aw.actual_warehouse_name AS actualWarehouseName,
CASE WHEN mc.item_type = 'raw_material' THEN rm.specification
WHEN mc.item_type = 'product' THEN p.specification
ELSE NULL END AS specification,
CASE WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL END AS material,
CASE WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL END AS manufacturer,
CASE WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL END AS zincLayer,
-- 物品名称和编号(用于兼容)
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode,
-- 库位排序辅助字段(用于全局交错排序,避免在 ORDER BY 中写复杂表达式触发 MP 注入拦截)
COALESCE(CASE WHEN aw.actual_warehouse_type = 4 THEN awp.sort_no ELSE aw.sort_no END, 0) AS aw_sort_key,
CASE WHEN aw.actual_warehouse_type = 4 THEN CAST(SUBSTRING_INDEX(aw.actual_warehouse_code, '-', -1) AS UNSIGNED) ELSE 0 END AS aw_layer_key,
COALESCE(aw.actual_warehouse_id, 0) AS aw_id_key,
-- 异常数量统计
COALESCE(ca.abnormal_count, 0) AS abnormalCount
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_warehouse nw ON mc.next_warehouse_id = nw.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN wms_actual_warehouse awp ON aw.parent_id = awp.actual_warehouse_id
LEFT JOIN sys_user su ON mc.sale_id = su.user_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
LEFT JOIN (
SELECT coil_id, COUNT(*) AS abnormal_count
FROM wms_coil_abnormal
WHERE del_flag = 0
GROUP BY coil_id
) ca ON mc.coil_id = ca.coil_id
${ew.customSqlSegment}
</select>
<!-- 查询不同类型的钢卷在不同库区的分布情况 -->
<select id="getDistributionByItemType" resultType="java.util.Map">
SELECT
mc.item_type,
mc.item_id,
w.warehouse_id,
w.warehouse_name,
COUNT(mc.coil_id) as coil_count,
COALESCE(SUM(mc.gross_weight), 0) as total_gross_weight,
COALESCE(SUM(mc.net_weight), 0) as total_net_weight,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.specification
WHEN mc.item_type = 'product' THEN p.specification
ELSE NULL
END as specification,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL
END as material,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL
END as surfaceTreatmentDesc,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL
END as zincLayer,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL
END as manufacturer
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
WHERE mc.data_type = 1
AND mc.del_flag = '0'
AND (w.del_flag = '0' OR w.del_flag IS NULL)
and (mc.material_type='成品' or mc.material_type='原料')
and mc.status!=1
<if test="itemType != null and itemType != ''">
AND mc.item_type = #{itemType}
</if>
<if test="itemId != null">
AND mc.item_id = #{itemId}
</if>
GROUP BY mc.item_type, mc.item_id, w.warehouse_id, w.warehouse_name, itemName, itemCode, specification, material,
surfaceTreatmentDesc, zincLayer, manufacturer
ORDER BY mc.item_type, mc.item_id, w.warehouse_id
</select>
<select id="selectVoListWithDynamicJoin" resultType="com.klp.domain.vo.WmsMaterialCoilVo">
SELECT mc.*,
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
ELSE NULL END AS specification,
CASE WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL END AS material,
CASE WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL END AS manufacturer,
CASE WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL END AS zincLayer,
-- 物品名称和编号(用于兼容)
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode,
-- 异常数量统计
COALESCE(ca.abnormal_count, 0) AS abnormalCount
FROM wms_material_coil mc
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN (
SELECT coil_id, COUNT(*) AS abnormal_count
FROM wms_coil_abnormal
WHERE del_flag = 0
GROUP BY coil_id
) ca ON mc.coil_id = ca.coil_id
${ew.customSqlSegment}
</select>
<select id="getDistributionByActualWarehouse" resultType="java.util.Map">
SELECT
w.actual_warehouse_id,
w.actual_warehouse_name,
COUNT(mc.coil_id) as coil_count,
COALESCE(SUM(mc.gross_weight), 0) as total_gross_weight,
COALESCE(SUM(mc.net_weight), 0) as total_net_weight
FROM wms_actual_warehouse w
LEFT JOIN wms_material_coil mc ON w.actual_warehouse_id = mc.actual_warehouse_id
AND mc.data_type = 1
AND mc.del_flag = '0'
and (mc.material_type='成品' or mc.material_type='原料')
and mc.status!=1
WHERE w.del_flag = '0'
<if test="itemType != null and itemType != ''">
AND mc.item_type = #{itemType}
</if>
<if test="itemId != null">
AND mc.item_id = #{itemId}
</if>
GROUP BY w.actual_warehouse_id, w.actual_warehouse_name
ORDER BY w.actual_warehouse_id
</select>
<select id="getDistributionByActualItemType" resultType="java.util.Map">
SELECT
mc.item_type,
mc.item_id,
w.actual_warehouse_id,
w.actual_warehouse_name,
COUNT(mc.coil_id) as coil_count,
COALESCE(SUM(mc.gross_weight), 0) as total_gross_weight,
COALESCE(SUM(mc.net_weight), 0) as total_net_weight,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.specification
WHEN mc.item_type = 'product' THEN p.specification
ELSE NULL
END as specification,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL
END as material,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL
END as surfaceTreatmentDesc,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL
END as zincLayer,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL
END as manufacturer
FROM wms_material_coil mc
LEFT JOIN wms_actual_warehouse w ON mc.actual_warehouse_id = w.actual_warehouse_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
WHERE mc.data_type = 1
AND mc.del_flag = '0'
AND (w.del_flag = '0' OR w.del_flag IS NULL)
and (mc.material_type='成品' or mc.material_type='原料')
and mc.status!=1
<if test="itemType != null and itemType != ''">
AND mc.item_type = #{itemType}
</if>
<if test="itemId != null">
AND mc.item_id = #{itemId}
</if>
GROUP BY mc.item_type, mc.item_id, w.actual_warehouse_id, w.actual_warehouse_name, itemName, itemCode, specification,
material,surfaceTreatmentDesc, zincLayer, manufacturer
ORDER BY mc.item_type, mc.item_id, w.actual_warehouse_id
</select>
<!-- 导出查询:包含所有需要的字段 -->
<select id="selectExportList" resultType="com.klp.domain.vo.WmsMaterialCoilExportVo">
SELECT
-- 类型(中文显示)
CASE
WHEN mc.item_type = 'product' THEN '成品'
WHEN mc.item_type = 'raw_material' THEN '原料'
ELSE mc.item_type
END AS itemTypeDesc,
-- 物品ID
mc.item_id AS itemId,
-- 数据类型
mc.data_type AS dataType,
-- 逻辑库区
w.warehouse_name AS warehouseName,
-- 实际库区
aw.actual_warehouse_name AS actualWarehouseName,
-- 入场卷号
mc.enter_coil_no AS enterCoilNo,
-- 厂家卷号
mc.supplier_coil_no AS supplierCoilNo,
-- 成品卷号
mc.current_coil_no AS currentCoilNo,
-- 日期
mc.create_time AS createTime,
-- 班组
mc.team AS team,
-- 发货时间
mc.export_time AS exportTime,
-- 新增:更新时间(用于发货时间为空时兜底)
mc.update_time AS updateTime,
-- 发货人
mc.export_by AS exportBy,
-- 重量
mc.net_weight AS netWeight,
-- 长度
mc.length AS length,
-- 镀层种类
mc.coating_type AS coatingType,
-- 调制度
mc.temper_grade AS temperGrade,
-- 业务用途
mc.business_purpose AS businessPurpose,
-- 是否与订单相关
mc.is_related_to_order AS isRelatedToOrder,
-- 切边要求
mc.trimming_requirement AS trimmingRequirement,
-- 包装种类
mc.packaging_requirement AS packagingRequirement,
-- 产品状态(直接展示原始值)
mc.quality_status AS qualityStatus,
-- 打包状态(直接展示原始值)
mc.packing_status AS packingStatus,
-- 库存状态(中文显示)
CASE
WHEN mc.status = 0 THEN '在库'
WHEN mc.status = 1 THEN '已发货'
ELSE CAST(mc.status AS CHAR)
END AS statusDesc,
-- 备注
mc.remark AS remark,
-- 名称(根据类型从不同表获取)
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END AS itemName,
-- 规格
CASE
WHEN mc.item_type = 'raw_material' THEN rm.specification
WHEN mc.item_type = 'product' THEN p.specification
ELSE NULL
END AS specification,
-- 材质
CASE
WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL
END AS material,
-- 厂家
CASE
WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL
END AS manufacturer,
-- 表面处理
CASE
WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL
END AS surfaceTreatmentDesc,
-- 锌层
CASE
WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL
END AS zincLayer
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
${ew.customSqlSegment}
</select>
<!-- 发货报表导出:按 coilIds 联查钢卷 + 发货单明细 + 发货单主表 + 发货计划 -->
<select id="selectDeliveryExportListByCoilIds" resultType="com.klp.domain.vo.WmsMaterialCoilDeliveryExportVo">
SELECT
-- 钢卷ID
mc.coil_id AS coilId,
-- 发货人
mc.export_by AS exportBy,
-- 类型(中文显示)
CASE
WHEN mc.item_type = 'product' THEN '成品'
WHEN mc.item_type = 'raw_material' THEN '原料'
ELSE mc.item_type
END AS itemTypeDesc,
mc.item_id AS itemId,
mc.data_type AS dataType,
w.warehouse_name AS warehouseName,
aw.actual_warehouse_name AS actualWarehouseName,
mc.enter_coil_no AS enterCoilNo,
mc.supplier_coil_no AS supplierCoilNo,
mc.current_coil_no AS currentCoilNo,
mc.create_time AS createTime,
mc.export_time AS exportTime,
mc.update_time AS updateTime,
mc.net_weight AS netWeight,
mc.length AS length,
mc.coating_type AS coatingType,
mc.temper_grade AS temperGrade,
mc.business_purpose AS businessPurpose,
mc.is_related_to_order AS isRelatedToOrder,
mc.trimming_requirement AS trimmingRequirement,
mc.packaging_requirement AS packagingRequirement,
mc.quality_status AS qualityStatus,
mc.packing_status AS packingStatus,
CASE
WHEN mc.status = 0 THEN '在库'
WHEN mc.status = 1 THEN '已发货'
ELSE CAST(mc.status AS CHAR)
END AS statusDesc,
mc.remark AS remark,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN pdt.product_name
ELSE NULL
END AS itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.specification
WHEN mc.item_type = 'product' THEN pdt.specification
ELSE NULL
END AS specification,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN pdt.material
ELSE NULL
END AS material,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN pdt.manufacturer
ELSE NULL
END AS manufacturer,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN pdt.surface_treatment_desc
ELSE NULL
END AS surfaceTreatmentDesc,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN pdt.zinc_layer
ELSE NULL
END AS zincLayer,
-- 发货计划
pl.plan_id AS planId,
pl.plan_name AS planName,
pl.plan_date AS planDate,
-- 发货单主表
wb.waybill_id AS waybillId,
wb.waybill_no AS waybillNo,
wb.waybill_name AS waybillName,
wb.license_plate AS licensePlate,
wb.consignee_unit AS consigneeUnit,
wb.sender_unit AS senderUnit,
wb.delivery_time AS deliveryTime,
wb.weighbridge AS weighbridge,
wb.sales_person AS salesPerson,
wb.principal AS principal,
wb.principal_phone AS principalPhone,
wb.status AS waybillStatus,
wb.remark AS waybillRemark,
-- 发货单明细
dtl.detail_id AS detailId,
dtl.product_name AS detailProductName,
dtl.edge_type AS detailEdgeType,
dtl.packaging AS detailPackaging,
dtl.settlement_type AS detailSettlementType,
dtl.raw_material_factory AS detailRawMaterialFactory,
dtl.coil_no AS detailCoilNo,
dtl.specification AS detailSpecification,
dtl.material AS detailMaterial,
dtl.quantity AS detailQuantity,
dtl.weight AS detailWeight,
dtl.unit_price AS detailUnitPrice,
dtl.remark AS detailRemark
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product pdt ON mc.item_type = 'product' AND mc.item_id = pdt.product_id
LEFT JOIN wms_delivery_waybill_detail dtl ON dtl.coil_id = mc.coil_id AND dtl.del_flag = 0
LEFT JOIN wms_delivery_waybill wb ON wb.waybill_id = dtl.waybill_id AND wb.del_flag = 0
LEFT JOIN wms_delivery_plan pl ON pl.plan_id = wb.plan_id AND pl.del_flag = 0
WHERE mc.del_flag = 0
AND mc.coil_id IN
<foreach collection="coilIds" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
ORDER BY mc.create_time DESC
</select>
<!-- 查询重复入场卷号的钢卷信息 -->
<select id="selectDuplicateEnterCoilNoList" resultType="com.klp.domain.vo.WmsMaterialCoilVo">
SELECT mc.*,
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
ELSE NULL END AS specification,
CASE WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL END AS material,
CASE WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL END AS manufacturer,
CASE WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL END AS zincLayer,
-- 物品名称和编号(用于兼容)
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
WHERE mc.data_type = 1
AND mc.del_flag = 0
AND mc.enter_coil_no IN (
SELECT enter_coil_no
FROM wms_material_coil
WHERE data_type = 1
AND del_flag = 0
AND enter_coil_no IS NOT NULL
AND enter_coil_no != ''
GROUP BY enter_coil_no
HAVING COUNT(*) > 1
)
ORDER BY mc.enter_coil_no, mc.create_time
</select>
<!-- 查询重复当前卷号的钢卷信息 -->
<select id="selectDuplicateCurrentCoilNoList" resultType="com.klp.domain.vo.WmsMaterialCoilVo">
SELECT mc.*,
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
ELSE NULL END AS specification,
CASE WHEN mc.item_type = 'raw_material' THEN rm.material
WHEN mc.item_type = 'product' THEN p.material
ELSE NULL END AS material,
CASE WHEN mc.item_type = 'raw_material' THEN rm.manufacturer
WHEN mc.item_type = 'product' THEN p.manufacturer
ELSE NULL END AS manufacturer,
CASE WHEN mc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN mc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN mc.item_type = 'product' THEN p.zinc_layer
ELSE NULL END AS zincLayer,
-- 物品名称和编号(用于兼容)
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN mc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN mc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN mc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id
WHERE mc.data_type = 1
AND mc.del_flag = 0
AND mc.current_coil_no IN (
SELECT current_coil_no
FROM wms_material_coil
WHERE data_type = 1
AND del_flag = 0
AND current_coil_no IS NOT NULL
AND current_coil_no != ''
GROUP BY current_coil_no
HAVING COUNT(*) > 1
)
ORDER BY mc.current_coil_no, mc.create_time
</select>
<!-- 更新钢卷发货撤回:将发货时间置空,状态改为未发货 -->
<update id="updateForWithdrawExport">
UPDATE wms_material_coil
SET export_time = NULL,
status = #{status}
WHERE coil_id = #{coilId}
</update>
<!-- 冷硬卷切边统计:按厚度、宽度、切边要求统计数量和重量 -->
<select id="selectCoilTrimStatistics" resultType="com.klp.domain.vo.dashboard.CoilTrimRawVo">
SELECT
SUBSTRING_INDEX(COALESCE(rm.specification, p.specification), '*', 1) AS thickness,
SUBSTRING_INDEX(COALESCE(rm.specification, p.specification), '*', -1) AS width,
CASE
WHEN mc.trimming_requirement = '净边' THEN '净边'
ELSE '毛边'
END AS trimmingRequirement,
COUNT(mc.coil_id) AS coilCount,
COALESCE(SUM(mc.net_weight), 0) AS totalWeight
FROM wms_material_coil mc
LEFT JOIN wms_raw_material rm ON mc.item_id = rm.raw_material_id AND mc.item_type = 'raw_material'
LEFT JOIN wms_product p ON mc.item_id = p.product_id AND mc.item_type = 'product'
WHERE mc.del_flag = 0
AND mc.data_type = 1
AND mc.status = 0
AND (
rm.raw_material_name LIKE '%冷硬卷%'
OR p.product_name LIKE '%冷硬卷%'
)
GROUP BY thickness, width, trimmingRequirement
ORDER BY thickness, width, trimmingRequirement
</select>
<!-- 类别宽度统计 -->
<select id="selectCategoryWidthStatistics" resultType="com.klp.domain.vo.dashboard.CategoryWidthRawVo">
SELECT
CASE
WHEN rm.raw_material_name LIKE '%热轧卷板%' OR p.product_name LIKE '%热轧卷板%' THEN '热轧卷板'
WHEN rm.raw_material_name LIKE '%冷硬卷%' OR p.product_name LIKE '%冷硬卷%' THEN '冷硬卷'
WHEN rm.raw_material_name LIKE '%冷轧卷%' OR p.product_name LIKE '%冷轧卷%' THEN '冷轧卷'
WHEN rm.raw_material_name LIKE '%镀锌卷%' OR p.product_name LIKE '%镀锌卷%' THEN
CASE
WHEN mc.business_purpose = '毛化镀锌卷' THEN '镀锌钢卷(毛化)'
WHEN mc.business_purpose = '镀锌管料' THEN '镀锌管料'
WHEN mc.business_purpose = '镀锌钢卷' THEN '镀锌钢卷(未光整)'
ELSE '镀锌卷'
END
ELSE '其他'
END AS category,
SUBSTRING_INDEX(COALESCE(rm.specification, p.specification), '*', -1) AS width,
CASE
WHEN mc.trimming_requirement = '净边' THEN '净边'
ELSE '毛边'
END AS isTrimmed,
COALESCE(SUM(mc.net_weight), 0) AS totalWeight
FROM wms_material_coil mc
LEFT JOIN wms_raw_material rm ON mc.item_id = rm.raw_material_id AND mc.item_type = 'raw_material'
LEFT JOIN wms_product p ON mc.item_id = p.product_id AND mc.item_type = 'product'
WHERE mc.del_flag = 0
AND mc.data_type = 1
AND mc.status = 0
AND (
rm.raw_material_name LIKE '%热轧卷板%'
OR p.product_name LIKE '%热轧卷板%'
OR rm.raw_material_name LIKE '%冷硬卷%'
OR p.product_name LIKE '%冷硬卷%'
OR rm.raw_material_name LIKE '%冷轧卷%'
OR p.product_name LIKE '%冷轧卷%'
OR rm.raw_material_name LIKE '%镀锌卷%'
OR p.product_name LIKE '%镀锌卷%'
)
GROUP BY category, width, isTrimmed
ORDER BY category, isTrimmed, width
</select>
</mapper>