Files
klp-oa/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml
2026-01-20 15:20:19 +08:00

2038 lines
99 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.ems.mapper.WmsEnergyCoilDailyMapper">
<resultMap id="WmsEnergyCoilDailyResult" type="com.klp.ems.domain.WmsEnergyCoilDaily">
<result property="energyCostId" column="energy_cost_id"/>
<result property="taskId" column="task_id"/>
<result property="calcDate" column="calc_date"/>
<result property="coilId" column="coil_id"/>
<result property="enterCoilNo" column="enter_coil_no"/>
<result property="currentCoilNo" column="current_coil_no"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="actualWarehouseId" column="actual_warehouse_id"/>
<result property="energyTypeId" column="energy_type_id"/>
<result property="meterId" column="meter_id"/>
<result property="consumptionQty" column="consumption_qty"/>
<result property="costAmount" column="cost_amount"/>
<result property="allocationBasisWeight" column="allocation_basis_weight"/>
<result property="allocationBasisDays" column="allocation_basis_days"/>
<result property="allocationFactor" column="allocation_factor"/>
<result property="remark" column="remark"/>
</resultMap>
<delete id="deleteByTaskId" parameterType="long">
DELETE FROM wms_energy_coil_daily WHERE task_id = #{taskId}
</delete>
<select id="selectListByTask" resultMap="WmsEnergyCoilDailyResult" parameterType="long">
SELECT * FROM wms_energy_coil_daily WHERE task_id = #{taskId}
</select>
<!-- 入场卷号维度能源+囤积成本汇总(分页) -->
<select id="selectCoilTotalMerged" parameterType="map"
resultType="com.klp.ems.domain.vo.CoilTotalCostVo">
SELECT
aid.enter_coil_no AS enterCoilNo,
e.current_coil_no AS currentCoilNo,
e.coil_count AS coilCount,
e.total_duration AS totalDuration,
e.total_consumption AS totalConsumption,
e.energy_cost AS totalEnergyCost,
IFNULL(s.stock_cost, 0) AS stockCost,
IFNULL(x.aux_cost, 0) AS auxCost,
IFNULL(x.spare_cost, 0) AS spareCost,
IFNULL(s.total_net_weight, 0) AS totalNetWeight,
IFNULL(s.total_gross_weight, 0) AS totalGrossWeight,
(IFNULL(e.energy_cost, 0) + IFNULL(s.stock_cost, 0) + IFNULL(x.aux_cost, 0) + IFNULL(x.spare_cost, 0)) AS totalCost
FROM (
SELECT enter_coil_no FROM (
SELECT DISTINCT c.enter_coil_no
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
WHERE pa.action_status IN (0,1,2)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND pa.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
) eids
UNION
SELECT DISTINCT m.enter_coil_no
FROM wms_material_coil m
WHERE m.data_type IN (0,1)
AND m.del_flag = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND m.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND m.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND m.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
) aid
LEFT JOIN (
SELECT
c.enter_coil_no,
MIN(pa.current_coil_no) AS current_coil_no,
COUNT(DISTINCT pa.coil_id) AS coil_count,
SUM(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN CAST(TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
) AS DECIMAL(20,6)) / 60.0
ELSE 0
END
) AS total_duration,
SUM(
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS total_consumption,
SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS energy_cost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND pa.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY c.enter_coil_no
) e ON aid.enter_coil_no = e.enter_coil_no
LEFT JOIN (
SELECT
m.enter_coil_no,
SUM(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
END) AS stock_cost,
SUM(IFNULL(m.net_weight, 0)) AS total_net_weight,
SUM(IFNULL(m.gross_weight, 0)) AS total_gross_weight
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) <![CDATA[<=]]> cs.expire_date)
WHERE m.data_type IN (0,1)
AND m.del_flag = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND m.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND m.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND m.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY m.enter_coil_no
) s ON aid.enter_coil_no = s.enter_coil_no
LEFT JOIN (
SELECT
dm.enter_coil_no,
SUM(
CASE
WHEN dm.total_minutes > 0
THEN IFNULL(a.aux_amount, 0) * (dm.coil_minutes / dm.total_minutes)
ELSE 0
END
) AS aux_cost,
SUM(
CASE
WHEN dm.total_minutes > 0
THEN IFNULL(p.spare_amount, 0) * (dm.coil_minutes / dm.total_minutes)
ELSE 0
END
) AS spare_cost
FROM (
SELECT
DATE(pa.create_time) AS day_key,
c.enter_coil_no,
SUM(
CASE
WHEN pa.create_time < COALESCE(pa.complete_time, NOW())
THEN TIMESTAMPDIFF(MINUTE, pa.create_time, COALESCE(pa.complete_time, NOW()))
ELSE 0
END
) AS coil_minutes,
td.total_minutes
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN (
SELECT
DATE(pa_all.create_time) AS day_key,
SUM(
CASE
WHEN pa_all.create_time < COALESCE(pa_all.complete_time, NOW())
THEN TIMESTAMPDIFF(MINUTE, pa_all.create_time, COALESCE(pa_all.complete_time, NOW()))
ELSE 0
END
) AS total_minutes
FROM wms_coil_pending_action pa_all
WHERE pa_all.action_status IN (0,1,2)
AND pa_all.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND pa_all.create_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa_all.create_time)
) td ON td.day_key = DATE(pa.create_time)
WHERE pa.action_status IN (0,1,2)
AND pa.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND pa.create_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa.create_time), c.enter_coil_no, td.total_minutes
) dm
LEFT JOIN (
SELECT
DATE(change_time) AS day_key,
SUM(IFNULL(amount, 0)) AS aux_amount
FROM eqp_auxiliary_material_change
WHERE del_flag = '0'
AND change_type = '减少'
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND change_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(change_time)
) a ON dm.day_key = a.day_key
LEFT JOIN (
SELECT
DATE(change_time) AS day_key,
SUM(IFNULL(amount, 0)) AS spare_amount
FROM eqp_spare_parts_change
WHERE del_flag = '0'
AND change_type = '减少'
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND change_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(change_time)
) p ON dm.day_key = p.day_key
GROUP BY dm.enter_coil_no
) x ON aid.enter_coil_no = x.enter_coil_no
ORDER BY totalCost DESC
LIMIT #{offset}, #{pageSize}
</select>
<!-- 入场卷号维度能源+囤积成本汇总总数 -->
<select id="selectCoilTotalMergedCount" parameterType="com.klp.ems.domain.bo.CoilTotalCostBo"
resultType="long">
SELECT COUNT(1) FROM (
SELECT DISTINCT c.enter_coil_no
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
WHERE pa.action_status IN (0,1,2)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND pa.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
UNION
SELECT DISTINCT m.enter_coil_no
FROM wms_material_coil m
WHERE m.data_type IN (0,1)
AND m.del_flag = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND m.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND m.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND m.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
) tmp
</select>
<!-- 入场卷号维度能源+囤积成本汇总(导出,全部) -->
<select id="selectCoilTotalMergedExport" parameterType="com.klp.ems.domain.bo.CoilTotalCostBo"
resultType="com.klp.ems.domain.vo.CoilTotalCostVo">
SELECT
aid.enter_coil_no AS enterCoilNo,
e.current_coil_no AS currentCoilNo,
e.coil_count AS coilCount,
e.total_duration AS totalDuration,
e.total_consumption AS totalConsumption,
e.energy_cost AS totalEnergyCost,
IFNULL(s.stock_cost, 0) AS stockCost,
IFNULL(x.aux_cost, 0) AS auxCost,
IFNULL(x.spare_cost, 0) AS spareCost,
IFNULL(s.total_net_weight, 0) AS totalNetWeight,
IFNULL(s.total_gross_weight, 0) AS totalGrossWeight,
(IFNULL(e.energy_cost, 0) + IFNULL(s.stock_cost, 0) + IFNULL(x.aux_cost, 0) + IFNULL(x.spare_cost, 0)) AS totalCost
FROM (
SELECT enter_coil_no FROM (
SELECT DISTINCT c.enter_coil_no
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
WHERE pa.action_status IN (0,1,2)
AND pa.warehouse_id IS NOT NULL
) eids
UNION
SELECT DISTINCT m.enter_coil_no
FROM wms_material_coil m
WHERE m.data_type IN (0,1)
AND m.del_flag = 0
) aid
LEFT JOIN (
SELECT
c.enter_coil_no,
MIN(pa.current_coil_no) AS current_coil_no,
COUNT(DISTINCT pa.coil_id) AS coil_count,
SUM(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN CAST(TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
) AS DECIMAL(20,6)) / 60.0
ELSE 0
END
) AS total_duration,
SUM(
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS total_consumption,
SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS energy_cost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
GROUP BY c.enter_coil_no
) e ON aid.enter_coil_no = e.enter_coil_no
LEFT JOIN (
SELECT
m.enter_coil_no,
SUM(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
END) AS stock_cost,
SUM(IFNULL(m.net_weight, 0)) AS total_net_weight,
SUM(IFNULL(m.gross_weight, 0)) AS total_gross_weight
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) <![CDATA[<=]]> cs.expire_date)
WHERE m.data_type IN (0,1)
AND m.del_flag = 0
GROUP BY m.enter_coil_no
) s ON aid.enter_coil_no = s.enter_coil_no
LEFT JOIN (
SELECT
dm.enter_coil_no,
SUM(
CASE
WHEN dm.total_minutes > 0
THEN IFNULL(a.aux_amount, 0) * (dm.coil_minutes / dm.total_minutes)
ELSE 0
END
) AS aux_cost,
SUM(
CASE
WHEN dm.total_minutes > 0
THEN IFNULL(p.spare_amount, 0) * (dm.coil_minutes / dm.total_minutes)
ELSE 0
END
) AS spare_cost
FROM (
SELECT
DATE(pa.create_time) AS day_key,
c.enter_coil_no,
SUM(
CASE
WHEN pa.create_time < COALESCE(pa.complete_time, NOW())
THEN TIMESTAMPDIFF(MINUTE, pa.create_time, COALESCE(pa.complete_time, NOW()))
ELSE 0
END
) AS coil_minutes,
td.total_minutes
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN (
SELECT
DATE(pa_all.create_time) AS day_key,
SUM(
CASE
WHEN pa_all.create_time < COALESCE(pa_all.complete_time, NOW())
THEN TIMESTAMPDIFF(MINUTE, pa_all.create_time, COALESCE(pa_all.complete_time, NOW()))
ELSE 0
END
) AS total_minutes
FROM wms_coil_pending_action pa_all
WHERE pa_all.action_status IN (0,1,2)
AND pa_all.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND pa_all.create_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa_all.create_time)
) td ON td.day_key = DATE(pa.create_time)
WHERE pa.action_status IN (0,1,2)
AND pa.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND pa.create_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa.create_time), c.enter_coil_no, td.total_minutes
) dm
LEFT JOIN (
SELECT
DATE(change_time) AS day_key,
SUM(IFNULL(amount, 0)) AS aux_amount
FROM eqp_auxiliary_material_change
WHERE del_flag = '0'
AND change_type = '减少'
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND change_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(change_time)
) a ON dm.day_key = a.day_key
LEFT JOIN (
SELECT
DATE(change_time) AS day_key,
SUM(IFNULL(amount, 0)) AS spare_amount
FROM eqp_spare_parts_change
WHERE del_flag = '0'
AND change_type = '减少'
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND change_time <= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(change_time)
) p ON dm.day_key = p.day_key
GROUP BY dm.enter_coil_no
) x ON aid.enter_coil_no = x.enter_coil_no
ORDER BY totalCost DESC
</select>
<!-- 入场卷号维度能源费用汇总 -->
<select id="selectCoilTotalEnergySummary" parameterType="com.klp.ems.domain.bo.CoilTotalCostBo"
resultType="com.klp.ems.domain.vo.CoilTotalCostVo">
SELECT
c.enter_coil_no AS enterCoilNo,
COUNT(DISTINCT pa.coil_id) AS coilCount,
SUM(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN CAST(TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
) AS DECIMAL(20,6)) / 60.0
ELSE 0
END
) AS totalDuration,
SUM(
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS totalConsumption,
SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS totalEnergyCost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN wms_warehouse w ON pa.warehouse_id = w.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND pa.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY c.enter_coil_no
ORDER BY totalEnergyCost DESC
LIMIT 1
</select>
<!-- 入场卷号维度能源费用明细(分页) -->
<select id="selectCoilTotalEnergyDetail" parameterType="com.klp.ems.domain.bo.CoilTotalCostBo"
resultType="com.klp.ems.domain.vo.CoilTotalCostDetailVo">
SELECT
c.enter_coil_no AS enterCoilNo,
pa.coil_id AS coilId,
pa.current_coil_no AS currentCoilNo,
w.warehouse_name AS warehouseName,
pa.warehouse_id AS warehouseId,
pa.action_status AS actionStatus,
pa.create_time AS startTime,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END AS endTime,
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN CAST(TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
) AS DECIMAL(20,6)) / 60.0
ELSE 0
END AS duration,
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS consumption,
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS totalCost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN wms_warehouse w ON pa.warehouse_id = w.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND pa.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
ORDER BY pa.create_time DESC
</select>
<sql id="ReportWhere">
<where>
<if test="bo != null and bo.taskId != null">
AND c.task_id = #{bo.taskId}
</if>
<if test="bo != null and bo.energyTypeId != null">
AND c.energy_type_id = #{bo.energyTypeId}
</if>
<if test="bo != null and bo.meterId != null">
AND c.meter_id = #{bo.meterId}
</if>
<if test="bo != null and bo.warehouseId != null">
AND c.warehouse_id = #{bo.warehouseId}
</if>
<if test="bo != null and bo.actualWarehouseId != null">
AND c.actual_warehouse_id = #{bo.actualWarehouseId}
</if>
<if test="bo != null and bo.startDate != null">
AND c.calc_date <![CDATA[>=]]> #{bo.startDate}
</if>
<if test="bo != null and bo.endDate != null">
AND c.calc_date <![CDATA[<=]]> #{bo.endDate}
</if>
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND c.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
</where>
</sql>
<select id="summaryByEnergyType" parameterType="com.klp.ems.domain.bo.EnergyCostReportBo"
resultType="com.klp.ems.domain.vo.EnergyCostSummaryVo">
SELECT
CAST(c.energy_type_id AS CHAR) AS groupKey,
COALESCE(et.name, CONCAT('能源-', c.energy_type_id)) AS groupName,
c.energy_type_id,
SUM(c.consumption_qty) AS totalConsumption,
SUM(c.cost_amount) AS totalCost,
COUNT(DISTINCT c.coil_id) AS coilCount
FROM wms_energy_coil_daily c
LEFT JOIN ems_energy_type et ON c.energy_type_id = et.energy_type_id
<include refid="ReportWhere"/>
GROUP BY c.energy_type_id
ORDER BY totalCost DESC
</select>
<select id="summaryByWarehouse" parameterType="com.klp.ems.domain.bo.EnergyCostReportBo"
resultType="com.klp.ems.domain.vo.EnergyCostSummaryVo">
SELECT
CAST(c.warehouse_id AS CHAR) AS groupKey,
COALESCE(wh.warehouse_name, CONCAT('库区-', c.warehouse_id)) AS groupName,
c.warehouse_id,
c.actual_warehouse_id,
SUM(c.consumption_qty) AS totalConsumption,
SUM(c.cost_amount) AS totalCost,
COUNT(DISTINCT c.coil_id) AS coilCount
FROM wms_energy_coil_daily c
LEFT JOIN wms_warehouse wh ON c.warehouse_id = wh.warehouse_id
<include refid="ReportWhere"/>
GROUP BY c.warehouse_id, c.actual_warehouse_id
ORDER BY totalCost DESC
</select>
<select id="summaryByMeter" parameterType="com.klp.ems.domain.bo.EnergyCostReportBo"
resultType="com.klp.ems.domain.vo.EnergyCostSummaryVo">
SELECT
CAST(c.meter_id AS CHAR) AS groupKey,
COALESCE(m.meter_code, CONCAT('计量表-', c.meter_id)) AS groupName,
c.meter_id,
c.energy_type_id,
SUM(c.consumption_qty) AS totalConsumption,
SUM(c.cost_amount) AS totalCost,
COUNT(DISTINCT c.coil_id) AS coilCount
FROM wms_energy_coil_daily c
LEFT JOIN ems_meter m ON c.meter_id = m.meter_id
<include refid="ReportWhere"/>
GROUP BY c.meter_id, c.energy_type_id
ORDER BY totalCost DESC
</select>
<select id="summaryByTask" parameterType="com.klp.ems.domain.bo.EnergyCostReportBo"
resultType="com.klp.ems.domain.vo.EnergyCostSummaryVo">
SELECT
CAST(c.task_id AS CHAR) AS groupKey,
CONCAT('任务-', c.task_id) AS groupName,
c.task_id,
c.energy_type_id,
SUM(c.consumption_qty) AS totalConsumption,
SUM(c.cost_amount) AS totalCost,
COUNT(DISTINCT c.coil_id) AS coilCount
FROM wms_energy_coil_daily c
<include refid="ReportWhere"/>
GROUP BY c.task_id, c.energy_type_id
ORDER BY c.task_id DESC
</select>
<select id="selectEnergyOverview" parameterType="com.klp.ems.domain.bo.EnergyCostReportBo"
resultType="java.util.Map">
SELECT
COUNT(DISTINCT c.coil_id) AS coilCount,
SUM(c.consumption_qty) AS totalConsumption,
SUM(c.cost_amount) AS totalCost
FROM wms_energy_coil_daily c
<include refid="ReportWhere"/>
</select>
<!-- 仓库生产统计action_status 0,1 -->
<select id="selectWarehouseProductionStats" parameterType="com.klp.ems.domain.bo.WarehouseProductionBo"
resultType="com.klp.ems.domain.vo.WarehouseProductionStatVo">
SELECT
COUNT(DISTINCT pa.coil_id) AS coilCount,
SUM(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END
) / 60.0 AS totalDuration,
SUM(
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS totalConsumption,
SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS totalCost,
CASE
WHEN COUNT(DISTINCT pa.coil_id) > 0
THEN SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) / COUNT(DISTINCT pa.coil_id)
ELSE 0
END AS unitCost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil mc ON pa.coil_id = mc.coil_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
<if test="bo != null and bo.logicWarehouseId != null">
AND pa_pd.warehouse_id = #{bo.logicWarehouseId}
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa_pd.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa_pd.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.logicWarehouseId != null">
AND pa.warehouse_id = #{bo.logicWarehouseId}
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
</select>
<!-- 仓库生产明细action_status 0,1,2 -->
<select id="selectWarehouseProductionDetail" parameterType="com.klp.ems.domain.bo.WarehouseProductionBo"
resultType="com.klp.ems.domain.vo.WarehouseProductionCoilVo">
SELECT
pa.coil_id AS coilId,
COALESCE(pa.current_coil_no, mc.enter_coil_no) AS coilCode,
pa.create_time AS startTime,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END AS endTime,
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN CAST(TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
) AS DECIMAL(20,6)) / 60.0
ELSE 0
END AS duration,
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS totalCost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil mc ON pa.coil_id = mc.coil_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
<if test="bo != null and bo.logicWarehouseId != null">
AND pa_pd.warehouse_id = #{bo.logicWarehouseId}
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa_pd.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa_pd.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
<if test="bo != null and bo.logicWarehouseId != null">
AND pa.warehouse_id = #{bo.logicWarehouseId}
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
ORDER BY pa.create_time DESC
</select>
<!-- 仓库生产能源分解action_status 0,1 -->
<select id="selectWarehouseProductionEnergyBreakdown" parameterType="com.klp.ems.domain.bo.WarehouseProductionBo"
resultType="com.klp.ems.domain.vo.EnergyBreakdownItemVo">
SELECT
wde.energy_type_id AS energyTypeId,
wde.energy_type_name AS energyTypeName,
wde.energy_unit AS consumptionUnit,
SUM(
CASE
WHEN wde.total_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wde.total_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS consumption,
SUM(
CASE
WHEN wde.total_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wde.total_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS cost
FROM wms_coil_pending_action pa
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCostByEnergy"/>
) wde ON pa.warehouse_id = wde.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
<if test="bo != null and bo.logicWarehouseId != null">
AND pa_pd.warehouse_id = #{bo.logicWarehouseId}
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa_pd.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa_pd.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.action_status IN (0, 1)
AND pa.warehouse_id IS NOT NULL
AND wde.energy_type_id IS NOT NULL
<if test="bo != null and bo.logicWarehouseId != null">
AND pa.warehouse_id = #{bo.logicWarehouseId}
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY wde.energy_type_id, wde.energy_type_name, wde.energy_unit
ORDER BY cost DESC
</select>
<!-- 单卷详情(含分摊能耗、成本) -->
<select id="selectWarehouseProductionCoilDetail" parameterType="long"
resultType="com.klp.ems.domain.vo.WarehouseProductionCoilVo">
SELECT
pa.coil_id AS coilId,
COALESCE(pa.current_coil_no, mc.enter_coil_no) AS coilCode,
mc.enter_coil_no AS enterCoilNo,
pa.current_coil_no AS currentCoilNo,
pa.warehouse_id AS warehouseId,
pa.action_status AS actionStatus,
pa.create_time AS startTime,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END AS endTime,
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN CAST(TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
) AS DECIMAL(20,6)) / 60.0
ELSE 0
END AS duration,
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS consumption,
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time, NOW())
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS totalCost
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil mc ON pa.coil_id = mc.coil_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time, NOW())
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
WHERE pa.coil_id = #{coilId}
LIMIT 1
</select>
<!-- 查询待操作钢卷的能源成本(按钢卷维度聚合,综合所有能源类型) -->
<!-- 查询待操作钢卷的能源成本(按时间段分摊) -->
<sql id="WarehouseMeterTime">
SELECT
base.warehouse_id,
(
SELECT ec_inner.start_time
FROM wms_energy_area_link eal_inner
JOIN ems_meter m_inner ON eal_inner.meter_id = m_inner.meter_id
JOIN ems_energy_consumption ec_inner ON m_inner.meter_id = ec_inner.meter_id
WHERE eal_inner.warehouse_id = base.warehouse_id
AND ec_inner.end_time = base.latest_end_time
ORDER BY ec_inner.start_time DESC
LIMIT 1
) AS warehouse_start_time,
base.latest_end_time AS warehouse_end_time
FROM (
SELECT
eal.warehouse_id,
MAX(ec.end_time) AS latest_end_time
FROM wms_energy_area_link eal
JOIN ems_meter m ON eal.meter_id = m.meter_id
JOIN ems_energy_consumption ec ON m.meter_id = ec.meter_id
WHERE eal.warehouse_id IS NOT NULL
AND ec.end_time IS NOT NULL
GROUP BY eal.warehouse_id
) base
</sql>
<!-- 库区分摊时间范围内的总消耗、总成本(按能源类型拆分,统一费率匹配) -->
<sql id="WarehouseCostByEnergy">
SELECT
wmt.warehouse_id,
et.energy_type_id,
et.name AS energy_type_name,
et.unit AS energy_unit,
SUM(COALESCE(ec.consumption, 0)) AS total_consumption,
SUM(
COALESCE(ec.consumption, 0) *
COALESCE(
CASE
WHEN er.use_peak_valley = 1 AND er.use_tiered_pricing = 1 THEN
COALESCE(tpl.rate, er.rate, 0)
WHEN er.use_peak_valley = 1 THEN
COALESCE(rtpl.rate, er.rate, 0)
WHEN er.use_tiered_pricing = 1 THEN
COALESCE(rt.rate, er.rate, 0)
ELSE COALESCE(er.rate, 0)
END,
0
)
) AS total_cost
FROM (
<include refid="WarehouseMeterTime"/>
) wmt
LEFT JOIN wms_energy_area_link eal ON wmt.warehouse_id = eal.warehouse_id
LEFT JOIN ems_meter m ON eal.meter_id = m.meter_id
LEFT JOIN ems_energy_consumption ec ON m.meter_id = ec.meter_id
AND ec.start_time <![CDATA[>=]]> wmt.warehouse_start_time
AND ec.end_time <![CDATA[<=]]> wmt.warehouse_end_time
LEFT JOIN ems_energy_type et ON m.energy_type_id = et.energy_type_id
LEFT JOIN (
SELECT er1.*
FROM ems_energy_rate er1
WHERE er1.del_flag = '0'
) er ON et.energy_type_id = er.energy_type_id
AND er.effective_date <![CDATA[<=]]> COALESCE(DATE(wmt.warehouse_end_time), CURDATE())
AND (
er.expiry_date IS NULL
OR er.expiry_date <![CDATA[>=]]> COALESCE(DATE(wmt.warehouse_start_time), CURDATE())
)
LEFT JOIN ems_rate_time_period_link rtpl ON er.use_peak_valley = 1
AND er.use_tiered_pricing = 0
AND rtpl.energy_rate_id = er.energy_rate_id
AND rtpl.del_flag = '0'
LEFT JOIN ems_time_period tp ON rtpl.period_id = tp.period_id
AND tp.del_flag = '0'
AND (
(tp.cross_day = 0 AND TIME(ec.end_time) BETWEEN STR_TO_DATE(tp.start_time, '%H:%i') AND STR_TO_DATE(tp.end_time, '%H:%i'))
OR (tp.cross_day = 1 AND (TIME(ec.end_time) <![CDATA[>=]]> STR_TO_DATE(tp.start_time, '%H:%i') OR TIME(ec.end_time) <![CDATA[<=]]> STR_TO_DATE(tp.end_time, '%H:%i')))
)
LEFT JOIN ems_rate_tier rt ON er.use_peak_valley = 0
AND er.use_tiered_pricing = 1
AND rt.energy_rate_id = er.energy_rate_id
AND rt.del_flag = '0'
AND (rt.min_usage IS NULL OR ec.consumption <![CDATA[>=]]> rt.min_usage)
AND (rt.max_usage IS NULL OR ec.consumption <![CDATA[<]]> rt.max_usage)
LEFT JOIN ems_rate_tier rt_combo ON er.use_peak_valley = 1
AND er.use_tiered_pricing = 1
AND rt_combo.energy_rate_id = er.energy_rate_id
AND rt_combo.del_flag = '0'
AND (rt_combo.min_usage IS NULL OR ec.consumption <![CDATA[>=]]> rt_combo.min_usage)
AND (rt_combo.max_usage IS NULL OR ec.consumption <![CDATA[<]]> rt_combo.max_usage)
LEFT JOIN ems_tier_period_link tpl ON er.use_peak_valley = 1
AND er.use_tiered_pricing = 1
AND tpl.tier_id = rt_combo.tier_id
AND tpl.del_flag = '0'
LEFT JOIN ems_time_period tp_combo ON tpl.period_id = tp_combo.period_id
AND tp_combo.del_flag = '0'
AND (
(tp_combo.cross_day = 0 AND TIME(ec.end_time) BETWEEN STR_TO_DATE(tp_combo.start_time, '%H:%i') AND STR_TO_DATE(tp_combo.end_time, '%H:%i'))
OR (tp_combo.cross_day = 1 AND (TIME(ec.end_time) <![CDATA[>=]]> STR_TO_DATE(tp_combo.start_time, '%H:%i') OR TIME(ec.end_time) <![CDATA[<=]]> STR_TO_DATE(tp_combo.end_time, '%H:%i')))
)
WHERE wmt.warehouse_start_time IS NOT NULL
AND wmt.warehouse_end_time IS NOT NULL
GROUP BY wmt.warehouse_id, et.energy_type_id, et.name, et.unit
</sql>
<!-- 库区分摊时间范围内的总消耗、总成本(统一费率匹配) -->
<sql id="WarehouseCost">
SELECT
wmt.warehouse_id,
SUM(COALESCE(ec.consumption, 0)) AS total_warehouse_consumption,
SUM(
COALESCE(ec.consumption, 0) *
COALESCE(
CASE
WHEN er.use_peak_valley = 1 AND er.use_tiered_pricing = 1 THEN
COALESCE(tpl.rate, er.rate, 0)
WHEN er.use_peak_valley = 1 THEN
COALESCE(rtpl.rate, er.rate, 0)
WHEN er.use_tiered_pricing = 1 THEN
COALESCE(rt.rate, er.rate, 0)
ELSE COALESCE(er.rate, 0)
END,
0
)
) AS total_warehouse_cost
FROM (
<include refid="WarehouseMeterTime"/>
) wmt
LEFT JOIN wms_energy_area_link eal ON wmt.warehouse_id = eal.warehouse_id
LEFT JOIN ems_meter m ON eal.meter_id = m.meter_id
LEFT JOIN ems_energy_consumption ec ON m.meter_id = ec.meter_id
AND ec.start_time >= wmt.warehouse_start_time
AND ec.end_time <![CDATA[<=]]> wmt.warehouse_end_time
LEFT JOIN ems_energy_type et ON m.energy_type_id = et.energy_type_id
LEFT JOIN (
SELECT er1.*
FROM ems_energy_rate er1
WHERE er1.del_flag = '0'
) er ON et.energy_type_id = er.energy_type_id
AND er.effective_date <![CDATA[<=]]> COALESCE(DATE(wmt.warehouse_end_time), CURDATE())
AND (er.expiry_date IS NULL OR er.expiry_date >= COALESCE(DATE(wmt.warehouse_start_time), CURDATE()))
LEFT JOIN ems_rate_time_period_link rtpl
ON er.use_peak_valley = 1 AND er.use_tiered_pricing = 0
AND rtpl.energy_rate_id = er.energy_rate_id
AND rtpl.del_flag = '0'
LEFT JOIN ems_time_period tp
ON rtpl.period_id = tp.period_id
AND tp.del_flag = '0'
AND (
(tp.cross_day = 0 AND TIME(ec.end_time) BETWEEN STR_TO_DATE(tp.start_time,'%H:%i') AND STR_TO_DATE(tp.end_time,'%H:%i'))
OR (tp.cross_day = 1 AND (TIME(ec.end_time) >= STR_TO_DATE(tp.start_time,'%H:%i') OR TIME(ec.end_time) <![CDATA[<=]]> STR_TO_DATE(tp.end_time,'%H:%i')))
)
LEFT JOIN ems_rate_tier rt
ON er.use_peak_valley = 0 AND er.use_tiered_pricing = 1
AND rt.energy_rate_id = er.energy_rate_id
AND rt.del_flag = '0'
AND (rt.min_usage IS NULL OR ec.consumption <![CDATA[>=]]> rt.min_usage)
AND (rt.max_usage IS NULL OR ec.consumption <![CDATA[<]]> rt.max_usage)
LEFT JOIN ems_rate_tier rt_combo
ON er.use_peak_valley = 1 AND er.use_tiered_pricing = 1
AND rt_combo.energy_rate_id = er.energy_rate_id
AND rt_combo.del_flag = '0'
AND (rt_combo.min_usage IS NULL OR ec.consumption <![CDATA[>=]]> rt_combo.min_usage)
AND (rt_combo.max_usage IS NULL OR ec.consumption <![CDATA[<]]> rt_combo.max_usage)
LEFT JOIN ems_tier_period_link tpl
ON er.use_peak_valley = 1 AND er.use_tiered_pricing = 1
AND tpl.tier_id = rt_combo.tier_id
AND tpl.del_flag = '0'
LEFT JOIN ems_time_period tp_combo
ON tpl.period_id = tp_combo.period_id
AND tp_combo.del_flag = '0'
AND (
(tp_combo.cross_day = 0 AND TIME(ec.end_time) BETWEEN STR_TO_DATE(tp_combo.start_time,'%H:%i') AND STR_TO_DATE(tp_combo.end_time,'%H:%i'))
OR (tp_combo.cross_day = 1 AND (TIME(ec.end_time) >= STR_TO_DATE(tp_combo.start_time,'%H:%i') OR TIME(ec.end_time) <![CDATA[<=]]> STR_TO_DATE(tp_combo.end_time,'%H:%i')))
)
WHERE wmt.warehouse_start_time IS NOT NULL
AND wmt.warehouse_end_time IS NOT NULL
GROUP BY wmt.warehouse_id
</sql>
<select id="selectPendingActionCoilCost" resultType="com.klp.ems.domain.vo.WmsEnergyCoilDailyVo">
SELECT
pa.coil_id AS coilId,
pa.current_coil_no AS currentCoilNo,
c.enter_coil_no AS enterCoilNo,
pa.warehouse_id AS warehouseId,
wh.warehouse_name AS warehouseName,
pa.create_time AS scanTime,
-- 结束时间:优先使用库区绑定设备的最近一次抄表结束时间,其次使用钢卷自身的完成时间
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END AS completeTime,
-- 生产时长:
-- 1) 若库区有抄表时间,则按 创建时间 ~ min(完成时间, 库区最近抄表结束时间)
-- 2) 若库区无抄表时间,则仅在钢卷有完成时间时按 创建时间 ~ 完成时间
CASE
WHEN pa.create_time <![CDATA[<]]> (CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS productionDuration,
-- 分摊比率:按生产时长占库区总生产时长的比例
CASE
WHEN wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
AND pa.create_time <![CDATA[<]]> (CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END)
THEN CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes
ELSE 0
END AS allocationFactor,
-- 分摊能耗 = 总能耗 * 分摊比率
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS consumptionQty,
-- 分摊成本 = 总成本 * 分摊比率
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN pa.create_time <![CDATA[<]]> (CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
CASE
WHEN pa.complete_time IS NOT NULL THEN pa.complete_time
WHEN wmt.warehouse_end_time IS NOT NULL THEN LEAST(wmt.warehouse_end_time, NOW())
ELSE NOW()
END
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END AS costAmount,
wmt.warehouse_start_time AS latestMeterReadStartTime,
wmt.warehouse_end_time AS latestMeterReadEndTime
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN wms_warehouse wh ON pa.warehouse_id = wh.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time)
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
AND wmt_pd.warehouse_end_time IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
LEFT JOIN (
SELECT
pa_count.warehouse_id,
COUNT(*) AS valid_coil_count
FROM wms_coil_pending_action pa_count
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_count ON pa_count.warehouse_id = wmt_count.warehouse_id
WHERE pa_count.action_status IN (0, 1)
AND pa_count.warehouse_id IS NOT NULL
AND wmt_count.warehouse_end_time IS NOT NULL
AND pa_count.create_time <![CDATA[<]]> COALESCE(pa_count.complete_time, wmt_count.warehouse_end_time)
GROUP BY pa_count.warehouse_id
) wd_count ON pa.warehouse_id = wd_count.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
ORDER BY pa.warehouse_id, pa.create_time DESC
</select>
<!-- 查询待操作钢卷的能源成本统计(按时间段分摊) -->
<select id="selectPendingActionCoilCostStatistics" resultType="com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo">
SELECT
COUNT(CASE WHEN pa.action_status IN (0, 1) THEN 1 END) AS totalCoils,
COUNT(CASE WHEN pa.action_status IN (0, 1, 2) THEN 1 END) AS totalOperationCoils,
AVG(CASE
WHEN wmt.warehouse_end_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time)
AND wd_count.valid_coil_count > 0
THEN CAST(1 AS DECIMAL(20,6)) / wd_count.valid_coil_count
ELSE 0
END) AS avgAllocationFactor,
SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN wmt.warehouse_end_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time)
)
WHEN wmt.warehouse_end_time IS NULL
AND pa.complete_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> pa.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
pa.complete_time
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) AS totalCost,
SUM(CASE
WHEN wmt.warehouse_end_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time)
)
WHEN wmt.warehouse_end_time IS NULL
AND pa.complete_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> pa.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
pa.complete_time
)
ELSE 0
END) AS totalProductionDuration,
CASE
WHEN SUM(
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN wmt.warehouse_end_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time)
)
WHEN wmt.warehouse_end_time IS NULL
AND pa.complete_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> pa.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
pa.complete_time
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) > 0
THEN SUM(
CASE
WHEN wd.total_warehouse_cost IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_cost *
(CAST(
CASE
WHEN wmt.warehouse_end_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time)
)
WHEN wmt.warehouse_end_time IS NULL
AND pa.complete_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> pa.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
pa.complete_time
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
) /
SUM(
CASE
WHEN wd.total_warehouse_consumption IS NOT NULL
AND wd_prod.total_prod_minutes IS NOT NULL
AND wd_prod.total_prod_minutes > 0
THEN wd.total_warehouse_consumption *
(CAST(
CASE
WHEN wmt.warehouse_end_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, wmt.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
COALESCE(pa.complete_time, wmt.warehouse_end_time)
)
WHEN wmt.warehouse_end_time IS NULL
AND pa.complete_time IS NOT NULL
AND pa.create_time <![CDATA[<]]> pa.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa.create_time,
pa.complete_time
)
ELSE 0
END AS DECIMAL(20,6)
) / wd_prod.total_prod_minutes)
ELSE 0
END
)
ELSE 0
END AS avgUnitCost,
MIN(wmt.warehouse_start_time) AS latestMeterReadStartTime,
MAX(wmt.warehouse_end_time) AS latestMeterReadEndTime
FROM wms_coil_pending_action pa
LEFT JOIN wms_material_coil c ON pa.coil_id = c.coil_id
LEFT JOIN wms_warehouse wh ON pa.warehouse_id = wh.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
LEFT JOIN (
<include refid="WarehouseCost"/>
) wd ON pa.warehouse_id = wd.warehouse_id
LEFT JOIN (
SELECT
pa_pd.warehouse_id,
SUM(
CASE
WHEN wmt_pd.warehouse_end_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time)
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
COALESCE(pa_pd.complete_time, wmt_pd.warehouse_end_time)
)
WHEN wmt_pd.warehouse_end_time IS NULL
AND pa_pd.complete_time IS NOT NULL
AND pa_pd.create_time <![CDATA[<]]> pa_pd.complete_time
THEN TIMESTAMPDIFF(MINUTE,
pa_pd.create_time,
pa_pd.complete_time
)
ELSE 0
END
) AS total_prod_minutes
FROM wms_coil_pending_action pa_pd
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_pd ON pa_pd.warehouse_id = wmt_pd.warehouse_id
WHERE pa_pd.action_status IN (0, 1)
AND pa_pd.warehouse_id IS NOT NULL
AND wmt_pd.warehouse_end_time IS NOT NULL
GROUP BY pa_pd.warehouse_id
) wd_prod ON pa.warehouse_id = wd_prod.warehouse_id
LEFT JOIN (
SELECT
pa_count.warehouse_id,
COUNT(*) AS valid_coil_count
FROM wms_coil_pending_action pa_count
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt_count ON pa_count.warehouse_id = wmt_count.warehouse_id
WHERE pa_count.action_status IN (0, 1)
AND pa_count.warehouse_id IS NOT NULL
AND wmt_count.warehouse_end_time IS NOT NULL
AND pa_count.create_time <![CDATA[<]]> COALESCE(pa_count.complete_time, wmt_count.warehouse_end_time)
GROUP BY pa_count.warehouse_id
) wd_count ON pa.warehouse_id = wd_count.warehouse_id
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
<if test="enterCoilNo != null and enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{enterCoilNo}, '%')
</if>
<if test="currentCoilNo != null and currentCoilNo != ''">
AND pa.current_coil_no LIKE CONCAT('%', #{currentCoilNo}, '%')
</if>
<if test="warehouseId != null">
AND pa.warehouse_id = #{warehouseId}
</if>
</select>
<select id="selectReportDetail" resultType="com.klp.ems.domain.vo.WmsEnergyCoilDailyVo">
SELECT
c.energy_cost_id AS energyCostId,
c.task_id AS taskId,
c.calc_date AS calcDate,
c.coil_id AS coilId,
c.enter_coil_no AS enterCoilNo,
c.current_coil_no AS currentCoilNo,
c.warehouse_id AS warehouseId,
c.actual_warehouse_id AS actualWarehouseId,
c.energy_type_id AS energyTypeId,
c.meter_id AS meterId,
c.consumption_qty AS consumptionQty,
c.cost_amount AS costAmount,
c.allocation_basis_weight AS allocationBasisWeight,
c.allocation_basis_days AS allocationBasisDays,
c.allocation_factor AS allocationFactor,
c.remark AS remark
FROM wms_energy_coil_daily c
<where>
<if test="bo != null and bo.taskId != null">
AND c.task_id = #{bo.taskId}
</if>
<if test="bo != null and bo.energyTypeId != null">
AND c.energy_type_id = #{bo.energyTypeId}
</if>
<if test="bo != null and bo.meterId != null">
AND c.meter_id = #{bo.meterId}
</if>
<if test="bo != null and bo.warehouseId != null">
AND c.warehouse_id = #{bo.warehouseId}
</if>
<if test="bo != null and bo.actualWarehouseId != null">
AND c.actual_warehouse_id = #{bo.actualWarehouseId}
</if>
<if test="bo != null and bo.startDate != null">
AND c.calc_date <![CDATA[>=]]> #{bo.startDate}
</if>
<if test="bo != null and bo.endDate != null">
AND c.calc_date <![CDATA[<=]]> #{bo.endDate}
</if>
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND c.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
</where>
ORDER BY c.calc_date DESC, c.energy_cost_id DESC
</select>
</mapper>