Files
klp-oa/klp-wms/src/main/resources/mapper/klp/WmsCostCoilDailyMapper.xml
2026-01-27 16:54:46 +08:00

567 lines
23 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.WmsCostCoilDailyMapper">
<resultMap type="com.klp.domain.WmsCostCoilDaily" id="CostCoilDailyResult">
<result property="costId" column="cost_id"/>
<result property="coilId" column="coil_id"/>
<result property="currentCoilNo" column="current_coil_no"/>
<result property="calcDate" column="calc_date"/>
<result property="netWeight" column="net_weight"/>
<result property="unitCost" column="unit_cost"/>
<result property="dailyCost" column="daily_cost"/>
<result property="storageDays" column="storage_days"/>
<result property="totalCost" column="total_cost"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="itemType" column="item_type"/>
<result property="materialType" column="material_type"/>
<result property="createTime" column="create_time"/>
</resultMap>
<resultMap type="com.klp.domain.vo.WmsCostCoilDailyVo" id="CostCoilDailyVoResult">
<result property="costId" column="cost_id"/>
<result property="coilId" column="coil_id"/>
<result property="currentCoilNo" column="current_coil_no"/>
<result property="calcDate" column="calc_date"/>
<result property="netWeight" column="net_weight"/>
<result property="unitCost" column="unit_cost"/>
<result property="dailyCost" column="daily_cost"/>
<result property="storageDays" column="storage_days"/>
<result property="totalCost" column="total_cost"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="warehouseName" column="warehouse_name"/>
<result property="itemType" column="item_type"/>
<result property="materialType" column="material_type"/>
</resultMap>
<!-- 自定义查询,关联库区名称 -->
<select id="selectVoPage" resultType="com.klp.domain.vo.WmsCostCoilDailyVo">
SELECT
ccd.cost_id,
ccd.coil_id,
ccd.current_coil_no,
ccd.calc_date,
ccd.net_weight,
ccd.unit_cost,
ccd.daily_cost,
ccd.storage_days,
ccd.total_cost,
ccd.warehouse_id,
w.warehouse_name,
ccd.item_type,
ccd.material_type
FROM wms_cost_coil_daily ccd
LEFT JOIN wms_warehouse w ON ccd.warehouse_id = w.warehouse_id AND w.del_flag = 0
${ew.customSqlSegment}
</select>
<select id="selectVoList" resultType="com.klp.domain.vo.WmsCostCoilDailyVo">
SELECT
ccd.cost_id,
ccd.coil_id,
ccd.current_coil_no,
ccd.calc_date,
ccd.net_weight,
ccd.unit_cost,
ccd.daily_cost,
ccd.storage_days,
ccd.total_cost,
ccd.warehouse_id,
w.warehouse_name,
ccd.item_type,
ccd.material_type
FROM wms_cost_coil_daily ccd
LEFT JOIN wms_warehouse w ON ccd.warehouse_id = w.warehouse_id AND w.del_flag = 0
${ew.customSqlSegment}
</select>
<select id="selectVoById" resultType="com.klp.domain.vo.WmsCostCoilDailyVo">
SELECT
ccd.cost_id,
ccd.coil_id,
ccd.current_coil_no,
ccd.calc_date,
ccd.net_weight,
ccd.unit_cost,
ccd.daily_cost,
ccd.storage_days,
ccd.total_cost,
ccd.warehouse_id,
w.warehouse_name,
ccd.item_type,
ccd.material_type
FROM wms_cost_coil_daily ccd
LEFT JOIN wms_warehouse w ON ccd.warehouse_id = w.warehouse_id AND w.del_flag = 0
WHERE ccd.cost_id = #{costId}
</select>
<!-- 查询成本统计汇总(基于当前 wms_material_coil 快照) -->
<select id="selectCostSummary" resultType="java.util.HashMap">
SELECT
COUNT(*) AS totalCoils,
SUM(t.net_weight_ton) AS totalNetWeight,
SUM(t.gross_weight_ton) AS totalGrossWeight,
SUM(t.total_cost_amount) AS totalCost,
AVG(t.storage_days) AS avgStorageDays,
SUM(t.daily_cost_amount) AS totalDailyCost
FROM (
SELECT
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
(DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1) AS storage_days,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) > 0 THEN m.net_weight
ELSE IFNULL(m.gross_weight, 0)
END
) * cs.unit_cost
END AS daily_cost_amount,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) = 0 AND IFNULL(m.gross_weight, 0) > 0 THEN m.gross_weight
ELSE IFNULL(m.net_weight, 0)
END
) * cs.unit_cost * (DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1)
END AS total_cost_amount
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
WHERE m.data_type = 1
AND m.del_flag = 0
and m.status = 0
AND m.export_time IS NULL
<if test="warehouseId != null">
AND m.warehouse_id = #{warehouseId}
</if>
<if test="itemType != null and itemType != ''">
AND m.item_type = #{itemType}
</if>
<if test="materialType != null and materialType != ''">
AND m.material_type = #{materialType}
</if>
) t
</select>
<!-- 按库区统计成本(基于当前 wms_material_coil 快照) -->
<select id="selectCostByWarehouse" resultType="java.util.HashMap">
SELECT
t.warehouse_id AS warehouseId,
COALESCE(w.warehouse_name, '-') AS warehouseName,
COUNT(*) AS coilCount,
SUM(t.total_cost_amount) AS totalCost,
AVG(t.storage_days) AS avgStorageDays,
SUM(t.net_weight_ton) AS totalNetWeight,
SUM(t.gross_weight_ton) AS totalGrossWeight
FROM (
SELECT
m.coil_id,
m.warehouse_id,
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
(DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1) AS storage_days,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) = 0 AND IFNULL(m.gross_weight, 0) > 0 THEN m.gross_weight
ELSE IFNULL(m.net_weight, 0)
END
) * cs.unit_cost * (DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1)
END AS total_cost_amount
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
WHERE m.data_type = 1
AND m.del_flag = 0
AND m.export_time IS NULL
) t
LEFT JOIN wms_warehouse w ON t.warehouse_id = w.warehouse_id
GROUP BY t.warehouse_id, w.warehouse_name
ORDER BY totalCost DESC
</select>
<!-- 按物品类型统计成本(基于当前 wms_material_coil 快照) -->
<select id="selectCostByItemType" resultType="java.util.HashMap">
SELECT
t.item_type AS itemType,
COUNT(*) AS coilCount,
SUM(t.total_cost_amount) AS totalCost,
AVG(t.storage_days) AS avgStorageDays,
SUM(t.net_weight_ton) AS totalNetWeight,
SUM(t.gross_weight_ton) AS totalGrossWeight
FROM (
SELECT
m.coil_id,
m.item_type,
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
(DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1) AS storage_days,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) = 0 AND IFNULL(m.gross_weight, 0) > 0 THEN m.gross_weight
ELSE IFNULL(m.net_weight, 0)
END
) * cs.unit_cost * (DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1)
END AS total_cost_amount
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
WHERE m.data_type = 1
AND m.del_flag = 0
AND m.export_time IS NULL
) t
GROUP BY t.item_type
ORDER BY totalCost DESC
</select>
<!-- 检查指定日期和钢卷的成本记录是否存在 -->
<select id="countByCoilIdAndDate" resultType="int">
SELECT COUNT(1)
FROM wms_cost_coil_daily
WHERE coil_id = #{coilId}
AND calc_date = #{calcDate}
</select>
<!-- 按入场钢卷号统计成本 -->
<!-- 虽然方法名仍然包含 EnterCoilNo但统计口径已统一为“当前钢卷号current_coil_no-->
<select id="selectCostByEnterCoilNo" resultType="java.util.HashMap">
SELECT
mc.current_coil_no AS currentCoilNo,
COUNT(DISTINCT mc.coil_id) AS coilCount,
COUNT(DISTINCT CASE WHEN mc.export_time IS NULL THEN mc.coil_id END) AS unshippedCount,
COUNT(DISTINCT CASE WHEN mc.export_time IS NOT NULL THEN mc.coil_id END) AS shippedCount,
SUM(ccd.total_cost) AS totalCost,
SUM(ccd.net_weight) AS totalNetWeight,
AVG(ccd.storage_days) AS avgStorageDays,
MAX(ccd.calc_date) AS lastCalcDate
FROM wms_cost_coil_daily ccd
INNER JOIN wms_material_coil mc ON ccd.coil_id = mc.coil_id
WHERE ccd.calc_date BETWEEN #{startDate} AND #{endDate}
AND mc.data_type = 1
AND mc.del_flag = 0
<if test="enterCoilNo != null and enterCoilNo != ''">
AND mc.current_coil_no = #{enterCoilNo}
</if>
GROUP BY mc.current_coil_no
ORDER BY totalCost DESC
</select>
<!-- 囤积成本(按当前钢卷号聚合)列表 -->
<select id="selectStockpileByEnterCoilNo" resultType="java.util.HashMap">
SELECT
t.current_coil_no AS currentCoilNo,
COUNT(*) AS coilCount,
SUM(t.net_weight_ton) AS totalNetWeight,
SUM(t.gross_weight_ton) AS totalGrossWeight,
SUM(t.cost_amount) AS totalCost,
AVG(t.storage_days) AS avgStorageDays,
MAX(t.storage_days) AS maxStorageDays,
MAX(CASE WHEN IFNULL(t.net_weight_ton, 0) = 0 THEN 1 ELSE 0 END) AS hasNetWeightZero
FROM (
SELECT
m.current_coil_no,
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) = 0 AND IFNULL(m.gross_weight, 0) > 0 THEN m.gross_weight
ELSE IFNULL(m.net_weight, 0)
END
) * cs.unit_cost * (DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1)
END AS cost_amount,
(DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1) AS storage_days
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
WHERE m.data_type = 1
AND m.del_flag = 0
AND m.export_time IS NULL
<if test="enterCoilNo != null and enterCoilNo != ''">
AND m.current_coil_no LIKE CONCAT(#{enterCoilNo}, '%')
</if>
) t
GROUP BY t.current_coil_no
ORDER BY t.current_coil_no DESC
LIMIT #{offset}, #{pageSize}
</select>
<!-- 囤积成本(按当前钢卷号聚合)列表总数 -->
<select id="countStockpileByEnterCoilNo" resultType="long">
SELECT
COUNT(*) AS cnt
FROM (
SELECT m.current_coil_no
FROM wms_material_coil m
WHERE m.data_type = 1
AND m.del_flag = 0
and m.status = 0
AND m.export_time IS NULL
<if test="enterCoilNo != null and enterCoilNo != ''">
AND m.current_coil_no LIKE CONCAT(#{enterCoilNo}, '%')
</if>
GROUP BY m.current_coil_no
) t
</select>
<!-- 囤积成本(按当前钢卷号聚合)汇总 -->
<select id="selectStockpileSummaryByEnterCoilNo" resultType="java.util.HashMap">
SELECT
SUM(t.net_weight_ton) AS totalNetWeight,
SUM(t.gross_weight_ton) AS totalGrossWeight,
SUM(t.cost_amount) AS totalCost,
AVG(t.storage_days) AS avgStorageDays,
SUM(t.today_cost_amount) AS todayCost
FROM (
SELECT
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) > 0 THEN m.net_weight
ELSE IFNULL(m.gross_weight, 0)
END
) * cs.unit_cost * (DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1)
END AS cost_amount,
CASE
WHEN m.status = 0 THEN (
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) > 0 THEN m.net_weight
ELSE IFNULL(m.gross_weight, 0)
END
) * cs.unit_cost
END
)
ELSE 0
END AS today_cost_amount,
(DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1) AS storage_days
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
WHERE m.data_type = 1
AND m.del_flag = 0
and m.status = 0
AND m.export_time IS NULL
<if test="enterCoilNo != null and enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT(#{enterCoilNo}, '%')
</if>
) t
</select>
<select id="selectOverviewFromMaterialCoil" resultType="java.util.HashMap">
SELECT
COUNT(*) AS totalCoils,
SUM(t.net_weight_ton) AS totalNetWeight,
SUM(t.gross_weight_ton) AS totalGrossWeight,
AVG(t.storage_days) AS avgStorageDays,
SUM(t.cost_amount) AS totalCost,
SUM(t.today_cost_amount) AS todayCost
FROM (
SELECT
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
(DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1) AS storage_days,
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) > 0 THEN m.gross_weight
ELSE IFNULL(m.gross_weight, 0)
END
) * cs.unit_cost * (DATEDIFF(CURDATE(), IFNULL(m.create_time, CURDATE())) + 1)
END AS cost_amount,
CASE
WHEN m.status = 0 THEN (
CASE
WHEN cs.unit_cost IS NULL THEN 0
ELSE (
CASE
WHEN IFNULL(m.net_weight, 0) > 0 THEN m.net_weight
ELSE IFNULL(m.gross_weight, 0)
END
) * cs.unit_cost
END
)
ELSE 0
END AS today_cost_amount
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
WHERE m.data_type = 1
AND m.del_flag = 0
AND m.status = 0
AND m.export_time IS NULL
) t
</select>
<!-- 成本趋势(按日统计 wms_cost_coil_daily -->
<select id="selectCostTrend" resultType="java.util.HashMap">
SELECT
ccd.calc_date AS date,
SUM(ccd.total_cost) AS totalCost,
SUM(ccd.net_weight) AS totalNetWeight,
SUM(ccd.daily_cost) AS totalDailyCost,
COUNT(*) AS coilCount
FROM wms_cost_coil_daily ccd
WHERE 1 = 1
<if test="startDate != null">
AND ccd.calc_date &gt;= #{startDate}
</if>
<if test="endDate != null">
AND ccd.calc_date &lt;= #{endDate}
</if>
GROUP BY ccd.calc_date
ORDER BY ccd.calc_date
</select>
<!-- ==================== 成本检索(实时计算) ==================== -->
<sql id="MaterialCoilCostBase">
SELECT
m.enter_coil_no,
m.coil_id,
m.current_coil_no,
IFNULL(m.net_weight, 0) AS net_weight_ton,
IFNULL(m.gross_weight, 0) AS gross_weight_ton,
CASE
WHEN IFNULL(m.gross_weight, 0) > 0 THEN 'gross'
ELSE 'net'
END AS weight_basis,
CASE
WHEN IFNULL(m.net_weight, 0) = 0 AND IFNULL(m.gross_weight, 0) > 0 THEN m.gross_weight
ELSE IFNULL(m.net_weight, 0)
END AS charge_weight_ton,
DATE(m.create_time) AS start_date,
CASE
WHEN m.export_time IS NOT NULL THEN DATE_SUB(DATE(m.export_time), INTERVAL 1 DAY)
WHEN #{calcDate} IS NOT NULL THEN #{calcDate}
ELSE CURDATE()
END AS raw_end_date,
CASE
WHEN m.export_time IS NULL THEN 0
ELSE 1
END AS is_shipped,
IFNULL(cs.unit_cost, 0) AS unit_cost,
m.warehouse_id,
COALESCE(w.warehouse_name, '-') AS warehouse_name
FROM wms_material_coil m
LEFT JOIN wms_cost_standard_config cs
ON cs.status = 1
AND DATE(m.create_time) >= cs.effective_date
AND (cs.expire_date IS NULL OR DATE(m.create_time) &lt;= cs.expire_date)
LEFT JOIN wms_warehouse w ON w.warehouse_id = m.warehouse_id AND w.del_flag = 0
WHERE m.data_type = 1
AND m.del_flag = 0
AND m.enter_coil_no IS NOT NULL
<if test="enterCoilNo != null and enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT(#{enterCoilNo}, '%')
</if>
</sql>
<sql id="MaterialCoilCostCalc">
SELECT
base.*,
CASE
WHEN base.raw_end_date &lt; base.start_date THEN base.start_date
ELSE base.raw_end_date
END AS end_date,
CASE
WHEN DATEDIFF(
CASE
WHEN base.raw_end_date &lt; base.start_date THEN base.start_date
ELSE base.raw_end_date
END,
base.start_date
) &lt; 0 THEN 1
ELSE DATEDIFF(
CASE
WHEN base.raw_end_date &lt; base.start_date THEN base.start_date
ELSE base.raw_end_date
END,
base.start_date
) + 1
END AS storage_days
FROM (
<include refid="MaterialCoilCostBase"/>
) base
</sql>
<select id="selectMaterialCostSummary" resultType="java.util.HashMap">
SELECT
COUNT(*) AS totalCoils,
IFNULL(SUM(calc_data.net_weight_ton), 0) AS totalNetWeight,
IFNULL(SUM(calc_data.gross_weight_ton), 0) AS totalGrossWeight,
IFNULL(SUM(calc_data.charge_weight_ton * calc_data.unit_cost * calc_data.storage_days), 0) AS totalCost,
IFNULL(AVG(calc_data.storage_days), 0) AS avgStorageDays,
IFNULL(SUM(CASE WHEN calc_data.is_shipped = 1 THEN 1 ELSE 0 END), 0) AS shippedCount,
IFNULL(SUM(CASE WHEN calc_data.is_shipped = 0 THEN 1 ELSE 0 END), 0) AS unshippedCount
FROM (
<include refid="MaterialCoilCostCalc"/>
) calc_data
</select>
<select id="countMaterialCostCards" resultType="long">
SELECT COUNT(1)
FROM (
<include refid="MaterialCoilCostCalc"/>
) calc_data
</select>
<select id="selectMaterialCostCards" resultType="java.util.HashMap">
SELECT
calc_data.enter_coil_no AS enterCoilNo,
calc_data.coil_id AS coilId,
calc_data.current_coil_no AS currentCoilNo,
calc_data.net_weight_ton AS netWeightTon,
calc_data.gross_weight_ton AS grossWeightTon,
calc_data.weight_basis AS weightBasis,
calc_data.storage_days AS storageDays,
ROUND(calc_data.unit_cost, 2) AS unitCost,
ROUND(calc_data.charge_weight_ton * calc_data.unit_cost, 2) AS dailyCost,
ROUND(calc_data.charge_weight_ton * calc_data.unit_cost * calc_data.storage_days, 2) AS totalCost,
calc_data.is_shipped AS isShipped,
calc_data.start_date AS startDate,
calc_data.end_date AS endDate,
calc_data.warehouse_id AS warehouseId,
calc_data.warehouse_name AS warehouseName
FROM (
<include refid="MaterialCoilCostCalc"/>
) calc_data
ORDER BY calc_data.start_date DESC, calc_data.current_coil_no DESC
LIMIT #{offset}, #{pageSize}
</select>
<!-- 删除指定日期的成本记录 -->
<delete id="deleteByCalcDate">
DELETE FROM wms_cost_coil_daily
WHERE calc_date = #{calcDate}
</delete>
</mapper>