优化成本计算问题,加入辅料备件分摊页面

This commit is contained in:
2026-01-26 19:29:11 +08:00
parent 50fa87115d
commit d5cbaab645
14 changed files with 1754 additions and 117 deletions

View File

@@ -17,6 +17,8 @@ import com.klp.ems.domain.vo.EnergyCostSummaryVo;
import com.klp.ems.domain.vo.WarehouseProductionCoilVo;
import com.klp.ems.domain.vo.WarehouseProductionStatVo;
import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo;
import com.klp.ems.domain.vo.AuxMaterialBreakdownVo;
import com.klp.ems.domain.vo.SparePartBreakdownVo;
import com.klp.ems.service.IEnergyCostReportService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
@@ -111,4 +113,16 @@ public class EnergyCostReportController extends BaseController {
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "入场卷成本汇总", CoilTotalMergedExportVo.class, response);
}
@Log(title = "辅料分摊构成", businessType = BusinessType.OTHER)
@GetMapping("/material/aux/breakdown")
public TableDataInfo<AuxMaterialBreakdownVo> auxMaterialBreakdown(CoilTotalCostBo bo, PageQuery pageQuery) {
return reportService.auxMaterialBreakdown(bo, pageQuery);
}
@Log(title = "备件分摊构成", businessType = BusinessType.OTHER)
@GetMapping("/material/spare/breakdown")
public TableDataInfo<SparePartBreakdownVo> sparePartBreakdown(CoilTotalCostBo bo, PageQuery pageQuery) {
return reportService.sparePartBreakdown(bo, pageQuery);
}
}

View File

@@ -65,6 +65,15 @@ public class WmsEnergyCoilDailyController extends BaseController {
return R.ok(statistics);
}
/**
* 查询待操作钢卷的能源成本详情(单卷)
*/
@GetMapping("/pendingAction/detail")
public R<WmsEnergyCoilDailyVo> pendingActionDetail(@NotNull @RequestParam Long coilId) {
WmsEnergyCoilDailyVo detail = coilDailyService.queryPendingActionCoilCostDetail(coilId);
return R.ok(detail);
}
@Log(title = "钢卷能源分摊", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(WmsEnergyCoilDailyBo bo, HttpServletResponse response) {

View File

@@ -0,0 +1,34 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* 辅料成本分摊构成 Vo
*/
@Data
public class AuxMaterialBreakdownVo {
/** 物料编码 */
private String itemCode;
/** 物料名称 */
private String itemName;
/** 规格 */
private String spec;
/** 单位 */
private String unit;
/** 全厂消耗总数量 */
private BigDecimal totalQty;
/** 全厂消耗总金额 */
private BigDecimal totalAmount;
/** 分摊数量 */
private BigDecimal allocatedQty;
/** 分摊金额 */
private BigDecimal allocatedAmount;
}

View File

@@ -0,0 +1,19 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SparePartBreakdownVo {
private String itemCode;
private String itemName;
private String spec;
private String unit;
private BigDecimal totalQty;
private BigDecimal totalAmount;
private BigDecimal allocatedQty;
private BigDecimal allocatedAmount;
}

View File

@@ -84,8 +84,14 @@ public interface WmsEnergyCoilDailyMapper extends BaseMapper<WmsEnergyCoilDaily>
/** 入场卷号维度能源+囤积成本汇总(导出) */
List<CoilTotalCostVo> selectCoilTotalMergedExport(@Param("bo") CoilTotalCostBo bo);
/** 辅料分摊构成(按物料汇总,金额与数量按卷的日分摊系数分摊) */
IPage<AuxMaterialBreakdownVo> selectAuxMaterialBreakdown(Page<AuxMaterialBreakdownVo> page, @Param("bo") CoilTotalCostBo bo);
/** 备件分摊构成(按备件汇总,金额与数量按卷的日分摊系数分摊) */
IPage<SparePartBreakdownVo> selectSparePartBreakdown(Page<SparePartBreakdownVo> page, @Param("bo") CoilTotalCostBo bo);
/** 查询待操作钢卷的能源成本一次性SQL查询 */
List<WmsEnergyCoilDailyVo> selectPendingActionCoilCost();
List<WmsEnergyCoilDailyVo> selectPendingActionCoilCost(@Param("bo") WmsEnergyCoilDailyBo bo);
/** 查询待操作钢卷的能源成本统计 */
WmsEnergyCoilDailyStatisticsVo selectPendingActionCoilCostStatistics(
@@ -93,4 +99,7 @@ public interface WmsEnergyCoilDailyMapper extends BaseMapper<WmsEnergyCoilDaily>
@Param("currentCoilNo") String currentCoilNo,
@Param("warehouseId") Long warehouseId
);
/** 查询待操作钢卷的能源成本详情(单卷) */
WmsEnergyCoilDailyVo selectPendingActionCoilCostDetail(@Param("coilId") Long coilId);
}

View File

@@ -11,6 +11,8 @@ import com.klp.ems.domain.vo.EnergyCostSummaryVo;
import com.klp.ems.domain.vo.WarehouseProductionCoilVo;
import com.klp.ems.domain.vo.WarehouseProductionStatVo;
import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo;
import com.klp.ems.domain.vo.AuxMaterialBreakdownVo;
import com.klp.ems.domain.vo.SparePartBreakdownVo;
import java.util.List;
import java.util.Map;
@@ -49,4 +51,10 @@ public interface IEnergyCostReportService {
/** 入场卷号维度能源+囤积综合汇总导出 */
java.util.List<CoilTotalCostVo> coilTotalMergedExport(CoilTotalCostBo bo);
/** 辅料分摊构成(按物料汇总,数量与金额按卷的日分摊系数分摊) */
TableDataInfo<AuxMaterialBreakdownVo> auxMaterialBreakdown(CoilTotalCostBo bo, PageQuery pageQuery);
/** 备件分摊构成(按备件汇总,数量与金额按卷的日分摊系数分摊) */
TableDataInfo<SparePartBreakdownVo> sparePartBreakdown(CoilTotalCostBo bo, PageQuery pageQuery);
}

View File

@@ -34,6 +34,11 @@ public interface IWmsEnergyCoilDailyService {
*/
WmsEnergyCoilDailyStatisticsVo queryPendingActionCoilCostStatistics(String enterCoilNo, String currentCoilNo, Long warehouseId);
/**
* 查询待操作钢卷的能源成本详情(单卷)
*/
WmsEnergyCoilDailyVo queryPendingActionCoilCostDetail(Long coilId);
Boolean insertByBo(WmsEnergyCoilDailyBo bo);
Boolean updateByBo(WmsEnergyCoilDailyBo bo);

View File

@@ -13,6 +13,8 @@ import com.klp.ems.domain.vo.EnergyCostSummaryVo;
import com.klp.ems.domain.vo.WarehouseProductionCoilVo;
import com.klp.ems.domain.vo.WarehouseProductionStatVo;
import com.klp.ems.domain.vo.WmsEnergyCoilDailyVo;
import com.klp.ems.domain.vo.AuxMaterialBreakdownVo;
import com.klp.ems.domain.vo.SparePartBreakdownVo;
import com.klp.ems.mapper.WmsEnergyCoilDailyMapper;
import com.klp.ems.service.IEnergyCostReportService;
import lombok.RequiredArgsConstructor;
@@ -142,4 +144,22 @@ public class EnergyCostReportServiceImpl implements IEnergyCostReportService {
public java.util.List<CoilTotalCostVo> coilTotalMergedExport(CoilTotalCostBo bo) {
return coilDailyMapper.selectCoilTotalMergedExport(bo);
}
@Override
public TableDataInfo<AuxMaterialBreakdownVo> auxMaterialBreakdown(CoilTotalCostBo bo, PageQuery pageQuery) {
if (pageQuery.getPageSize() == null) {
pageQuery.setPageSize(15);
}
IPage<AuxMaterialBreakdownVo> page = coilDailyMapper.selectAuxMaterialBreakdown(pageQuery.build(), bo);
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<SparePartBreakdownVo> sparePartBreakdown(CoilTotalCostBo bo, PageQuery pageQuery) {
if (pageQuery.getPageSize() == null) {
pageQuery.setPageSize(15);
}
IPage<SparePartBreakdownVo> page = coilDailyMapper.selectSparePartBreakdown(pageQuery.build(), bo);
return TableDataInfo.build(page);
}
}

View File

@@ -51,7 +51,7 @@ public class WmsEnergyCoilDailyServiceImpl implements IWmsEnergyCoilDailyService
public TableDataInfo<WmsEnergyCoilDailyVo> queryPendingActionCoilCost(WmsEnergyCoilDailyBo bo, PageQuery pageQuery) {
// 使用SQL一次性查询待操作钢卷的能源成本
// 所有的关联、聚合、计算都在SQL中完成性能更高
List<WmsEnergyCoilDailyVo> resultList = baseMapper.selectPendingActionCoilCost();
List<WmsEnergyCoilDailyVo> resultList = baseMapper.selectPendingActionCoilCost(bo);
if (CollUtil.isEmpty(resultList)) {
log.warn("[PendingActionCoilCost] No pending action coils found");
@@ -76,6 +76,11 @@ public class WmsEnergyCoilDailyServiceImpl implements IWmsEnergyCoilDailyService
return baseMapper.selectPendingActionCoilCostStatistics(enterCoilNo, currentCoilNo, warehouseId);
}
@Override
public WmsEnergyCoilDailyVo queryPendingActionCoilCostDetail(Long coilId) {
return baseMapper.selectPendingActionCoilCostDetail(coilId);
}
@Override
public Boolean insertByBo(WmsEnergyCoilDailyBo bo) {
WmsEnergyCoilDaily add = BeanUtil.toBean(bo, WmsEnergyCoilDaily.class);

View File

@@ -33,12 +33,12 @@
<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,
m.enter_coil_no AS enterCoilNo,
m.current_coil_no AS currentCoilNo,
IFNULL(e.coil_count, 0) AS coilCount,
IFNULL(e.total_duration, 0) AS totalDuration,
IFNULL(e.total_consumption, 0) AS totalConsumption,
IFNULL(e.energy_cost, 0) AS totalEnergyCost,
IFNULL(s.stock_cost, 0) AS stockCost,
IFNULL(x.aux_cost, 0) AS auxCost,
IFNULL(x.spare_cost, 0) AS spareCost,
@@ -46,47 +46,31 @@
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
SELECT
MAX(enter_coil_no) AS enter_coil_no,
current_coil_no,
MIN(create_time) AS create_time
FROM wms_material_coil
WHERE data_type = 1
AND del_flag = 0
AND status = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
AND 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}, '%')
AND 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')
AND 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')
AND create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
) aid
GROUP BY current_coil_no
) m
LEFT JOIN (
SELECT
c.enter_coil_no,
MIN(pa.current_coil_no) AS current_coil_no,
pa.current_coil_no,
COUNT(DISTINCT pa.coil_id) AS coil_count,
SUM(
CASE
@@ -137,7 +121,7 @@
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 wms_material_coil c ON pa.coil_id = c.coil_id AND c.data_type = 1 AND c.del_flag = 0 AND c.status = 0
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
@@ -174,6 +158,7 @@
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.del_flag='0'
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}, '%')
@@ -187,29 +172,30 @@
<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
GROUP BY pa.current_coil_no
) e ON m.current_coil_no = e.current_coil_no
LEFT JOIN (
SELECT
m.enter_coil_no,
current_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)
WHEN IFNULL(net_weight, 0) = 0 AND IFNULL(gross_weight, 0) > 0 THEN gross_weight
ELSE IFNULL(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
SUM(IFNULL(net_weight, 0)) AS total_net_weight,
SUM(IFNULL(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)
WHERE m.data_type = 1
AND m.del_flag = 0
AND m.status = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND m.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
@@ -222,11 +208,11 @@
<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
GROUP BY current_coil_no
) s ON m.current_coil_no = s.current_coil_no
LEFT JOIN (
SELECT
dm.enter_coil_no,
dm.current_coil_no,
SUM(
CASE
WHEN dm.total_minutes > 0
@@ -244,7 +230,7 @@
FROM (
SELECT
DATE(pa.create_time) AS day_key,
c.enter_coil_no,
pa.current_coil_no,
SUM(
CASE
WHEN pa.create_time &lt; COALESCE(pa.complete_time, NOW())
@@ -254,7 +240,7 @@
) 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 wms_material_coil c ON pa.coil_id = c.coil_id AND c.data_type = 1 AND c.del_flag = 0 AND c.status = 0
LEFT JOIN (
SELECT
DATE(pa_all.create_time) AS day_key,
@@ -267,14 +253,28 @@
) AS total_minutes
FROM wms_coil_pending_action pa_all
WHERE pa_all.action_status IN (0,1,2)
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa_all.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa_all.create_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY DATE(pa_all.create_time)
) td ON td.day_key = DATE(pa.create_time)
WHERE pa.action_status IN (0,1,2)
<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 >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa.create_time), c.enter_coil_no, td.total_minutes
</if>
GROUP BY DATE(pa.create_time), pa.current_coil_no, td.total_minutes
) dm
LEFT JOIN (
SELECT
@@ -283,8 +283,12 @@
FROM eqp_auxiliary_material_change
WHERE del_flag = '0'
AND change_type = '减少'
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND change_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY DATE(change_time)
) a ON dm.day_key = a.day_key
LEFT JOIN (
@@ -294,12 +298,17 @@
FROM eqp_spare_parts_change
WHERE del_flag = '0'
AND change_type = '减少'
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND change_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
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
GROUP BY dm.current_coil_no
) x ON m.current_coil_no = x.current_coil_no
WHERE s.current_coil_no IS NOT NULL
ORDER BY totalCost DESC
LIMIT #{offset}, #{pageSize}
</select>
@@ -307,54 +316,42 @@
<!-- 入场卷号维度能源+囤积成本汇总总数 -->
<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
SELECT COUNT(1)
FROM (
SELECT
current_coil_no,
MAX(enter_coil_no) AS enter_coil_no,
MIN(create_time) AS create_time
FROM wms_material_coil
WHERE data_type = 1
AND del_flag = 0
AND status = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
AND 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}, '%')
AND 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')
AND 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')
AND 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
GROUP BY current_coil_no
) m
</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,
m.enter_coil_no AS enterCoilNo,
m.current_coil_no AS currentCoilNo,
IFNULL(e.coil_count, 0) AS coilCount,
IFNULL(e.total_duration, 0) AS totalDuration,
IFNULL(e.total_consumption, 0) AS totalConsumption,
IFNULL(e.energy_cost, 0) AS totalEnergyCost,
IFNULL(s.stock_cost, 0) AS stockCost,
IFNULL(x.aux_cost, 0) AS auxCost,
IFNULL(x.spare_cost, 0) AS spareCost,
@@ -362,23 +359,31 @@
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
SELECT
MAX(enter_coil_no) AS enter_coil_no,
current_coil_no,
MIN(create_time) AS create_time
FROM wms_material_coil
WHERE data_type IN (0,1)
AND del_flag = 0
AND status = 0
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND enter_coil_no LIKE CONCAT('%', #{bo.enterCoilNo}, '%')
</if>
<if test="bo != null and bo.currentCoilNo != null and bo.currentCoilNo != ''">
AND current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND create_time <![CDATA[>=]]> CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY current_coil_no
) m
LEFT JOIN (
SELECT
c.enter_coil_no,
MIN(pa.current_coil_no) AS current_coil_no,
pa.current_coil_no,
COUNT(DISTINCT pa.coil_id) AS coil_count,
SUM(
CASE
@@ -429,7 +434,7 @@
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 wms_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
@@ -468,7 +473,7 @@
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
) e ON m.enter_coil_no = e.enter_coil_no
LEFT JOIN (
SELECT
m.enter_coil_no,
@@ -490,8 +495,9 @@
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
AND m.status = 0
GROUP BY m.enter_coil_no
) s ON aid.enter_coil_no = s.enter_coil_no
) s ON m.enter_coil_no = s.enter_coil_no
LEFT JOIN (
SELECT
dm.enter_coil_no,
@@ -522,7 +528,7 @@
) 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 wms_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
LEFT JOIN (
SELECT
DATE(pa_all.create_time) AS day_key,
@@ -535,13 +541,21 @@
) AS total_minutes
FROM wms_coil_pending_action pa_all
WHERE pa_all.action_status IN (0,1,2)
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa_all.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa_all.create_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY DATE(pa_all.create_time)
) td ON td.day_key = DATE(pa.create_time)
WHERE pa.action_status IN (0,1,2)
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND pa.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND pa.create_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY DATE(pa.create_time), c.enter_coil_no, td.total_minutes
) dm
LEFT JOIN (
@@ -551,8 +565,12 @@
FROM eqp_auxiliary_material_change
WHERE del_flag = '0'
AND change_type = '减少'
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND change_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
GROUP BY DATE(change_time)
) a ON dm.day_key = a.day_key
LEFT JOIN (
@@ -562,12 +580,16 @@
FROM eqp_spare_parts_change
WHERE del_flag = '0'
AND change_type = '减少'
<if test="bo != null and bo.startDate != null and bo.startDate != ''">
AND change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
</if>
<if test="bo != null and bo.endDate != null and bo.endDate != ''">
AND change_time &lt;= CONCAT(#{bo.endDate}, ' 23:59:59')
</if>
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
) x ON m.enter_coil_no = x.enter_coil_no
ORDER BY totalCost DESC
</select>
@@ -626,7 +648,7 @@
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_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
LEFT JOIN wms_warehouse w ON pa.warehouse_id = w.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
@@ -741,7 +763,7 @@
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_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
LEFT JOIN wms_warehouse w ON pa.warehouse_id = w.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
@@ -776,9 +798,11 @@
) 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 pa_pd.del_flag=0
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.del_flag = 0
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}, '%')
@@ -1019,7 +1043,7 @@
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 wms_material_coil mc ON pa.coil_id = mc.coil_id AND mc.status = 0
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
@@ -1135,7 +1159,7 @@
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 wms_material_coil mc ON pa.coil_id = mc.coil_id AND mc.status = 0
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
@@ -1379,7 +1403,7 @@
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 wms_material_coil mc ON pa.coil_id = mc.coil_id AND mc.status = 0
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
) wmt ON pa.warehouse_id = wmt.warehouse_id
@@ -1719,7 +1743,7 @@
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_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
LEFT JOIN wms_warehouse wh ON pa.warehouse_id = wh.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
@@ -1773,9 +1797,184 @@
) 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="bo != null and bo.coilId != null">
AND pa.coil_id = #{bo.coilId}
</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 pa.current_coil_no LIKE CONCAT('%', #{bo.currentCoilNo}, '%')
</if>
<if test="bo != null and bo.warehouseId != null">
AND pa.warehouse_id = #{bo.warehouseId}
</if>
ORDER BY pa.warehouse_id, pa.create_time DESC
</select>
<!-- 查询待操作钢卷的能源成本详情(单卷) -->
<select id="selectPendingActionCoilCostDetail" 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 AND c.status = 0
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
WHERE pa.coil_id = #{coilId}
AND pa.action_status IN (0, 1, 2)
AND pa.warehouse_id IS NOT NULL
AND pa.del_flag = 0
LIMIT 1
</select>
<!-- 查询待操作钢卷的能源成本统计(按时间段分摊) -->
<select id="selectPendingActionCoilCostStatistics" resultType="com.klp.ems.domain.vo.WmsEnergyCoilDailyStatisticsVo">
SELECT
@@ -1918,7 +2117,7 @@
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_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
LEFT JOIN wms_warehouse wh ON pa.warehouse_id = wh.warehouse_id
LEFT JOIN (
<include refid="WarehouseMeterTime"/>
@@ -2034,4 +2233,181 @@
ORDER BY c.calc_date DESC, c.energy_cost_id DESC
</select>
<!-- 辅料分摊构成(按物料汇总,数量与金额按卷的日分摊系数分摊) -->
<select id="selectAuxMaterialBreakdown" resultType="com.klp.ems.domain.vo.AuxMaterialBreakdownVo">
SELECT
CAST(t.auxiliary_id AS CHAR) AS itemCode,
t.item_name AS itemName,
t.spec AS spec,
t.unit AS unit,
SUM(t.total_qty) AS totalQty,
SUM(t.total_amount) AS totalAmount,
SUM(t.allocated_qty) AS allocatedQty,
SUM(t.allocated_amount) AS allocatedAmount
FROM (
SELECT
adc.day_key,
adc.auxiliary_id,
adc.item_name,
adc.spec,
adc.unit,
adc.total_qty,
adc.total_amount,
CASE
WHEN dtm.total_minutes > 0 AND cdm.coil_minutes IS NOT NULL AND cdm.coil_minutes > 0
THEN adc.total_qty * (cdm.coil_minutes / dtm.total_minutes)
ELSE 0
END AS allocated_qty,
CASE
WHEN dtm.total_minutes > 0 AND cdm.coil_minutes IS NOT NULL AND cdm.coil_minutes > 0
THEN adc.total_amount * (cdm.coil_minutes / dtm.total_minutes)
ELSE 0
END AS allocated_amount
FROM (
SELECT
DATE(amc.change_time) AS day_key,
am.auxiliary_id,
am.auxiliary_name AS item_name,
am.auxiliary_model AS spec,
am.unit,
SUM(ABS(amc.change_quantity)) AS total_qty,
SUM(ABS(IFNULL(amc.amount, 0))) AS total_amount
FROM eqp_auxiliary_material_change amc
JOIN eqp_auxiliary_material am ON amc.auxiliary_id = am.auxiliary_id
WHERE amc.del_flag = '0'
AND amc.change_type = '减少'
AND amc.change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND amc.change_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(amc.change_time), am.auxiliary_id, am.auxiliary_name, am.auxiliary_model, am.unit
) adc
JOIN (
SELECT
DATE(pa_all.create_time) AS day_key,
SUM(
CASE
WHEN pa_all.create_time <![CDATA[<]]> 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 <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa_all.create_time)
) dtm ON adc.day_key = dtm.day_key
LEFT JOIN (
SELECT
c.enter_coil_no,
DATE(pa.create_time) AS day_key,
SUM(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, NOW())
THEN TIMESTAMPDIFF(MINUTE, pa.create_time, COALESCE(pa.complete_time, NOW()))
ELSE 0
END
) AS coil_minutes
FROM wms_coil_pending_action pa
JOIN wms_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
WHERE pa.action_status IN (0,1,2)
AND pa.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no = #{bo.enterCoilNo}
</if>
GROUP BY c.enter_coil_no, DATE(pa.create_time)
) cdm ON adc.day_key = cdm.day_key
) t
GROUP BY t.auxiliary_id, t.item_name, t.spec, t.unit
ORDER BY allocatedAmount DESC
</select>
<!-- 备件分摊构成(按备件汇总,数量与金额按卷的日分摊系数分摊) -->
<select id="selectSparePartBreakdown" resultType="com.klp.ems.domain.vo.SparePartBreakdownVo">
SELECT
CAST(t.part_id AS CHAR) AS itemCode,
t.item_name AS itemName,
t.spec AS spec,
t.unit AS unit,
SUM(t.total_qty) AS totalQty,
SUM(t.total_amount) AS totalAmount,
SUM(t.allocated_qty) AS allocatedQty,
SUM(t.allocated_amount) AS allocatedAmount
FROM (
SELECT
sdc.day_key,
sdc.part_id,
sdc.item_name,
sdc.spec,
sdc.unit,
sdc.total_qty,
sdc.total_amount,
CASE
WHEN dtm.total_minutes > 0 AND cdm.coil_minutes IS NOT NULL AND cdm.coil_minutes > 0
THEN sdc.total_qty * (cdm.coil_minutes / dtm.total_minutes)
ELSE 0
END AS allocated_qty,
CASE
WHEN dtm.total_minutes > 0 AND cdm.coil_minutes IS NOT NULL AND cdm.coil_minutes > 0
THEN sdc.total_amount * (cdm.coil_minutes / dtm.total_minutes)
ELSE 0
END AS allocated_amount
FROM (
SELECT
DATE(spc.change_time) AS day_key,
sp.part_id,
sp.part_name AS item_name,
sp.model AS spec,
sp.unit,
SUM(ABS(spc.change_quantity)) AS total_qty,
SUM(ABS(IFNULL(spc.amount, 0))) AS total_amount
FROM eqp_spare_parts_change spc
JOIN eqp_spare_part sp ON spc.part_id = sp.part_id
WHERE spc.del_flag = '0'
AND spc.change_type = '减少'
AND spc.change_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND spc.change_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(spc.change_time), sp.part_id, sp.part_name, sp.model, sp.unit
) sdc
JOIN (
SELECT
DATE(pa_all.create_time) AS day_key,
SUM(
CASE
WHEN pa_all.create_time <![CDATA[<]]> 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 <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
GROUP BY DATE(pa_all.create_time)
) dtm ON sdc.day_key = dtm.day_key
LEFT JOIN (
SELECT
c.enter_coil_no,
DATE(pa.create_time) AS day_key,
SUM(
CASE
WHEN pa.create_time <![CDATA[<]]> COALESCE(pa.complete_time, NOW())
THEN TIMESTAMPDIFF(MINUTE, pa.create_time, COALESCE(pa.complete_time, NOW()))
ELSE 0
END
) AS coil_minutes
FROM wms_coil_pending_action pa
JOIN wms_material_coil c ON pa.coil_id = c.coil_id AND c.status = 0
WHERE pa.action_status IN (0,1,2)
AND pa.create_time >= CONCAT(#{bo.startDate}, ' 00:00:00')
AND pa.create_time <![CDATA[<=]]> CONCAT(#{bo.endDate}, ' 23:59:59')
<if test="bo != null and bo.enterCoilNo != null and bo.enterCoilNo != ''">
AND c.enter_coil_no = #{bo.enterCoilNo}
</if>
GROUP BY c.enter_coil_no, DATE(pa.create_time)
) cdm ON sdc.day_key = cdm.day_key
) t
GROUP BY t.part_id, t.item_name, t.spec, t.unit
ORDER BY allocatedAmount DESC
</select>
</mapper>