diff --git a/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java b/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java index cd559d3f..52e50e98 100644 --- a/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java +++ b/klp-ems/src/main/java/com/klp/ems/controller/EnergyCostReportController.java @@ -104,6 +104,8 @@ public class EnergyCostReportController extends BaseController { vo.setCurrentCoilNo(item.getCurrentCoilNo()); vo.setEnergyCost(item.getTotalEnergyCost()); vo.setStockCost(item.getStockCost()); + vo.setAuxCost(item.getAuxCost()); + vo.setSpareCost(item.getSpareCost()); vo.setTotalCost(item.getTotalCost()); return vo; }).collect(Collectors.toList()); diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalCostVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalCostVo.java index 0c2042e5..5fc81e6c 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalCostVo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalCostVo.java @@ -25,10 +25,17 @@ public class CoilTotalCostVo implements Serializable { private Double totalEnergyCost; /** 囤积成本(当日/按 stock 计算) */ private Double stockCost; + + /** 辅料成本 */ + private Double auxCost; + + /** 备件成本 */ + private Double spareCost; + /** 净重 */ private Double totalNetWeight; /** 毛重 */ private Double totalGrossWeight; - /** 总成本(能源+囤积) */ + /** 总成本(能源+囤积+辅料+备件) */ private Double totalCost; } diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java index 624fdc3b..1dcba1d7 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java @@ -23,6 +23,12 @@ public class CoilTotalMergedExportVo implements Serializable { @ExcelProperty("囤积成本") private Double stockCost; + @ExcelProperty("辅料成本") + private Double auxCost; + + @ExcelProperty("备件成本") + private Double spareCost; + @ExcelProperty("总成本") private Double totalCost; } diff --git a/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml b/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml index e94117b1..09276287 100644 --- a/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml +++ b/klp-ems/src/main/resources/mapper/WmsEnergyCoilDailyMapper.xml @@ -40,9 +40,11 @@ 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)) AS totalCost + (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 @@ -222,6 +224,82 @@ 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} @@ -278,9 +356,11 @@ 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)) AS totalCost + (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 @@ -412,6 +492,82 @@ 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 diff --git a/klp-ui/src/views/ems/cost/cost.vue b/klp-ui/src/views/ems/cost/cost.vue index 4b19880a..4e83c03e 100644 --- a/klp-ui/src/views/ems/cost/cost.vue +++ b/klp-ui/src/views/ems/cost/cost.vue @@ -39,15 +39,15 @@
辅料成本
-
¥ 0.00
-
暂不计
+
¥ {{ formatNumber(materialSummary.auxCost, 2) }}
+
备件 ¥ {{ formatNumber(materialSummary.spareCost, 2) }}
总成本
¥ {{ formatNumber(totalCost, 2) }}
-
能源 + 囤积 + 辅料
+
能源 + 囤积 + 辅料 + 备件
@@ -65,6 +65,12 @@ + + + + + + @@ -192,6 +198,10 @@ export default { totalNetWeight: 0, totalGrossWeight: 0 }, + materialSummary: { + auxCost: 0, + spareCost: 0 + }, energyLoading: false, stockLoading: false, detailVisible: false, @@ -204,7 +214,9 @@ export default { totalCost() { const energy = Number(this.energySummary.totalEnergyCost) || 0 const stock = Number(this.stockSummary.todayCost ?? this.stockSummary.totalCost) || 0 - return energy + stock + const aux = Number(this.materialSummary.auxCost) || 0 + const spare = Number(this.materialSummary.spareCost) || 0 + return energy + stock + aux + spare } }, mounted() { @@ -246,6 +258,12 @@ export default { fetchCoilTotalMerged(params).then(res => { this.mergedRows = res.rows || [] this.mergedTotal = res.total || 0 + + const rows = this.mergedRows || [] + this.materialSummary = { + auxCost: rows.reduce((sum, r) => sum + (Number(r.auxCost) || 0), 0), + spareCost: rows.reduce((sum, r) => sum + (Number(r.spareCost) || 0), 0) + } }) }, loadEnergy() { diff --git a/script/sql/mysql/eqp_auxiliary_material.sql b/script/sql/mysql/eqp_auxiliary_material.sql index 736ca6be..0d186e59 100644 --- a/script/sql/mysql/eqp_auxiliary_material.sql +++ b/script/sql/mysql/eqp_auxiliary_material.sql @@ -11,6 +11,8 @@ CREATE TABLE `eqp_auxiliary_material` ( `unit` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '计量单位', `equipment_id` bigint NULL DEFAULT NULL COMMENT '关联设备ID(可为空,通用辅料)', `quantity` int NULL DEFAULT 0 COMMENT '当前库存数量', + `unit_price` decimal(18, 6) NULL DEFAULT 0 COMMENT '当前移动加权平均单价', + `total_amount` decimal(18, 2) NULL DEFAULT 0 COMMENT '当前库存总金额(可冗余,= quantity * unit_price)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建者', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -30,6 +32,9 @@ CREATE TABLE `eqp_auxiliary_material_change` ( `auxiliary_id` bigint NOT NULL COMMENT '关联辅料ID', `change_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '变动类型(增加/减少)', `change_quantity` int NOT NULL COMMENT '变动数量', + `in_unit_price` decimal(18, 6) NULL DEFAULT NULL COMMENT '入库单价(仅增加时有意义)', + `unit_price_snapshot` decimal(18, 6) NULL DEFAULT NULL COMMENT '单价快照(减少时必填,增加时可记录入库后单价)', + `amount` decimal(18, 2) NULL DEFAULT NULL COMMENT '本次变动金额(建议减少时=unit_price_snapshot*change_quantity)', `reason` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '变动原因', `change_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变动时间', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建者', @@ -53,6 +58,8 @@ CREATE TABLE `eqp_spare_part` ( `unit` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '计量单位', `equipment_id` bigint DEFAULT NULL COMMENT '关联设备ID(可为空,通用备件)', `quantity` int DEFAULT '0' COMMENT '当前库存数量', + `unit_price` decimal(18, 6) NULL DEFAULT 0 COMMENT '当前移动加权平均单价', + `total_amount` decimal(18, 2) NULL DEFAULT 0 COMMENT '当前库存总金额(可冗余,= quantity * unit_price)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建者', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新者', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -70,6 +77,9 @@ CREATE TABLE `eqp_spare_parts_change` ( `part_id` bigint NOT NULL COMMENT '关联备件ID', `change_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '变动类型(增加/减少)', `change_quantity` int NOT NULL COMMENT '变动数量', + `in_unit_price` decimal(18, 6) NULL DEFAULT NULL COMMENT '入库单价(仅增加时有意义)', + `unit_price_snapshot` decimal(18, 6) NULL DEFAULT NULL COMMENT '单价快照(减少时必填,增加时可记录入库后单价)', + `amount` decimal(18, 2) NULL DEFAULT NULL COMMENT '本次变动金额(建议减少时=unit_price_snapshot*change_quantity)', `reason` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '变动原因', `change_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '变动时间', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建者', @@ -80,4 +90,5 @@ CREATE TABLE `eqp_spare_parts_change` ( `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '备注', PRIMARY KEY (`change_id`) USING BTREE, KEY `fk_change_part` (`part_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1980201774324969474 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='备品备件变动记录表'; \ No newline at end of file +) ENGINE=InnoDB AUTO_INCREMENT=1980201774324969474 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='备品备件变动记录表'; +