l3能源成本分摊(部分完成留存)

This commit is contained in:
2025-12-07 17:23:47 +08:00
parent b6328a94da
commit 59951b77c3
100 changed files with 14350 additions and 847 deletions

View File

@@ -0,0 +1,13 @@
<?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.CostCoilDailyMapper">
<update id="updateEnergyCost" parameterType="com.klp.ems.domain.CostCoilDailyEnergy">
UPDATE wms_cost_coil_daily
SET energy_cost_amount = #{energyCostAmount},
energy_cost_breakdown = #{energyCostBreakdown}
WHERE coil_id = #{coilId}
AND calc_date = #{calcDate}
</update>
</mapper>

View File

@@ -101,4 +101,66 @@
</if>
</select>
<select id="selectLatestBefore" resultMap="EmsEnergyConsumptionResult">
SELECT *
FROM ems_energy_consumption
WHERE meter_id = #{meterId}
AND end_time &lt;= #{endTime}
ORDER BY end_time DESC
LIMIT 1
</select>
<select id="selectOverlapRange" resultMap="EmsEnergyConsumptionResult">
SELECT *
FROM ems_energy_consumption
WHERE meter_id = #{meterId}
AND end_time &gt;= #{startTime}
AND start_time &lt;= #{endTime}
ORDER BY start_time ASC
</select>
<select id="selectCoveringRange" resultMap="EmsEnergyConsumptionResult">
SELECT *
FROM ems_energy_consumption
WHERE meter_id = #{meterId}
AND start_time &lt;= #{startTime}
AND end_time &gt;= #{endTime}
ORDER BY start_time ASC
LIMIT 1
</select>
<select id="selectLatestTwoReadings" resultMap="EmsEnergyConsumptionResult">
SELECT *
FROM ems_energy_consumption
WHERE meter_id = #{meterId}
ORDER BY end_time DESC
LIMIT 2
</select>
<!-- 统计查询 -->
<select id="getStatistics" parameterType="com.klp.ems.domain.bo.EmsEnergyConsumptionBo" resultType="java.util.Map">
SELECT
COUNT(*) AS totalCount,
IFNULL(SUM(consumption), 0) AS totalConsumption,
IFNULL(AVG(consumption), 0) AS avgConsumption,
IFNULL(MAX(consumption), 0) AS maxConsumption,
IFNULL(MIN(consumption), 0) AS minConsumption
FROM ems_energy_consumption
WHERE 1=1
<if test="meterId != null">
AND meter_id = #{meterId}
</if>
<if test="energyTypeId != null">
AND meter_id IN (
SELECT meter_id FROM ems_meter WHERE energy_type_id = #{energyTypeId}
)
</if>
<if test="startTime != null">
AND start_time &gt;= #{startTime}
</if>
<if test="endTime != null">
AND end_time &lt;= #{endTime}
</if>
</select>
</mapper>

View File

@@ -11,6 +11,8 @@
<result property="currency" column="currency"/>
<result property="effectiveDate" column="effective_date"/>
<result property="expiryDate" column="expiry_date"/>
<result property="usePeakValley" column="use_peak_valley"/>
<result property="useTieredPricing" column="use_tiered_pricing"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
<result property="createTime" column="create_time"/>
@@ -19,5 +21,69 @@
<result property="remark" column="remark"/>
</resultMap>
<resultMap type="com.klp.ems.domain.vo.EmsEnergyRateVo" id="EmsEnergyRateVoResult">
<result property="energyRateId" column="energy_rate_id"/>
<result property="energyTypeId" column="energy_type_id"/>
<result property="rate" column="rate"/>
<result property="currency" column="currency"/>
<result property="effectiveDate" column="effective_date"/>
<result property="expiryDate" column="expiry_date"/>
<result property="usePeakValley" column="use_peak_valley"/>
<result property="useTieredPricing" column="use_tiered_pricing"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="remark" column="remark"/>
</resultMap>
<select id="selectEffectiveRate" parameterType="map" resultMap="EmsEnergyRateResult">
SELECT *
FROM ems_energy_rate
WHERE energy_type_id = #{energyTypeId}
AND del_flag = '0'
AND effective_date &lt;= #{calcDate}
AND (expiry_date IS NULL OR expiry_date &gt;= #{calcDate})
ORDER BY effective_date DESC
LIMIT 1
</select>
<!-- 查询费率列表(包含梯度和时段信息) -->
<select id="selectVoList" resultMap="EmsEnergyRateVoResult">
SELECT DISTINCT
er.energy_rate_id,
er.energy_type_id,
er.rate,
er.currency,
er.effective_date,
er.expiry_date,
er.use_peak_valley,
er.use_tiered_pricing,
er.create_by,
er.update_by,
er.create_time,
er.update_time,
er.del_flag,
er.remark
FROM ems_energy_rate er
WHERE er.del_flag = '0'
<if test="energyTypeId != null">
AND er.energy_type_id = #{energyTypeId}
</if>
<if test="rate != null">
AND er.rate = #{rate}
</if>
<if test="currency != null">
AND er.currency = #{currency}
</if>
<if test="effectiveDate != null">
AND er.effective_date = #{effectiveDate}
</if>
<if test="expiryDate != null">
AND er.expiry_date = #{expiryDate}
</if>
ORDER BY er.create_time DESC
</select>
</mapper>

View File

@@ -23,6 +23,56 @@
<result property="remark" column="remark"/>
</resultMap>
<resultMap type="com.klp.ems.domain.vo.EmsMeterVo" id="EmsMeterVoResult">
<result property="meterId" column="meter_id"/>
<result property="meterCode" column="meter_code"/>
<result property="energyTypeId" column="energy_type_id"/>
<result property="locationId" column="location_id"/>
<result property="model" column="model"/>
<result property="manufacturer" column="manufacturer"/>
<result property="installDate" column="install_date"/>
<result property="status" column="status"/>
<result property="lastCalibrationDate" column="last_calibration_date"/>
<result property="thresholdValue" column="threshold_value"/>
<result property="remark" column="remark"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="warehouseName" column="warehouse_name"/>
</resultMap>
<!-- 查询设备列表,包含库区信息 -->
<select id="selectVoList" resultMap="EmsMeterVoResult">
SELECT
m.meter_id,
m.meter_code,
m.energy_type_id,
m.location_id,
m.model,
m.manufacturer,
m.install_date,
m.status,
m.last_calibration_date,
m.threshold_value,
m.remark,
COALESCE(w.warehouse_id, 0) as warehouse_id,
COALESCE(w.warehouse_name, '') as warehouse_name
FROM ems_meter m
LEFT JOIN wms_energy_area_link l ON m.meter_id = l.meter_id AND l.is_enabled = 1
LEFT JOIN wms_warehouse w ON l.warehouse_id = w.warehouse_id
WHERE m.del_flag = '0'
<if test="meterId != null">
AND m.meter_id = #{meterId}
</if>
<if test="meterCode != null and meterCode != ''">
AND m.meter_code LIKE CONCAT('%', #{meterCode}, '%')
</if>
<if test="energyTypeId != null">
AND m.energy_type_id = #{energyTypeId}
</if>
<if test="status != null">
AND m.status = #{status}
</if>
</select>
<select id="selectMeterIds" parameterType="com.klp.ems.domain.bo.MeterFilterBo" resultType="java.lang.Long">
SELECT meter_id
FROM ems_meter

View File

@@ -0,0 +1,41 @@
<?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.EmsRateTierMapper">
<resultMap type="com.klp.ems.domain.EmsRateTier" id="EmsRateTierResult">
<result property="tierId" column="tier_id"/>
<result property="energyRateId" column="energy_rate_id"/>
<result property="tierLevel" column="tier_level"/>
<result property="minUsage" column="min_usage"/>
<result property="maxUsage" column="max_usage"/>
<result property="rate" column="rate"/>
<result property="delFlag" column="del_flag"/>
<result property="remark" column="remark"/>
</resultMap>
<resultMap type="com.klp.ems.domain.vo.EmsRateTierVo" id="EmsRateTierVoResult">
<result property="tierId" column="tier_id"/>
<result property="energyRateId" column="energy_rate_id"/>
<result property="tierLevel" column="tier_level"/>
<result property="minUsage" column="min_usage"/>
<result property="maxUsage" column="max_usage"/>
<result property="rate" column="rate"/>
<result property="remark" column="remark"/>
</resultMap>
<select id="selectByRateId" parameterType="java.lang.Long" resultMap="EmsRateTierVoResult">
SELECT * FROM ems_rate_tier
WHERE energy_rate_id = #{energyRateId}
AND del_flag = '0'
ORDER BY tier_level ASC
</select>
<!-- 物理删除指定费率的所有梯度 -->
<delete id="deleteByRateIdPhysical" parameterType="java.lang.Long">
DELETE FROM ems_rate_tier
WHERE energy_rate_id = #{energyRateId}
</delete>
</mapper>

View File

@@ -0,0 +1,105 @@
<?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.EmsRateTierPeriodLinkMapper">
<resultMap type="com.klp.ems.domain.EmsRateTierPeriodLink" id="EmsRateTierPeriodLinkResult">
<result property="linkId" column="link_id"/>
<result property="tierId" column="tier_id"/>
<result property="periodId" column="period_id"/>
<result property="rate" column="rate"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="remark" column="remark"/>
</resultMap>
<resultMap type="com.klp.ems.domain.vo.EmsRateTierPeriodLinkVo" id="EmsRateTierPeriodLinkVoResult">
<result property="linkId" column="link_id"/>
<result property="tierId" column="tier_id"/>
<result property="tierLevel" column="tier_level"/>
<result property="minUsage" column="min_usage"/>
<result property="maxUsage" column="max_usage"/>
<result property="periodId" column="period_id"/>
<result property="periodName" column="period_name"/>
<result property="periodType" column="period_type"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="rate" column="rate"/>
<result property="createTime" column="create_time"/>
<result property="remark" column="remark"/>
</resultMap>
<!-- 根据梯度ID查询所有关联的时段费率 -->
<select id="selectByTierId" parameterType="long" resultMap="EmsRateTierPeriodLinkResult">
SELECT *
FROM ems_tier_period_link
WHERE tier_id = #{tierId}
AND del_flag = '0'
ORDER BY period_id
</select>
<!-- 根据梯度ID删除所有关联的时段费率逻辑删除 -->
<delete id="deleteByTierId" parameterType="long">
UPDATE ems_tier_period_link
SET del_flag = '2'
WHERE tier_id = #{tierId}
</delete>
<!-- 根据梯度ID物理删除所有关联的时段费率 -->
<delete id="deleteByTierIdPhysical" parameterType="long">
DELETE FROM ems_tier_period_link
WHERE tier_id = #{tierId}
</delete>
<!-- 根据费率ID删除所有关联的梯度-时段费率(逻辑删除) -->
<delete id="deleteByEnergyRateId" parameterType="long">
UPDATE ems_tier_period_link tpl
SET tpl.del_flag = '2'
WHERE tpl.tier_id IN (
SELECT tier_id
FROM ems_rate_tier
WHERE energy_rate_id = #{energyRateId}
)
</delete>
<!-- 根据费率ID物理删除所有关联的梯度-时段费率 -->
<delete id="deleteByEnergyRateIdPhysical" parameterType="long">
DELETE FROM ems_tier_period_link
WHERE tier_id IN (
SELECT tier_id
FROM ems_rate_tier
WHERE energy_rate_id = #{energyRateId}
)
</delete>
<!-- 查询梯度-时段关联的完整信息 -->
<select id="selectVoByEnergyRateId" parameterType="long" resultMap="EmsRateTierPeriodLinkVoResult">
SELECT
tpl.link_id,
tpl.tier_id,
rt.tier_level,
rt.min_usage,
rt.max_usage,
tpl.period_id,
tp.period_name,
tp.period_type,
tp.start_time,
tp.end_time,
tpl.rate,
tpl.create_time,
tpl.remark
FROM ems_tier_period_link tpl
JOIN ems_rate_tier rt ON tpl.tier_id = rt.tier_id
JOIN ems_time_period tp ON tpl.period_id = tp.period_id
WHERE rt.energy_rate_id = #{energyRateId}
AND tpl.del_flag = '0'
AND rt.del_flag = '0'
AND tp.del_flag = '0'
ORDER BY rt.tier_level, tp.period_type
</select>
</mapper>

View File

@@ -0,0 +1,46 @@
<?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.EmsRateTimePeriodLinkMapper">
<resultMap type="com.klp.ems.domain.EmsRateTimePeriodLink" id="EmsRateTimePeriodLinkResult">
<result property="linkId" column="link_id"/>
<result property="energyRateId" column="energy_rate_id"/>
<result property="periodId" column="period_id"/>
<result property="rate" column="rate"/>
<result property="delFlag" column="del_flag"/>
<result property="remark" column="remark"/>
</resultMap>
<resultMap type="com.klp.ems.domain.vo.EmsRateTimePeriodLinkVo" id="EmsRateTimePeriodLinkVoResult">
<result property="linkId" column="link_id"/>
<result property="energyRateId" column="energy_rate_id"/>
<result property="periodId" column="period_id"/>
<result property="periodName" column="period_name"/>
<result property="periodType" column="period_type"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="rate" column="rate"/>
<result property="remark" column="remark"/>
</resultMap>
<select id="selectByRateId" parameterType="java.lang.Long" resultMap="EmsRateTimePeriodLinkVoResult">
SELECT
l.link_id,
l.energy_rate_id,
l.period_id,
p.period_name,
p.period_type,
p.start_time,
p.end_time,
l.rate,
l.remark
FROM ems_rate_time_period_link l
LEFT JOIN ems_time_period p ON l.period_id = p.period_id
WHERE l.energy_rate_id = #{energyRateId}
AND l.del_flag = '0'
ORDER BY p.period_type ASC
</select>
</mapper>

View File

@@ -0,0 +1,18 @@
<?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.EmsTimePeriodMapper">
<resultMap type="com.klp.ems.domain.EmsTimePeriod" id="EmsTimePeriodResult">
<result property="periodId" column="period_id"/>
<result property="periodName" column="period_name"/>
<result property="periodType" column="period_type"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="crossDay" column="cross_day"/>
<result property="delFlag" column="del_flag"/>
<result property="remark" column="remark"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,244 @@
<?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"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</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>
<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>
<!-- 查询待操作钢卷的能源成本(按钢卷维度聚合,综合所有能源类型) -->
<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,
COALESCE(pa.complete_time, NOW()) AS completeTime,
TIMESTAMPDIFF(MINUTE, pa.create_time, COALESCE(pa.complete_time, NOW())) AS productionDuration,
SUM(COALESCE(ec.consumption, 0)) AS consumptionQty,
SUM(COALESCE(ec.consumption, 0) * COALESCE(er.rate, 0)) AS costAmount,
CAST(1.0 AS DECIMAL(10, 6)) AS allocationFactor
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 ems_energy_consumption ec ON ec.end_time BETWEEN pa.create_time AND COALESCE(pa.complete_time, NOW())
LEFT JOIN ems_meter m ON ec.meter_id = m.meter_id
LEFT JOIN ems_energy_type et ON m.energy_type_id = et.energy_type_id
LEFT JOIN ems_energy_rate er ON et.energy_type_id = er.energy_type_id
AND er.effective_date <![CDATA[<=]]> CURDATE()
AND (er.expiry_date IS NULL OR er.expiry_date <![CDATA[>=]]> CURDATE())
WHERE pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
GROUP BY pa.coil_id, pa.current_coil_no, c.enter_coil_no, pa.warehouse_id, wh.warehouse_name, pa.create_time, pa.complete_time
ORDER BY pa.warehouse_id, pa.create_time DESC
</select>
<!-- 查询待操作钢卷的能源成本统计 -->
<select id="selectPendingActionCoilCostStatistics" resultType="com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo">
SELECT
COUNT(DISTINCT t.coil_id) AS totalCoils,
SUM(t.total_consumption) AS totalConsumption,
SUM(t.total_cost) AS totalCost,
SUM(t.production_duration) AS totalProductionDuration,
CASE
WHEN SUM(t.production_duration) > 0
THEN SUM(t.total_cost) / (SUM(t.production_duration) / 60.0)
ELSE 0
END AS avgUnitCost
FROM (
SELECT
pa.coil_id,
pa.current_coil_no,
c.enter_coil_no,
pa.warehouse_id,
wh.warehouse_name,
pa.create_time,
COALESCE(pa.complete_time, NOW()) AS complete_time,
TIMESTAMPDIFF(MINUTE, pa.create_time, COALESCE(pa.complete_time, NOW())) AS production_duration,
SUM(COALESCE(ec.consumption, 0)) AS total_consumption,
SUM(COALESCE(ec.consumption, 0) * COALESCE(er.rate, 0)) AS total_cost
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 ems_energy_consumption ec ON ec.end_time BETWEEN pa.create_time AND COALESCE(pa.complete_time, NOW())
LEFT JOIN ems_meter m ON ec.meter_id = m.meter_id
LEFT JOIN ems_energy_type et ON m.energy_type_id = et.energy_type_id
LEFT JOIN ems_energy_rate er ON et.energy_type_id = er.energy_type_id
AND er.effective_date <![CDATA[<=]]> CURDATE()
AND (er.expiry_date IS NULL OR er.expiry_date <![CDATA[>=]]> CURDATE())
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>
GROUP BY pa.coil_id, pa.current_coil_no, c.enter_coil_no, pa.warehouse_id, wh.warehouse_name, pa.create_time, pa.complete_time
) t
</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
<include refid="ReportWhere"/>
ORDER BY c.calc_date DESC, c.energy_cost_id DESC
</select>
</mapper>