tuqin
14 小时以前 2c4bc1808f272b7d7282d1b8ba416d606ebc7df5
refactor(生产核算): 成品/白盒归属改为按工序指定

- 新增 production_costing_process(工序→成品/白盒)配置及 CRUD
- 核算 SQL 按工序 join(原按工序所属部门)
- 移除部门类型配置(production_costing_dept 相关文件与接口)
- 更新 sql/production_costing_config.sql
已删除2个文件
已添加2个文件
已重命名1个文件
已修改5个文件
366 ■■■■■ 文件已修改
sql/production_costing_config.sql 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionCostingController.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionCostingDeptMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionCostingProcessMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionCostingProcess.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionCostingService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionCostingServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionCostingDeptMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionCostingMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionCostingProcessMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/production_costing_config.sql
@@ -1,46 +1,63 @@
-- ============================================================
-- ç”Ÿäº§æ ¸ç®—(成品部门 / ç™½ç›’部门)配置与结构补充脚本
-- æ•°æ®åº“:product-inventory-management-new-pro
-- è¯´æ˜Žï¼šæœ¬åœ°åº“结构落后于代码,production_product_main ç¼ºå°‘
--       æŠ¥å·¥ç»“æžœ/审核相关列,这里补齐;并新增核算配置表与演示数据。
-- ç”Ÿäº§æ ¸ç®—(成品部门 / ç™½ç›’部门)数据库脚本
-- ç›®æ ‡åº“:product-inventory-management-new-pro(按实际环境替换)
-- è¯´æ˜Žï¼š
--   ç¬¬ 1 éƒ¨åˆ†ï¼šç»“构变更(补列 + æ–°å»ºé…ç½®è¡¨ï¼‰â€”— å¿…须执行,幂等可重复执行
--   ç¬¬ 2 éƒ¨åˆ†ï¼šæ¼”示数据 â€”— å¯é€‰ï¼Œä»…用于本地/演示环境,正式环境请勿执行或按需调整
-- æˆå“/白盒 çš„归属:在【工序类型配置】里直接把某个工序指定为 æˆå“ æˆ– ç™½ç›’
--   ï¼ˆ1=成品部门,2=白盒部门)
-- ============================================================
SET NAMES utf8mb4;
-- ------------------------------------------------------------
-- 1. è¡¥å…… production_product_main ç¼ºå¤±åˆ—(报工结果 / å®¡æ ¸ / è¡¥ä¿®ç†å·¥æ—¶ï¼‰
-- ------------------------------------------------------------
ALTER TABLE `production_product_main`
    ADD COLUMN `report_type`     int          NULL COMMENT '报工结果类型:0合格,1轻微返工,2严重返工,3报废' AFTER `status`,
    ADD COLUMN `audit_status`    int          NULL DEFAULT 1 COMMENT '审核状态:0待审核,1审核通过,2审核不通过' AFTER `report_type`,
    ADD COLUMN `audit_remark`    varchar(255) NULL COMMENT '审核意见' AFTER `audit_status`,
    ADD COLUMN `repair_work_hour` decimal(10,2) NULL DEFAULT 0 COMMENT '补修理工时' AFTER `work_hour`;
/* ============================================================
 * ç¬¬ 1 éƒ¨åˆ†ï¼šç»“构变更(必须执行)
 * ============================================================ */
-- å·²å­˜åœ¨æŠ¥å·¥æ•°æ®é»˜è®¤è§†ä¸ºï¼šå®¡æ ¸é€šè¿‡ã€åˆæ ¼
-- 1.1 è¡¥é½ production_product_main ç¼ºå¤±åˆ—
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='production_product_main' AND COLUMN_NAME='report_type');
SET @s := IF(@c=0, 'ALTER TABLE `production_product_main` ADD COLUMN `report_type` int NULL COMMENT ''报工结果类型:0合格,1轻微返工,2严重返工,3报废'' AFTER `status`', 'DO 0');
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='production_product_main' AND COLUMN_NAME='audit_status');
SET @s := IF(@c=0, 'ALTER TABLE `production_product_main` ADD COLUMN `audit_status` int NULL DEFAULT 1 COMMENT ''审核状态:0待审核,1审核通过,2审核不通过'' AFTER `report_type`', 'DO 0');
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='production_product_main' AND COLUMN_NAME='audit_remark');
SET @s := IF(@c=0, 'ALTER TABLE `production_product_main` ADD COLUMN `audit_remark` varchar(255) NULL COMMENT ''审核意见'' AFTER `audit_status`', 'DO 0');
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='production_product_main' AND COLUMN_NAME='repair_work_hour');
SET @s := IF(@c=0, 'ALTER TABLE `production_product_main` ADD COLUMN `repair_work_hour` decimal(10,2) NULL DEFAULT 0 COMMENT ''补修理工时'' AFTER `work_hour`', 'DO 0');
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
-- 1.2 è¡¥é½ product ç¼ºå¤±åˆ— standard_quantity
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='product' AND COLUMN_NAME='standard_quantity');
SET @s := IF(@c=0, 'ALTER TABLE `product` ADD COLUMN `standard_quantity` decimal(18,4) NULL COMMENT ''标准数量'' AFTER `product_name`', 'DO 0');
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
-- 1.3 å·²å­˜åœ¨æŠ¥å·¥æ•°æ®é»˜è®¤ï¼šå®¡æ ¸é€šè¿‡ã€åˆæ ¼
UPDATE `production_product_main` SET `report_type` = 0 WHERE `report_type` IS NULL;
UPDATE `production_product_main` SET `audit_status` = 1 WHERE `audit_status` IS NULL;
-- ------------------------------------------------------------
-- 2. æ–°å¢žæ ¸ç®—配置表
-- ------------------------------------------------------------
DROP TABLE IF EXISTS `production_costing_dept`;
CREATE TABLE `production_costing_dept` (
-- 1.4 æ–°å»ºæ ¸ç®—配置表
CREATE TABLE IF NOT EXISTS `production_costing_process` (
    `id`          bigint       NOT NULL AUTO_INCREMENT COMMENT '主键',
    `dept_id`     bigint       NULL COMMENT '部门ID(sys_dept.dept_id)',
    `dept_type`   int          NULL COMMENT '部门类型:1成品部门,2白盒部门',
    `process_id`  bigint       NULL COMMENT '工序ID(technology_operation.id)',
    `dept_type`   int          NULL COMMENT '类型:1成品部门,2白盒部门',
    `remark`      varchar(255) NULL COMMENT '备注',
    `create_user` bigint       NULL COMMENT '创建人',
    `create_time` datetime     NULL COMMENT '创建时间',
    `update_user` bigint       NULL COMMENT '修改人',
    `update_time` datetime     NULL COMMENT '修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '生产核算-部门类型配置';
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_process` (`process_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '生产核算-工序类型配置';
DROP TABLE IF EXISTS `production_costing_standard`;
CREATE TABLE `production_costing_standard` (
CREATE TABLE IF NOT EXISTS `production_costing_standard` (
    `id`                bigint        NOT NULL AUTO_INCREMENT COMMENT '主键',
    `dept_type`         int           NULL COMMENT '部门类型:1成品,2白盒',
    `process_id`        bigint        NULL COMMENT '工序ID(technology_operation.id)',
    `product_model_id`  bigint        NULL COMMENT '型号ID(product_model.id),白盒必填',
    `dept_type`         int           NULL COMMENT '类型:1成品,2白盒',
    `process_id`        bigint        NULL COMMENT '工序ID',
    `product_model_id`  bigint        NULL COMMENT '型号ID,白盒必填',
    `standard_quantity` decimal(18,4) NULL COMMENT '标准数量',
    `unit`              varchar(50)   NULL COMMENT '单位',
    `remark`            varchar(255)  NULL COMMENT '备注',
@@ -48,14 +65,14 @@
    `create_time`       datetime      NULL COMMENT '创建时间',
    `update_user`       bigint        NULL COMMENT '修改人',
    `update_time`       datetime      NULL COMMENT '修改时间',
    PRIMARY KEY (`id`)
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_std` (`dept_type`, `process_id`, `product_model_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '生产核算-标准数量配置';
DROP TABLE IF EXISTS `production_costing_factor`;
CREATE TABLE `production_costing_factor` (
CREATE TABLE IF NOT EXISTS `production_costing_factor` (
    `id`            bigint        NOT NULL AUTO_INCREMENT COMMENT '主键',
    `process_id`    bigint        NULL COMMENT '工序ID(technology_operation.id)',
    `staff_id`      bigint        NULL COMMENT '员工ID(sys_user.user_id)',
    `process_id`    bigint        NULL COMMENT '工序ID',
    `staff_id`      bigint        NULL COMMENT '员工ID',
    `staff_name`    varchar(255)  NULL COMMENT '员工姓名',
    `violin_factor` decimal(18,4) NULL DEFAULT 1 COMMENT '小提琴折算率(基准)',
    `viola_factor`  decimal(18,4) NULL COMMENT '大提琴折算率',
@@ -65,66 +82,83 @@
    `create_time`   datetime      NULL COMMENT '创建时间',
    `update_user`   bigint        NULL COMMENT '修改人',
    `update_time`   datetime      NULL COMMENT '修改时间',
    PRIMARY KEY (`id`)
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_factor` (`process_id`, `staff_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '生产核算-折算率配置(工序+员工)';
-- ------------------------------------------------------------
-- 3. æ¼”示数据(便于本地查看效果)
-- ------------------------------------------------------------
-- 3.1 æ–°å¢žéƒ¨é—¨ï¼šæˆå“éƒ¨é—¨ / ç™½ç›’部门
INSERT INTO `sys_dept` (`dept_id`, `parent_id`, `ancestors`, `dept_name`, `order_num`, `status`, `del_flag`, `create_by`, `create_time`)
VALUES (220, 100, '0,100', '成品部门', 1, '0', '0', 'admin', NOW()),
       (221, 100, '0,100', '白盒部门', 2, '0', '0', 'admin', NOW());
CREATE TABLE IF NOT EXISTS `production_costing_workday` (
    `id`          bigint       NOT NULL AUTO_INCREMENT COMMENT '主键',
    `work_month`  varchar(7)   NULL COMMENT '年月 yyyy-MM',
    `work_days`   int          NULL COMMENT '当月工作日天数',
    `remark`      varchar(255) NULL COMMENT '备注',
    `create_user` bigint       NULL COMMENT '创建人',
    `create_time` datetime     NULL COMMENT '创建时间',
    `update_user` bigint       NULL COMMENT '修改人',
    `update_time` datetime     NULL COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_work_month` (`work_month`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '生产核算-月度工作日配置';
-- 3.2 æŠŠæ¼”示工序归入对应部门(成品:冷工艺27/硫化28;白盒:收线25/切割2)
UPDATE `technology_operation` SET `dept_id` = 220 WHERE `id` IN (27, 28);
UPDATE `technology_operation` SET `dept_id` = 221 WHERE `id` IN (2, 25);
/* ============================================================
 * ç¬¬ 2 éƒ¨åˆ†ï¼šæ¼”示数据(可选,仅本地/演示环境)
 * ============================================================ */
-- 3.3 éƒ¨é—¨ç±»åž‹é…ç½®
INSERT INTO `production_costing_dept` (`dept_id`, `dept_type`, `remark`, `create_time`)
VALUES (220, 1, '成品部门', NOW()),
       (221, 2, '白盒部门', NOW());
-- 2.1 å·¥åºç±»åž‹é…ç½®ï¼ˆæˆå“ï¼šå†·å·¥è‰º27/硫化28;白盒:切割2/收线25)
INSERT INTO `production_costing_process` (`process_id`, `dept_type`, `remark`, `create_time`)
SELECT 27, 1, '冷工艺-成品', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_process` WHERE `process_id`=27);
INSERT INTO `production_costing_process` (`process_id`, `dept_type`, `remark`, `create_time`)
SELECT 28, 1, '硫化-成品', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_process` WHERE `process_id`=28);
INSERT INTO `production_costing_process` (`process_id`, `dept_type`, `remark`, `create_time`)
SELECT 2, 2, '切割-白盒', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_process` WHERE `process_id`=2);
INSERT INTO `production_costing_process` (`process_id`, `dept_type`, `remark`, `create_time`)
SELECT 25, 2, '收线-白盒', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_process` WHERE `process_id`=25);
-- 3.4 æ ‡å‡†æ•°é‡é…ç½®
--     æˆå“ï¼šæŒ‰å·¥åº
--     ç™½ç›’:按工序 + åž‹å·
-- 2.2 æ ‡å‡†æ•°é‡é…ç½®ï¼ˆæˆå“ï¼šæŒ‰å·¥åºï¼›ç™½ç›’:按工序+型号)
INSERT INTO `production_costing_standard` (`dept_type`, `process_id`, `product_model_id`, `standard_quantity`, `unit`, `remark`, `create_time`)
VALUES (1, 27, NULL, 10, 'm', '冷工艺标准数量', NOW()),
       (1, 28, NULL, 20, 'm', '硫化标准数量', NOW()),
       (2, 25, 251, 5, 'kg/km', '收线-铝合金线', NOW()),
       (2, 25, 256, 2, 'm', '收线-铝合金绞线', NOW()),
       (2, 2, 246, 4, 'kg/km', '切割-铝合金线', NOW());
SELECT 1, 27, NULL, 10, 'm', '冷工艺标准数量', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_standard` WHERE `dept_type`=1 AND `process_id`=27 AND `product_model_id` IS NULL);
INSERT INTO `production_costing_standard` (`dept_type`, `process_id`, `product_model_id`, `standard_quantity`, `unit`, `remark`, `create_time`)
SELECT 1, 28, NULL, 20, 'm', '硫化标准数量', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_standard` WHERE `dept_type`=1 AND `process_id`=28 AND `product_model_id` IS NULL);
INSERT INTO `production_costing_standard` (`dept_type`, `process_id`, `product_model_id`, `standard_quantity`, `unit`, `remark`, `create_time`)
SELECT 2, 25, 251, 5, 'kg/km', '收线-铝合金线', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_standard` WHERE `dept_type`=2 AND `process_id`=25 AND `product_model_id`=251);
INSERT INTO `production_costing_standard` (`dept_type`, `process_id`, `product_model_id`, `standard_quantity`, `unit`, `remark`, `create_time`)
SELECT 2, 25, 256, 2, 'm', '收线-铝合金绞线', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_standard` WHERE `dept_type`=2 AND `process_id`=25 AND `product_model_id`=256);
INSERT INTO `production_costing_standard` (`dept_type`, `process_id`, `product_model_id`, `standard_quantity`, `unit`, `remark`, `create_time`)
SELECT 2, 2, 246, 4, 'kg/km', '切割-铝合金线', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_standard` WHERE `dept_type`=2 AND `process_id`=2 AND `product_model_id`=246);
-- 3.5 æŠ˜ç®—率配置(工序 + å‘˜å·¥ï¼‰
-- 2.3 æŠ˜ç®—率配置(工序+员工)
INSERT INTO `production_costing_factor` (`process_id`, `staff_id`, `staff_name`, `violin_factor`, `viola_factor`, `bass_factor`, `remark`, `create_time`)
VALUES (27, 1, '管理员账号', 1, 3, 6, '冷工艺-折算率', NOW()),
       (28, 1, '管理员账号', 1, 2, 4, '硫化-折算率', NOW());
SELECT 27, 1, '管理员账号', 1, 3, 6, '冷工艺-折算率', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_factor` WHERE `process_id`=27 AND `staff_id`=1);
INSERT INTO `production_costing_factor` (`process_id`, `staff_id`, `staff_name`, `violin_factor`, `viola_factor`, `bass_factor`, `remark`, `create_time`)
SELECT 28, 1, '管理员账号', 1, 2, 4, '硫化-折算率', NOW() WHERE NOT EXISTS (SELECT 1 FROM `production_costing_factor` WHERE `process_id`=28 AND `staff_id`=1);
-- 3.6 ä¹å™¨æ¼”示数据(小提琴/大提琴/贝斯),用于展示成品部门折算效果
-- 2.4 ä¹å™¨æ¼”示数据(小提琴/大提琴/贝斯)+ æŠ¥å·¥é“¾
INSERT INTO `product` (`id`, `parent_id`, `product_name`, `create_user`, `dept_id`)
VALUES (510, 276, '小提琴', 1, 220),
       (511, 276, '大提琴', 1, 220),
       (512, 276, '贝斯', 1, 220);
SELECT 510, 276, '小提琴', 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `product` WHERE `id` = 510);
INSERT INTO `product` (`id`, `parent_id`, `product_name`, `create_user`, `dept_id`)
SELECT 511, 276, '大提琴', 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `product` WHERE `id` = 511);
INSERT INTO `product` (`id`, `parent_id`, `product_name`, `create_user`, `dept_id`)
SELECT 512, 276, '贝斯', 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `product` WHERE `id` = 512);
INSERT INTO `product_model` (`id`, `product_id`, `model`, `unit`, `create_user`, `dept_id`)
VALUES (5001, 510, 'VIOLIN-STD', '把', 1, 220),
       (5002, 511, 'CELLO-STD', '把', 1, 220),
       (5003, 512, 'BASS-STD', '把', 1, 220);
SELECT 5001, 510, 'VIOLIN-STD', '把', 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `product_model` WHERE `id` = 5001);
INSERT INTO `product_model` (`id`, `product_id`, `model`, `unit`, `create_user`, `dept_id`)
SELECT 5002, 511, 'CELLO-STD', '把', 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `product_model` WHERE `id` = 5002);
INSERT INTO `product_model` (`id`, `product_id`, `model`, `unit`, `create_user`, `dept_id`)
SELECT 5003, 512, 'BASS-STD', '把', 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `product_model` WHERE `id` = 5003);
-- æŠ¥å·¥é“¾ï¼šè®¢å• -> å·¥è‰ºè·¯çº¿å·¥åº -> å·¥å• -> æŠ¥å·¥ -> äº§å‡º
INSERT INTO `production_order` (`id`, `product_model_id`, `technology_routing_id`, `nps_no`, `quantity`, `create_user`, `dept_id`)
VALUES (5000, 5001, 0, 'DEMO-ORDER-1', 100, 1, 220);
SELECT 5000, 5001, 0, 'DEMO-ORDER-1', 100, 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `production_order` WHERE `id` = 5000);
INSERT INTO `production_order_routing_operation` (`id`, `production_order_id`, `technology_routing_operation_id`, `technology_operation_id`, `operation_name`, `product_model_id`, `type`, `create_user`, `dept_id`)
VALUES (5000, 5000, 0, 27, '冷工艺', 5001, 1, 1, 220);
SELECT 5000, 5000, 0, 27, '冷工艺', 5001, 1, 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `production_order_routing_operation` WHERE `id` = 5000);
INSERT INTO `production_operation_task` (`id`, `production_order_routing_operation_id`, `technology_routing_operation_id`, `work_order_no`, `status`, `production_order_id`, `create_user`, `dept_id`)
VALUES (5000, 5000, 0, 'DEMO-WO-1', 4, 5000, 1, 220);
SELECT 5000, 5000, 0, 'DEMO-WO-1', 4, 5000, 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `production_operation_task` WHERE `id` = 5000);
INSERT INTO `production_product_main` (`id`, `product_no`, `user_id`, `user_name`, `production_operation_task_id`, `status`, `dept_id`, `create_time`, `create_user`, `report_type`, `audit_status`)
VALUES (5000, 'BG-DEMO-001', 1, '管理员账号', 5000, 4, 220, '2026-09-15 10:00:00', 1, 0, 1);
SELECT 5000, 'BG-DEMO-001', 1, '管理员账号', 5000, 4, 100, '2026-09-15 10:00:00', 1, 0, 1 WHERE NOT EXISTS (SELECT 1 FROM `production_product_main` WHERE `id` = 5000);
INSERT INTO `production_product_output` (`production_product_main_id`, `product_model_id`, `quantity`, `scrap_qty`, `create_user`, `dept_id`)
VALUES (5000, 5001, 20, 0, 1, 220),
       (5000, 5002, 10, 0, 1, 220),
       (5000, 5003, 5, 0, 1, 220);
SELECT 5000, 5001, 20, 0, 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `production_product_output` WHERE `production_product_main_id` = 5000 AND `product_model_id` = 5001);
INSERT INTO `production_product_output` (`production_product_main_id`, `product_model_id`, `quantity`, `scrap_qty`, `create_user`, `dept_id`)
SELECT 5000, 5002, 10, 0, 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `production_product_output` WHERE `production_product_main_id` = 5000 AND `product_model_id` = 5002);
INSERT INTO `production_product_output` (`production_product_main_id`, `product_model_id`, `quantity`, `scrap_qty`, `create_user`, `dept_id`)
SELECT 5000, 5003, 5, 0, 1, 100 WHERE NOT EXISTS (SELECT 1 FROM `production_product_output` WHERE `production_product_main_id` = 5000 AND `product_model_id` = 5003);
SELECT '生产核算数据库脚本执行完成' AS result_message;
src/main/java/com/ruoyi/production/controller/ProductionCostingController.java
@@ -7,7 +7,7 @@
import com.ruoyi.production.bean.dto.ProductionCostingQueryDto;
import com.ruoyi.production.bean.vo.ProductionCostingDetailVo;
import com.ruoyi.production.bean.vo.ProductionCostingSummaryVo;
import com.ruoyi.production.pojo.ProductionCostingDept;
import com.ruoyi.production.pojo.ProductionCostingProcess;
import com.ruoyi.production.pojo.ProductionCostingFactor;
import com.ruoyi.production.pojo.ProductionCostingStandard;
import com.ruoyi.production.pojo.ProductionCostingWorkday;
@@ -67,33 +67,33 @@
        util.exportExcel(response, productionCostingService.detailList(dto), "生产核算明细");
    }
    /* ---------------- éƒ¨é—¨ç±»åž‹é…ç½® ---------------- */
    /* ---------------- å·¥åºç±»åž‹é…ç½® ---------------- */
    @GetMapping("/dept/list")
    @Operation(summary = "部门类型配置列表")
    public R<List<ProductionCostingDept>> deptList() {
        return R.ok(productionCostingService.listDept());
    @GetMapping("/process/list")
    @Operation(summary = "工序类型配置列表")
    public R<List<ProductionCostingProcess>> processList(ProductionCostingProcess query) {
        return R.ok(productionCostingService.listProcess(query));
    }
    @PostMapping("/dept")
    @Log(title = "生产核算-部门类型配置新增", businessType = BusinessType.INSERT)
    @Operation(summary = "新增部门类型配置")
    public R<Boolean> deptAdd(@RequestBody ProductionCostingDept dept) {
        return R.ok(productionCostingService.saveDept(dept));
    @PostMapping("/process")
    @Log(title = "生产核算-工序类型配置新增", businessType = BusinessType.INSERT)
    @Operation(summary = "新增工序类型配置")
    public R<Boolean> processAdd(@RequestBody ProductionCostingProcess process) {
        return R.ok(productionCostingService.saveProcess(process));
    }
    @PutMapping("/dept")
    @Log(title = "生产核算-部门类型配置修改", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改部门类型配置")
    public R<Boolean> deptEdit(@RequestBody ProductionCostingDept dept) {
        return R.ok(productionCostingService.updateDept(dept));
    @PutMapping("/process")
    @Log(title = "生产核算-工序类型配置修改", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改工序类型配置")
    public R<Boolean> processEdit(@RequestBody ProductionCostingProcess process) {
        return R.ok(productionCostingService.updateProcess(process));
    }
    @DeleteMapping("/dept/{id}")
    @Log(title = "生产核算-部门类型配置删除", businessType = BusinessType.DELETE)
    @Operation(summary = "删除部门类型配置")
    public R<Boolean> deptRemove(@PathVariable Long id) {
        return R.ok(productionCostingService.removeDept(id));
    @DeleteMapping("/process/{id}")
    @Log(title = "生产核算-工序类型配置删除", businessType = BusinessType.DELETE)
    @Operation(summary = "删除工序类型配置")
    public R<Boolean> processRemove(@PathVariable Long id) {
        return R.ok(productionCostingService.removeProcess(id));
    }
    /* ---------------- æ ‡å‡†æ•°é‡é…ç½® ---------------- */
src/main/java/com/ruoyi/production/mapper/ProductionCostingDeptMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/production/mapper/ProductionCostingProcessMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionCostingProcess;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * ç”Ÿäº§æ ¸ç®—-工序类型配置 Mapper
 */
@Mapper
public interface ProductionCostingProcessMapper extends BaseMapper<ProductionCostingProcess> {
    /**
     * æŸ¥è¯¢å·¥åºç±»åž‹é…ç½®åˆ—表(含工序名称)
     */
    List<ProductionCostingProcess> selectProcessList(@Param("c") ProductionCostingProcess query);
}
src/main/java/com/ruoyi/production/pojo/ProductionCostingProcess.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/pojo/ProductionCostingDept.java ÐÞ¸Ä
@@ -12,12 +12,12 @@
import java.time.LocalDateTime;
/**
 * ç”Ÿäº§æ ¸ç®—-部门类型配置(区分成品部门 / ç™½ç›’部门)
 * ç”Ÿäº§æ ¸ç®—-工序类型配置(直接指定某个工序属于成品 / ç™½ç›’)
 */
@Data
@TableName("production_costing_dept")
@Schema(name = "ProductionCostingDept对象", description = "生产核算-部门类型配置")
public class ProductionCostingDept implements Serializable {
@TableName("production_costing_process")
@Schema(name = "ProductionCostingProcess对象", description = "生产核算-工序类型配置")
public class ProductionCostingProcess implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -25,18 +25,18 @@
    @Schema(description = "主键")
    private Long id;
    @Schema(description = "部门ID")
    private Long deptId;
    @Schema(description = "工序ID(technology_operation.id)")
    private Long processId;
    @Schema(description = "部门类型:1成品部门,2白盒部门")
    @Schema(description = "类型:1成品部门,2白盒部门")
    private Integer deptType;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "部门名称(非数据库字段)")
    @Schema(description = "工序名称(非数据库字段)")
    @TableField(exist = false)
    private String deptName;
    private String processName;
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
src/main/java/com/ruoyi/production/service/ProductionCostingService.java
@@ -3,7 +3,7 @@
import com.ruoyi.production.bean.dto.ProductionCostingQueryDto;
import com.ruoyi.production.bean.vo.ProductionCostingDetailVo;
import com.ruoyi.production.bean.vo.ProductionCostingSummaryVo;
import com.ruoyi.production.pojo.ProductionCostingDept;
import com.ruoyi.production.pojo.ProductionCostingProcess;
import com.ruoyi.production.pojo.ProductionCostingFactor;
import com.ruoyi.production.pojo.ProductionCostingStandard;
import com.ruoyi.production.pojo.ProductionCostingWorkday;
@@ -25,14 +25,14 @@
    /** æœˆä»½å·¥ä½œæ—¥ä¿¡æ¯ */
    Map<String, Object> workdayInfo(String yearMonth);
    /* ---------------- éƒ¨é—¨ç±»åž‹é…ç½® ---------------- */
    List<ProductionCostingDept> listDept();
    /* ---------------- å·¥åºç±»åž‹é…ç½® ---------------- */
    List<ProductionCostingProcess> listProcess(ProductionCostingProcess query);
    boolean saveDept(ProductionCostingDept dept);
    boolean saveProcess(ProductionCostingProcess process);
    boolean updateDept(ProductionCostingDept dept);
    boolean updateProcess(ProductionCostingProcess process);
    boolean removeDept(Long id);
    boolean removeProcess(Long id);
    /* ---------------- æ ‡å‡†æ•°é‡é…ç½® ---------------- */
    List<ProductionCostingStandard> listStandard(ProductionCostingStandard query);
src/main/java/com/ruoyi/production/service/impl/ProductionCostingServiceImpl.java
@@ -5,12 +5,12 @@
import com.ruoyi.production.bean.vo.ProductionCostingDetailVo;
import com.ruoyi.production.bean.vo.ProductionCostingRawVo;
import com.ruoyi.production.bean.vo.ProductionCostingSummaryVo;
import com.ruoyi.production.mapper.ProductionCostingDeptMapper;
import com.ruoyi.production.mapper.ProductionCostingProcessMapper;
import com.ruoyi.production.mapper.ProductionCostingFactorMapper;
import com.ruoyi.production.mapper.ProductionCostingMapper;
import com.ruoyi.production.mapper.ProductionCostingStandardMapper;
import com.ruoyi.production.mapper.ProductionCostingWorkdayMapper;
import com.ruoyi.production.pojo.ProductionCostingDept;
import com.ruoyi.production.pojo.ProductionCostingProcess;
import com.ruoyi.production.pojo.ProductionCostingFactor;
import com.ruoyi.production.pojo.ProductionCostingStandard;
import com.ruoyi.production.pojo.ProductionCostingWorkday;
@@ -51,7 +51,7 @@
    private final ProductionCostingMapper productionCostingMapper;
    private final ProductionCostingStandardMapper standardMapper;
    private final ProductionCostingFactorMapper factorMapper;
    private final ProductionCostingDeptMapper deptMapper;
    private final ProductionCostingProcessMapper processMapper;
    private final ProductionCostingWorkdayMapper workdayMapper;
    @Override
@@ -230,23 +230,23 @@
    /* ================= é…ç½® CRUD ================= */
    @Override
    public List<ProductionCostingDept> listDept() {
        return deptMapper.selectDeptConfigs();
    public List<ProductionCostingProcess> listProcess(ProductionCostingProcess query) {
        return processMapper.selectProcessList(query == null ? new ProductionCostingProcess() : query);
    }
    @Override
    public boolean saveDept(ProductionCostingDept dept) {
        return deptMapper.insert(dept) > 0;
    public boolean saveProcess(ProductionCostingProcess process) {
        return processMapper.insert(process) > 0;
    }
    @Override
    public boolean updateDept(ProductionCostingDept dept) {
        return deptMapper.updateById(dept) > 0;
    public boolean updateProcess(ProductionCostingProcess process) {
        return processMapper.updateById(process) > 0;
    }
    @Override
    public boolean removeDept(Long id) {
        return deptMapper.deleteById(id) > 0;
    public boolean removeProcess(Long id) {
        return processMapper.deleteById(id) > 0;
    }
    @Override
src/main/resources/mapper/production/ProductionCostingDeptMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/production/ProductionCostingMapper.xml
@@ -9,7 +9,7 @@
            date_format(ppm.create_time, '%Y-%m')    as yearMonth,
            too.id                                   as processId,
            too.name                                 as processName,
            cd.dept_type                             as deptType,
            cp.dept_type                             as deptType,
            ppo.product_model_id                     as productModelId,
            p.product_name                           as productName,
            pm.model                                 as modelName,
@@ -18,7 +18,7 @@
        inner join production_operation_task pot on pot.id = ppm.production_operation_task_id
        inner join production_order_routing_operation poro on poro.id = pot.production_order_routing_operation_id
        inner join technology_operation too on too.id = poro.technology_operation_id
        inner join production_costing_dept cd on cd.dept_id = too.dept_id
        inner join production_costing_process cp on cp.process_id = too.id
        inner join production_product_output ppo on ppo.production_product_main_id = ppm.id
        left join product_model pm on pm.id = ppo.product_model_id
        left join product p on p.id = pm.product_id
@@ -27,7 +27,7 @@
            and ppm.report_type in (0, 1)
            <if test="c != null">
                <if test="c.deptType != null">
                    and cd.dept_type = #{c.deptType}
                    and cp.dept_type = #{c.deptType}
                </if>
                <if test="c.yearMonth != null and c.yearMonth != ''">
                    and date_format(ppm.create_time, '%Y-%m') = #{c.yearMonth}
@@ -40,7 +40,7 @@
                </if>
            </if>
        </where>
        group by ppm.user_id, ppm.user_name, yearMonth, too.id, too.name, cd.dept_type, ppo.product_model_id, p.product_name, pm.model
        group by ppm.user_id, ppm.user_name, yearMonth, too.id, too.name, cp.dept_type, ppo.product_model_id, p.product_name, pm.model
        order by yearMonth desc, ppm.user_id, too.id
    </select>
src/main/resources/mapper/production/ProductionCostingProcessMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
<?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.ruoyi.production.mapper.ProductionCostingProcessMapper">
    <select id="selectProcessList" resultType="com.ruoyi.production.pojo.ProductionCostingProcess">
        select p.id, p.process_id, p.dept_type, p.remark,
               p.create_user, p.create_time, p.update_user, p.update_time,
               too.name as processName
        from production_costing_process p
        left join technology_operation too on too.id = p.process_id
        <where>
            <if test="c != null">
                <if test="c.deptType != null">
                    and p.dept_type = #{c.deptType}
                </if>
                <if test="c.processId != null">
                    and p.process_id = #{c.processId}
                </if>
            </if>
        </where>
        order by p.dept_type asc, p.process_id asc
    </select>
</mapper>