From 450fca0c45d3c7a203dd251dbfdc46fccb63eeb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E6=98=8A?= <15984991+wwh2328692301@user.noreply.gitee.com> Date: Tue, 30 Jun 2026 17:58:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E8=AF=84=E5=AE=A1=E6=B5=81=E7=A8=8B=E5=85=A8=E9=87=8F=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增质量评审相关的实体、Mapper、Service、Controller接口与实现 - 新增前端页面与API接口,支持评审单增删改查、提交送审、审批驳回、改判执行 - 新增数据库初始化脚本与字典数据 - 修复vue.config热加载监视系统文件导致的EBUSY错误 - 清理HRM模块API导出注释 --- docs/sql_quality_review_install.sql | 153 ++++ .../db/migration/V15__qc_quality_review.sql | 105 +++ .../controller/QcQualityReviewController.java | 159 ++++ .../klp/mes/qc/domain/QcQualityReview.java | 76 ++ .../mes/qc/domain/QcQualityReviewCoil.java | 74 ++ .../klp/mes/qc/domain/QcQualityReviewLog.java | 45 + .../domain/bo/QcQualityReviewApproveBo.java | 41 + .../mes/qc/domain/bo/QcQualityReviewBo.java | 85 ++ .../qc/domain/bo/QcQualityReviewCoilBo.java | 67 ++ .../qc/domain/vo/QcQualityReviewCoilVo.java | 72 ++ .../qc/domain/vo/QcQualityReviewLogVo.java | 40 + .../mes/qc/domain/vo/QcQualityReviewVo.java | 83 ++ .../qc/mapper/QcQualityReviewCoilMapper.java | 22 + .../qc/mapper/QcQualityReviewLogMapper.java | 22 + .../mes/qc/mapper/QcQualityReviewMapper.java | 35 + .../qc/service/IQcQualityReviewService.java | 82 ++ .../impl/QcQualityReviewServiceImpl.java | 389 +++++++++ .../mapper/qc/QcQualityReviewCoilMapper.xml | 35 + .../mapper/qc/QcQualityReviewLogMapper.xml | 23 + .../mapper/qc/QcQualityReviewMapper.xml | 75 ++ klp-ui/src/api/hrm/index.js | 1 - klp-ui/src/api/mes/qc/qualityReview.js | 94 ++ .../src/views/mes/qc/qualityReview/index.vue | 815 ++++++++++++++++++ .../src/views/mes/qc/qualityReview/todo.vue | 220 +++++ klp-ui/vue.config.js | 4 + 25 files changed, 2816 insertions(+), 1 deletion(-) create mode 100644 docs/sql_quality_review_install.sql create mode 100644 klp-admin/src/main/resources/db/migration/V15__qc_quality_review.sql create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/controller/QcQualityReviewController.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReview.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewCoil.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewLog.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewApproveBo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewBo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewCoilBo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewCoilVo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewLogVo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewVo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewCoilMapper.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewLogMapper.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewMapper.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/service/IQcQualityReviewService.java create mode 100644 klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java create mode 100644 klp-mes/src/main/resources/mapper/qc/QcQualityReviewCoilMapper.xml create mode 100644 klp-mes/src/main/resources/mapper/qc/QcQualityReviewLogMapper.xml create mode 100644 klp-mes/src/main/resources/mapper/qc/QcQualityReviewMapper.xml create mode 100644 klp-ui/src/api/mes/qc/qualityReview.js create mode 100644 klp-ui/src/views/mes/qc/qualityReview/index.vue create mode 100644 klp-ui/src/views/mes/qc/qualityReview/todo.vue diff --git a/docs/sql_quality_review_install.sql b/docs/sql_quality_review_install.sql new file mode 100644 index 000000000..8e9eb8ed9 --- /dev/null +++ b/docs/sql_quality_review_install.sql @@ -0,0 +1,153 @@ +-- ============================================================= +-- 质量评审流程 - 安装脚本 +-- 用法: mysql -h 140.143.206.120 -P 13306 -u klp -p 数据库名 --default-character-set=utf8mb4 < 本文件 +-- ============================================================= +SET NAMES utf8mb4; + +-- ========== 1. 彻底清理所有质量评审相关数据 ========== +-- 删除角色-菜单关联 +DELETE FROM sys_role_menu WHERE menu_id IN (SELECT menu_id FROM sys_menu WHERE perms LIKE '%qualityReview%'); +DELETE FROM sys_role_menu WHERE menu_id IN (SELECT menu_id FROM sys_menu WHERE menu_name = '质量评审' OR menu_name = '质量评审待审批'); +-- 删除菜单本身 +DELETE FROM sys_menu WHERE perms LIKE '%qualityReview%'; +DELETE FROM sys_menu WHERE menu_name = '质量评审'; +DELETE FROM sys_menu WHERE menu_name = '质量评审待审批'; +-- 删除字典 +DELETE FROM sys_dict_data WHERE dict_type = 'quality_review_status'; +DELETE FROM sys_dict_data WHERE dict_type = 'regrade_quality_type'; +DELETE FROM sys_dict_type WHERE dict_type = 'quality_review_status'; +DELETE FROM sys_dict_type WHERE dict_type = 'regrade_quality_type'; +-- 删表 +DROP TABLE IF EXISTS qc_quality_review_log; +DROP TABLE IF EXISTS qc_quality_review_coil; +DROP TABLE IF EXISTS qc_quality_review; + +-- ========== 2. 建表 ========== +CREATE TABLE IF NOT EXISTS `qc_quality_review` ( + `review_id` bigint NOT NULL AUTO_INCREMENT COMMENT '评审单主键', + `review_no` varchar(50) NOT NULL COMMENT '评审单编号', + `product_name` varchar(100) DEFAULT NULL COMMENT '产品名称', + `transmit_dept` varchar(50) DEFAULT NULL COMMENT '传递部门', + `transmit_user` varchar(50) DEFAULT NULL COMMENT '传递人', + `transmit_date` date DEFAULT NULL COMMENT '传递日期', + `prod_date_range` varchar(50) DEFAULT NULL COMMENT '生产日期范围', + `flow_status` tinyint(1) DEFAULT '1' COMMENT '流程状态: 1=待提交 2=待审批 3=已通过 4=已驳回', + `dept_opinion` text COMMENT '品质部评审意见', + `dept_sign` varchar(50) DEFAULT NULL COMMENT '品质部签字人', + `dept_sign_date` date DEFAULT NULL COMMENT '品质部签字日期', + `leader_opinion` text COMMENT '领导审批意见', + `leader_sign` varchar(50) DEFAULT NULL COMMENT '领导签字人', + `leader_sign_date` date DEFAULT NULL COMMENT '领导签字日期', + `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志', + `create_by` varchar(50) DEFAULT NULL, + `create_time` datetime DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(50) DEFAULT NULL, + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`review_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质量评审单'; + +CREATE TABLE IF NOT EXISTS `qc_quality_review_coil` ( + `detail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细主键', + `review_id` bigint NOT NULL COMMENT '关联评审单ID', + `group_seq` int DEFAULT NULL COMMENT '序号', + `group_remark` varchar(200) DEFAULT NULL COMMENT '组备注', + `coil_id` bigint DEFAULT NULL COMMENT '钢卷ID', + `current_coil_no` varchar(50) DEFAULT NULL COMMENT '产品卷号', + `supplier_coil_no` varchar(50) DEFAULT NULL COMMENT '原料卷号', + `spec` varchar(50) DEFAULT NULL COMMENT '规格', + `net_weight` decimal(10,3) DEFAULT NULL COMMENT '卷重(t)', + `defect_desc` text COMMENT '缺陷描述', + `before_quality` varchar(20) DEFAULT NULL COMMENT '改判前质量等级', + `regrade_quality` varchar(50) DEFAULT NULL COMMENT '改判后质量状态', + `execute_status` tinyint(1) DEFAULT '0' COMMENT '执行状态: 0=待执行 1=已执行', + `execute_time` datetime DEFAULT NULL COMMENT '执行时间', + `remark` varchar(500) DEFAULT NULL, + `del_flag` tinyint(1) DEFAULT '0', + `create_by` varchar(50) DEFAULT NULL, + `create_time` datetime DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(50) DEFAULT NULL, + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`detail_id`), + KEY `idx_review_id` (`review_id`), + KEY `idx_coil_id` (`coil_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质量评审钢卷明细'; + +CREATE TABLE IF NOT EXISTS `qc_quality_review_log` ( + `log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `review_id` bigint NOT NULL COMMENT '关联评审单ID', + `action` varchar(20) NOT NULL COMMENT '动作: submit/approve/reject', + `operator` varchar(50) DEFAULT NULL COMMENT '操作人', + `opinion` text COMMENT '审批意见', + `operate_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `create_by` varchar(50) DEFAULT NULL, + `create_time` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`log_id`), + KEY `idx_review_id` (`review_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质量评审审批日志'; + +-- ========== 3. 字典 ========== +INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark) +VALUES ('Quality Review Status', 'quality_review_status', '0', 'admin', NOW(), 'admin', NOW(), ''); +INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark) +VALUES ('Regrade Quality Type', 'regrade_quality_type', '0', 'admin', NOW(), 'admin', NOW(), ''); + +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (1, '待提交', '1', 'quality_review_status', '', 'info', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW()); + +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()); +INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()); + +-- ========== 4. 创建菜单 ========== +-- 父菜单: 质量模块 (path=quality, menu_id=2068954238598967297) +SET @parent_id = 2068954238598967297; +SET @max_order = (SELECT COALESCE(MAX(order_num), 0) FROM sys_menu WHERE parent_id = @parent_id); +SET @max_id = (SELECT COALESCE(MAX(menu_id), 0) FROM sys_menu); + +SET @id1 = @max_id + 1; +SET @id2 = @max_id + 2; +SET @id3 = @max_id + 3; +SET @id4 = @max_id + 4; +SET @id5 = @max_id + 5; +SET @id6 = @max_id + 6; +SET @id7 = @max_id + 7; +SET @id8 = @max_id + 8; + +-- 质量评审菜单 (type=C 菜单) +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) +VALUES (@id1, '质量评审', @parent_id, @max_order + 1, 'qualityReview', 'mes/qc/qualityReview/index', 1, 0, 'C', '0', '0', 'qc:qualityReview:list', 'guide', 'admin', NOW()); + +-- 质量评审待审批 (type=C 隐藏) +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) +VALUES (@id2, '质量评审待审批', @parent_id, @max_order + 2, 'qualityReviewTodo', 'mes/qc/qualityReview/todo', 1, 0, 'C', '1', '0', 'qc:qualityReview:approve', 'checkbox', 'admin', NOW()); + +-- 按钮权限 (type=F) +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES (@id3, '质量评审新增', @id1, 1, 'F', '0', '0', 'qc:qualityReview:add', 'admin', NOW()); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES (@id4, '质量评审修改', @id1, 2, 'F', '0', '0', 'qc:qualityReview:edit', 'admin', NOW()); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES (@id5, '质量评审删除', @id1, 3, 'F', '0', '0', 'qc:qualityReview:delete', 'admin', NOW()); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES (@id6, '质量评审提交送审', @id1, 4, 'F', '0', '0', 'qc:qualityReview:submit', 'admin', NOW()); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES (@id7, '质量评审审批', @id1, 5, 'F', '0', '0', 'qc:qualityReview:approve', 'admin', NOW()); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time) +VALUES (@id8, '质量评审执行改判', @id1, 6, 'F', '0', '0', 'qc:qualityReview:execute', 'admin', NOW()); + +-- ========== 5. 授权 admin 角色 ========== +INSERT IGNORE INTO sys_role_menu (role_id, menu_id) VALUES +(1, @parent_id), (1, @id1), (1, @id2), +(1, @id3), (1, @id4), (1, @id5), +(1, @id6), (1, @id7), (1, @id8); + +-- ========== 6. 验证 ========== +SELECT CONCAT('Tables: ', COUNT(*)) AS result FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE 'qc_quality_review%'; +SELECT CONCAT('Dict: ', dict_type) AS result FROM sys_dict_type WHERE dict_type = 'quality_review_status'; +SELECT CONCAT('Menu: ', menu_name, ' -> parent_id=', parent_id) AS result FROM sys_menu WHERE perms = 'qc:qualityReview:list'; diff --git a/klp-admin/src/main/resources/db/migration/V15__qc_quality_review.sql b/klp-admin/src/main/resources/db/migration/V15__qc_quality_review.sql new file mode 100644 index 000000000..d6c5931b3 --- /dev/null +++ b/klp-admin/src/main/resources/db/migration/V15__qc_quality_review.sql @@ -0,0 +1,105 @@ +-- ------------------------------------------------------------ +-- 质量评审流程 - 异常产品评审审批单 +-- V15__qc_quality_review.sql +-- ------------------------------------------------------------ + +-- 1. 字典类型 +INSERT INTO `sys_dict_type` VALUES (NULL, '质量评审状态', 'quality_review_status', '0', 'admin', NOW(), '', NULL, '质量评审单流程状态'); +INSERT INTO `sys_dict_type` VALUES (NULL, '改判后质量状态', 'regrade_quality_type', '0', 'admin', NOW(), '', NULL, '领导审批时指定的改判结果'); + +-- 2. 字典数据 - 质量评审状态 +INSERT INTO `sys_dict_data` VALUES (NULL, 1, '待提交', '1', 'quality_review_status', '', 'info', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW(), '', NULL, ''); + +-- 3. 字典数据 - 改判后质量状态 +INSERT INTO `sys_dict_data` VALUES (NULL, 1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, ''); +INSERT INTO `sys_dict_data` VALUES (NULL, 5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, ''); + +-- 4. 质量评审主表 +CREATE TABLE `qc_quality_review` ( + `review_id` bigint NOT NULL AUTO_INCREMENT COMMENT '评审单主键', + `review_no` varchar(50) NOT NULL COMMENT '评审单编号(QR-2026-XXXX)', + `product_name` varchar(100) DEFAULT NULL COMMENT '产品名称', + `transmit_dept` varchar(50) DEFAULT '品质部' COMMENT '传递部门', + `transmit_user` varchar(50) DEFAULT NULL COMMENT '传递人', + `transmit_date` date DEFAULT NULL COMMENT '传递日期', + `prod_date_range` varchar(50) DEFAULT NULL COMMENT '生产日期范围', + + -- 流程状态 + `flow_status` tinyint(1) DEFAULT '1' COMMENT '流程状态:1=待提交 2=待审批 3=已通过 4=已驳回', + + -- 品质部评审 + `dept_opinion` text COMMENT '品质部评审意见', + `dept_sign` varchar(50) DEFAULT NULL COMMENT '品质部签字人', + `dept_sign_date` date DEFAULT NULL COMMENT '品质部签字日期', + + -- 领导审批 + `leader_opinion` text COMMENT '领导审批意见', + `leader_sign` varchar(50) DEFAULT NULL COMMENT '领导签字人', + `leader_sign_date` date DEFAULT NULL COMMENT '领导签字日期', + `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因', + + -- 公共基础字段 + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志(0=正常,1=已删除)', + `create_by` varchar(50) DEFAULT '' COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(50) DEFAULT '' COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`review_id`) USING BTREE, + UNIQUE KEY `uk_review_no` (`review_no`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='质量评审单'; + +-- 5. 质量评审钢卷明细表 +CREATE TABLE `qc_quality_review_coil` ( + `detail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细主键', + `review_id` bigint NOT NULL COMMENT '关联评审单ID', + + -- 钢卷分组信息 + `group_seq` int DEFAULT NULL COMMENT '序号(1,2,3...)', + `group_remark` varchar(200) DEFAULT NULL COMMENT '组备注(如"含3个钢卷")', + + -- 钢卷信息 + `coil_id` bigint DEFAULT NULL COMMENT '钢卷ID(关联wms_material_coil)', + `current_coil_no` varchar(50) DEFAULT NULL COMMENT '产品卷号', + `supplier_coil_no` varchar(50) DEFAULT NULL COMMENT '原料卷号', + `spec` varchar(50) DEFAULT NULL COMMENT '规格(如1.35×1250)', + `net_weight` decimal(10,3) DEFAULT NULL COMMENT '卷重(t)', + + -- 缺陷与改判 + `defect_desc` text COMMENT '缺陷描述', + `before_quality` varchar(20) DEFAULT NULL COMMENT '改判前质量等级(系统自动带出)', + `regrade_quality` varchar(50) DEFAULT NULL COMMENT '改判后质量状态(字典:regrade_quality_type)', + `execute_status` tinyint(1) DEFAULT '0' COMMENT '执行状态:0=待执行 1=已执行', + `execute_time` datetime DEFAULT NULL COMMENT '执行时间', + + -- 公共基础字段 + `remark` varchar(500) DEFAULT NULL, + `del_flag` tinyint(1) DEFAULT '0', + `create_by` varchar(50) DEFAULT '', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(50) DEFAULT '', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`detail_id`) USING BTREE, + KEY `idx_review_id` (`review_id`) USING BTREE, + KEY `idx_coil_id` (`coil_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='质量评审钢卷明细'; + +-- 6. 质量评审审批日志表 +CREATE TABLE `qc_quality_review_log` ( + `log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `review_id` bigint NOT NULL COMMENT '关联评审单ID', + `action` varchar(20) NOT NULL COMMENT '动作:submit=提交 approve=通过 reject=驳回', + `operator` varchar(50) DEFAULT NULL COMMENT '操作人', + `opinion` text COMMENT '审批意见', + `operate_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `create_by` varchar(50) DEFAULT '', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`log_id`) USING BTREE, + KEY `idx_review_id` (`review_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='质量评审审批日志'; diff --git a/klp-mes/src/main/java/com/klp/mes/qc/controller/QcQualityReviewController.java b/klp-mes/src/main/java/com/klp/mes/qc/controller/QcQualityReviewController.java new file mode 100644 index 000000000..ef41a2813 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/controller/QcQualityReviewController.java @@ -0,0 +1,159 @@ +package com.klp.mes.qc.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.mes.qc.domain.bo.QcQualityReviewApproveBo; +import com.klp.mes.qc.domain.bo.QcQualityReviewBo; +import com.klp.mes.qc.domain.vo.QcQualityReviewCoilVo; +import com.klp.mes.qc.domain.vo.QcQualityReviewLogVo; +import com.klp.mes.qc.domain.vo.QcQualityReviewVo; +import com.klp.mes.qc.service.IQcQualityReviewService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 质量评审单Controller + * + * @author klp + * @date 2026-06-30 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/qc/qualityReview") +public class QcQualityReviewController extends BaseController { + + private final IQcQualityReviewService iQcQualityReviewService; + + /** + * 查询质量评审单列表 + */ + @GetMapping("/list") + public TableDataInfo list(QcQualityReviewBo bo, PageQuery pageQuery) { + return iQcQualityReviewService.queryPageList(bo, pageQuery); + } + + /** + * 导出质量评审单列表 + */ + @Log(title = "质量评审单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(QcQualityReviewBo bo, HttpServletResponse response) { + List list = iQcQualityReviewService.queryList(bo); + ExcelUtil.exportExcel(list, "质量评审单", QcQualityReviewVo.class, response); + } + + /** + * 获取质量评审单详细信息 + */ + @GetMapping("/{reviewId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long reviewId) { + return R.ok(iQcQualityReviewService.queryById(reviewId)); + } + + /** + * 新增质量评审单 + */ + @Log(title = "质量评审单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody QcQualityReviewBo bo) { + return toAjax(iQcQualityReviewService.insertByBo(bo)); + } + + /** + * 修改质量评审单 + */ + @Log(title = "质量评审单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody QcQualityReviewBo bo) { + return toAjax(iQcQualityReviewService.updateByBo(bo)); + } + + /** + * 删除质量评审单 + */ + @Log(title = "质量评审单", businessType = BusinessType.DELETE) + @DeleteMapping("/{reviewIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] reviewIds) { + return toAjax(iQcQualityReviewService.deleteWithValidByIds(Arrays.asList(reviewIds), true)); + } + + // ==================== 业务操作 ==================== + + /** + * 提交送审 + */ + @Log(title = "质量评审单", businessType = BusinessType.UPDATE) + @PostMapping("/submit/{reviewId}") + public R submit(@NotNull(message = "主键不能为空") + @PathVariable Long reviewId) { + return toAjax(iQcQualityReviewService.submit(reviewId)); + } + + /** + * 审批通过 + */ + @Log(title = "质量评审单", businessType = BusinessType.UPDATE) + @PostMapping("/approve") + public R approve(@Validated @RequestBody QcQualityReviewApproveBo bo) { + return toAjax(iQcQualityReviewService.approve(bo)); + } + + /** + * 驳回 + */ + @Log(title = "质量评审单", businessType = BusinessType.UPDATE) + @PostMapping("/reject/{reviewId}") + public R reject(@NotNull(message = "主键不能为空") + @PathVariable Long reviewId, + @RequestParam String reason) { + return toAjax(iQcQualityReviewService.reject(reviewId, reason)); + } + + /** + * 执行改判 + */ + @Log(title = "质量评审单", businessType = BusinessType.UPDATE) + @PostMapping("/execute/{reviewId}") + public R execute(@NotNull(message = "主键不能为空") + @PathVariable Long reviewId) { + return toAjax(iQcQualityReviewService.execute(reviewId)); + } + + /** + * 查询钢卷明细列表 + */ + @GetMapping("/coilList/{reviewId}") + public R> coilList(@NotNull(message = "主键不能为空") + @PathVariable Long reviewId) { + return R.ok(iQcQualityReviewService.queryCoilListByReviewId(reviewId)); + } + + /** + * 查询审批日志列表 + */ + @GetMapping("/logList/{reviewId}") + public R> logList(@NotNull(message = "主键不能为空") + @PathVariable Long reviewId) { + return R.ok(iQcQualityReviewService.queryLogListByReviewId(reviewId)); + } +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReview.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReview.java new file mode 100644 index 000000000..da386f74f --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReview.java @@ -0,0 +1,76 @@ +package com.klp.mes.qc.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 质量评审单对象 qc_quality_review + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("qc_quality_review") +public class QcQualityReview extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 评审单主键 */ + @TableId(value = "review_id") + private Long reviewId; + + /** 评审单编号 */ + private String reviewNo; + + /** 产品名称 */ + private String productName; + + /** 传递部门 */ + private String transmitDept; + + /** 传递人 */ + private String transmitUser; + + /** 传递日期 */ + private Date transmitDate; + + /** 生产日期范围 */ + private String prodDateRange; + + /** 流程状态:1=待提交 2=待审批 3=已通过 4=已驳回 */ + private Long flowStatus; + + /** 品质部评审意见 */ + private String deptOpinion; + + /** 品质部签字人 */ + private String deptSign; + + /** 品质部签字日期 */ + private Date deptSignDate; + + /** 领导审批意见 */ + private String leaderOpinion; + + /** 领导签字人 */ + private String leaderSign; + + /** 领导签字日期 */ + private Date leaderSignDate; + + /** 驳回原因 */ + private String rejectReason; + + /** 备注 */ + private String remark; + + /** 删除标志(0=正常,1=已删除) */ + @TableLogic + private Integer delFlag; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewCoil.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewCoil.java new file mode 100644 index 000000000..cf8f3a68c --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewCoil.java @@ -0,0 +1,74 @@ +package com.klp.mes.qc.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 质量评审钢卷明细对象 qc_quality_review_coil + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("qc_quality_review_coil") +public class QcQualityReviewCoil extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 明细主键 */ + @TableId(value = "detail_id") + private Long detailId; + + /** 关联评审单ID */ + private Long reviewId; + + /** 序号 */ + private Integer groupSeq; + + /** 组备注 */ + private String groupRemark; + + /** 钢卷ID */ + private Long coilId; + + /** 产品卷号 */ + private String currentCoilNo; + + /** 原料卷号 */ + private String supplierCoilNo; + + /** 规格 */ + private String spec; + + /** 卷重(t) */ + private BigDecimal netWeight; + + /** 缺陷描述 */ + private String defectDesc; + + /** 改判前质量等级 */ + private String beforeQuality; + + /** 改判后质量状态(字典:regrade_quality_type) */ + private String regradeQuality; + + /** 执行状态:0=待执行 1=已执行 */ + private Long executeStatus; + + /** 执行时间 */ + private Date executeTime; + + /** 备注 */ + private String remark; + + /** 删除标志(0=正常,1=已删除) */ + @TableLogic + private Integer delFlag; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewLog.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewLog.java new file mode 100644 index 000000000..5cacdde9a --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/QcQualityReviewLog.java @@ -0,0 +1,45 @@ +package com.klp.mes.qc.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.util.Date; + +/** + * 质量评审审批日志对象 qc_quality_review_log + * + * @author klp + * @date 2026-06-30 + */ +@Data +@TableName("qc_quality_review_log") +public class QcQualityReviewLog { + + private static final long serialVersionUID = 1L; + + /** 日志主键 */ + @TableId(value = "log_id") + private Long logId; + + /** 关联评审单ID */ + private Long reviewId; + + /** 动作:submit=提交 approve=通过 reject=驳回 */ + private String action; + + /** 操作人 */ + private String operator; + + /** 审批意见 */ + private String opinion; + + /** 操作时间 */ + private Date operateTime; + + /** 创建人 */ + private String createBy; + + /** 创建时间 */ + private Date createTime; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewApproveBo.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewApproveBo.java new file mode 100644 index 000000000..832fbe36e --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewApproveBo.java @@ -0,0 +1,41 @@ +package com.klp.mes.qc.domain.bo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 质量评审审批参数(领导审批时使用) + * + * @author klp + * @date 2026-06-30 + */ +@Data +public class QcQualityReviewApproveBo { + + /** 评审单ID */ + @NotNull(message = "评审单ID不能为空") + private Long reviewId; + + /** 领导审批意见 */ + private String leaderOpinion; + + /** 领导签字人 */ + private String leaderSign; + + /** 各钢卷的改判状态 */ + private List coilRegradeList; + + @Data + public static class CoilRegradeBo { + /** 明细ID */ + @NotNull(message = "钢卷明细ID不能为空") + private Long detailId; + + /** 改判后质量状态 */ + @NotBlank(message = "改判后质量状态不能为空") + private String regradeQuality; + } +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewBo.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewBo.java new file mode 100644 index 000000000..ee8d9de63 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewBo.java @@ -0,0 +1,85 @@ +package com.klp.mes.qc.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +/** + * 质量评审单业务对象 qc_quality_review + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QcQualityReviewBo extends BaseEntity { + + /** 评审单主键 */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long reviewId; + + /** 评审单编号 */ + private String reviewNo; + + /** 产品名称 */ + @NotBlank(message = "产品名称不能为空", groups = {AddGroup.class}) + private String productName; + + /** 传递部门 */ + private String transmitDept; + + /** 传递人 */ + private String transmitUser; + + /** 传递日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date transmitDate; + + /** 生产日期范围 */ + private String prodDateRange; + + /** 流程状态 */ + private Long flowStatus; + + /** 品质部评审意见 */ + private String deptOpinion; + + /** 品质部签字人 */ + private String deptSign; + + /** 品质部签字日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date deptSignDate; + + /** 领导审批意见 */ + private String leaderOpinion; + + /** 领导签字人 */ + private String leaderSign; + + /** 领导签字日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date leaderSignDate; + + /** 驳回原因 */ + private String rejectReason; + + /** 备注 */ + private String remark; + + /** 钢卷明细列表 */ + private List coilList; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewCoilBo.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewCoilBo.java new file mode 100644 index 000000000..a9c304d05 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/bo/QcQualityReviewCoilBo.java @@ -0,0 +1,67 @@ +package com.klp.mes.qc.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 质量评审钢卷明细业务对象 qc_quality_review_coil + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QcQualityReviewCoilBo extends BaseEntity { + + /** 明细主键 */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long detailId; + + /** 关联评审单ID */ + private Long reviewId; + + /** 序号 */ + private Integer groupSeq; + + /** 组备注 */ + private String groupRemark; + + /** 钢卷ID */ + @NotNull(message = "钢卷不能为空", groups = {AddGroup.class}) + private Long coilId; + + /** 产品卷号 */ + private String currentCoilNo; + + /** 原料卷号 */ + private String supplierCoilNo; + + /** 规格 */ + private String spec; + + /** 卷重(t) */ + private BigDecimal netWeight; + + /** 缺陷描述 */ + private String defectDesc; + + /** 改判前质量等级 */ + private String beforeQuality; + + /** 改判后质量状态 */ + private String regradeQuality; + + /** 执行状态 */ + private Long executeStatus; + + /** 备注 */ + private String remark; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewCoilVo.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewCoilVo.java new file mode 100644 index 000000000..21e203f75 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewCoilVo.java @@ -0,0 +1,72 @@ +package com.klp.mes.qc.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 质量评审钢卷明细视图对象 qc_quality_review_coil + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QcQualityReviewCoilVo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 明细主键 */ + private Long detailId; + + /** 关联评审单ID */ + private Long reviewId; + + /** 序号 */ + private Integer groupSeq; + + /** 组备注 */ + private String groupRemark; + + /** 钢卷ID */ + private Long coilId; + + /** 产品卷号 */ + private String currentCoilNo; + + /** 原料卷号 */ + private String supplierCoilNo; + + /** 规格 */ + private String spec; + + /** 卷重(t) */ + private BigDecimal netWeight; + + /** 缺陷描述 */ + private String defectDesc; + + /** 改判前质量等级 */ + private String beforeQuality; + + /** 改判后质量状态 */ + private String regradeQuality; + + /** 执行状态 */ + private Long executeStatus; + + /** 执行时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date executeTime; + + /** 备注 */ + private String remark; + + /** 删除标志 */ + private Integer delFlag; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewLogVo.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewLogVo.java new file mode 100644 index 000000000..2a510dfac --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewLogVo.java @@ -0,0 +1,40 @@ +package com.klp.mes.qc.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * 质量评审审批日志视图对象 + * + * @author klp + * @date 2026-06-30 + */ +@Data +public class QcQualityReviewLogVo { + + /** 日志主键 */ + private Long logId; + + /** 关联评审单ID */ + private Long reviewId; + + /** 动作:submit=提交 approve=通过 reject=驳回 */ + private String action; + + /** 操作人 */ + private String operator; + + /** 审批意见 */ + private String opinion; + + /** 操作时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date operateTime; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewVo.java b/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewVo.java new file mode 100644 index 000000000..1930bc248 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/domain/vo/QcQualityReviewVo.java @@ -0,0 +1,83 @@ +package com.klp.mes.qc.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +/** + * 质量评审单视图对象 qc_quality_review + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QcQualityReviewVo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 评审单主键 */ + private Long reviewId; + + /** 评审单编号 */ + private String reviewNo; + + /** 产品名称 */ + private String productName; + + /** 传递部门 */ + private String transmitDept; + + /** 传递人 */ + private String transmitUser; + + /** 传递日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date transmitDate; + + /** 生产日期范围 */ + private String prodDateRange; + + /** 流程状态 */ + private Long flowStatus; + + /** 品质部评审意见 */ + private String deptOpinion; + + /** 品质部签字人 */ + private String deptSign; + + /** 品质部签字日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deptSignDate; + + /** 领导审批意见 */ + private String leaderOpinion; + + /** 领导签字人 */ + private String leaderSign; + + /** 领导签字日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date leaderSignDate; + + /** 驳回原因 */ + private String rejectReason; + + /** 备注 */ + private String remark; + + /** 删除标志 */ + private Integer delFlag; + + /** 钢卷明细列表 */ + private List coilList; + + /** 审批日志列表 */ + private List logList; + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewCoilMapper.java b/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewCoilMapper.java new file mode 100644 index 000000000..7379eb337 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewCoilMapper.java @@ -0,0 +1,22 @@ +package com.klp.mes.qc.mapper; + +import com.klp.mes.qc.domain.QcQualityReviewCoil; +import com.klp.mes.qc.domain.vo.QcQualityReviewCoilVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * 质量评审钢卷明细Mapper接口 + * + * @author klp + * @date 2026-06-30 + */ +public interface QcQualityReviewCoilMapper extends BaseMapper { + + /** + * 根据评审单ID查询钢卷明细列表 + */ + List selectVoListByReviewId(Long reviewId); + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewLogMapper.java b/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewLogMapper.java new file mode 100644 index 000000000..7fa432069 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewLogMapper.java @@ -0,0 +1,22 @@ +package com.klp.mes.qc.mapper; + +import com.klp.mes.qc.domain.QcQualityReviewLog; +import com.klp.mes.qc.domain.vo.QcQualityReviewLogVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * 质量评审审批日志Mapper接口 + * + * @author klp + * @date 2026-06-30 + */ +public interface QcQualityReviewLogMapper extends BaseMapper { + + /** + * 根据评审单ID查询审批日志列表 + */ + List selectVoListByReviewId(Long reviewId); + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewMapper.java b/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewMapper.java new file mode 100644 index 000000000..87bd77530 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/mapper/QcQualityReviewMapper.java @@ -0,0 +1,35 @@ +package com.klp.mes.qc.mapper; + +import com.klp.mes.qc.domain.QcQualityReview; +import com.klp.mes.qc.domain.vo.QcQualityReviewVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 质量评审单Mapper接口 + * + * @author klp + * @date 2026-06-30 + */ +public interface QcQualityReviewMapper extends BaseMapper { + + /** + * 分页查询评审单列表(含状态字典值) + */ + Page selectVoPage(IPage page, @Param("vo") QcQualityReviewVo vo); + + /** + * 查询评审单详情 + */ + QcQualityReviewVo selectVoById(@Param("reviewId") Long reviewId); + + /** + * 查询评审单列表 + */ + List selectVoList(@Param("vo") QcQualityReviewVo vo); + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/service/IQcQualityReviewService.java b/klp-mes/src/main/java/com/klp/mes/qc/service/IQcQualityReviewService.java new file mode 100644 index 000000000..695348139 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/service/IQcQualityReviewService.java @@ -0,0 +1,82 @@ +package com.klp.mes.qc.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.mes.qc.domain.bo.QcQualityReviewApproveBo; +import com.klp.mes.qc.domain.bo.QcQualityReviewBo; +import com.klp.mes.qc.domain.vo.QcQualityReviewVo; +import com.klp.mes.qc.domain.vo.QcQualityReviewCoilVo; +import com.klp.mes.qc.domain.vo.QcQualityReviewLogVo; + +import java.util.Collection; +import java.util.List; + +/** + * 质量评审单Service接口 + * + * @author klp + * @date 2026-06-30 + */ +public interface IQcQualityReviewService { + + /** + * 查询评审单详情 + */ + QcQualityReviewVo queryById(Long reviewId); + + /** + * 分页查询评审单列表 + */ + TableDataInfo queryPageList(QcQualityReviewBo bo, PageQuery pageQuery); + + /** + * 查询评审单列表 + */ + List queryList(QcQualityReviewBo bo); + + /** + * 创建评审单 + */ + Boolean insertByBo(QcQualityReviewBo bo); + + /** + * 修改评审单 + */ + Boolean updateByBo(QcQualityReviewBo bo); + + /** + * 批量删除评审单 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 提交送审(flowStatus: 1→2) + */ + Boolean submit(Long reviewId); + + /** + * 审批通过(flowStatus: 2→3) + */ + Boolean approve(QcQualityReviewApproveBo bo); + + /** + * 驳回(flowStatus: 2→4) + */ + Boolean reject(Long reviewId, String reason); + + /** + * 执行改判(写改判记录 + 更新钢卷状态) + */ + Boolean execute(Long reviewId); + + /** + * 查询钢卷明细列表 + */ + List queryCoilListByReviewId(Long reviewId); + + /** + * 查询审批日志列表 + */ + List queryLogListByReviewId(Long reviewId); + +} diff --git a/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java b/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java new file mode 100644 index 000000000..460b9cb61 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java @@ -0,0 +1,389 @@ +package com.klp.mes.qc.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.domain.WmsCoilQualityRejudge; +import com.klp.domain.WmsMaterialCoil; +import com.klp.mapper.WmsCoilQualityRejudgeMapper; +import com.klp.mapper.WmsMaterialCoilMapper; +import com.klp.mes.qc.domain.QcQualityReview; +import com.klp.mes.qc.domain.QcQualityReviewCoil; +import com.klp.mes.qc.domain.QcQualityReviewLog; +import com.klp.mes.qc.domain.bo.QcQualityReviewApproveBo; +import com.klp.mes.qc.domain.bo.QcQualityReviewBo; +import com.klp.mes.qc.domain.bo.QcQualityReviewCoilBo; +import com.klp.mes.qc.domain.vo.QcQualityReviewCoilVo; +import com.klp.mes.qc.domain.vo.QcQualityReviewLogVo; +import com.klp.mes.qc.domain.vo.QcQualityReviewVo; +import com.klp.mes.qc.mapper.QcQualityReviewCoilMapper; +import com.klp.mes.qc.mapper.QcQualityReviewLogMapper; +import com.klp.mes.qc.mapper.QcQualityReviewMapper; +import com.klp.mes.qc.service.IQcQualityReviewService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 质量评审单Service业务层处理 + * + * @author klp + * @date 2026-06-30 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class QcQualityReviewServiceImpl implements IQcQualityReviewService { + + private final QcQualityReviewMapper baseMapper; + private final QcQualityReviewCoilMapper coilMapper; + private final QcQualityReviewLogMapper logMapper; + private final WmsMaterialCoilMapper wmsMaterialCoilMapper; + private final WmsCoilQualityRejudgeMapper wmsCoilQualityRejudgeMapper; + + /** + * 查询评审单详情(含钢卷明细和审批日志) + */ + @Override + public QcQualityReviewVo queryById(Long reviewId) { + QcQualityReviewVo vo = baseMapper.selectVoById(reviewId); + if (vo != null) { + vo.setCoilList(coilMapper.selectVoListByReviewId(reviewId)); + vo.setLogList(logMapper.selectVoListByReviewId(reviewId)); + } + return vo; + } + + /** + * 分页查询评审单列表 + */ + @Override + public TableDataInfo queryPageList(QcQualityReviewBo bo, PageQuery pageQuery) { + QcQualityReviewVo queryVo = new QcQualityReviewVo(); + BeanUtil.copyProperties(bo, queryVo); + Page result = baseMapper.selectVoPage(pageQuery.build(), queryVo); + return TableDataInfo.build(result); + } + + /** + * 查询评审单列表 + */ + @Override + public List queryList(QcQualityReviewBo bo) { + QcQualityReviewVo queryVo = new QcQualityReviewVo(); + BeanUtil.copyProperties(bo, queryVo); + return baseMapper.selectVoList(queryVo); + } + + /** + * 创建评审单(草稿状态) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(QcQualityReviewBo bo) { + // 1. 保存主表 + QcQualityReview add = BeanUtil.toBean(bo, QcQualityReview.class); + // 设置默认值 + add.setFlowStatus(1L); // 1=待提交 + add.setReviewNo(generateReviewNo()); + if (StringUtils.isBlank(add.getTransmitDept())) { + add.setTransmitDept("品质部"); + } + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReviewId(add.getReviewId()); + // 2. 保存钢卷明细 + if (CollUtil.isNotEmpty(bo.getCoilList())) { + saveCoilList(add.getReviewId(), bo.getCoilList()); + } + } + return flag; + } + + /** + * 修改评审单(仅草稿状态可修改) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(QcQualityReviewBo bo) { + QcQualityReview update = BeanUtil.toBean(bo, QcQualityReview.class); + validEntityBeforeSave(update); + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + // 先删除原有明细,再重新插入 + coilMapper.delete(Wrappers.lambdaQuery() + .eq(QcQualityReviewCoil::getReviewId, bo.getReviewId())); + if (CollUtil.isNotEmpty(bo.getCoilList())) { + saveCoilList(bo.getReviewId(), bo.getCoilList()); + } + } + return flag; + } + + /** + * 批量删除评审单 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 校验:只能删除待提交状态的 + for (Long id : ids) { + QcQualityReview review = baseMapper.selectById(id); + if (review != null && !Long.valueOf(1L).equals(review.getFlowStatus())) { + throw new RuntimeException("评审单【" + review.getReviewNo() + "】不是待提交状态,无法删除"); + } + } + } + // 级联删除钢卷明细 + coilMapper.delete(Wrappers.lambdaQuery() + .in(QcQualityReviewCoil::getReviewId, ids)); + // 删除审批日志 + logMapper.delete(Wrappers.lambdaQuery() + .in(QcQualityReviewLog::getReviewId, ids)); + // 删除主表 + return baseMapper.deleteBatchIds(ids) > 0; + } + + // ==================== 业务操作 ==================== + + /** + * 提交送审(允许待提交→待审批,已驳回→待审批) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean submit(Long reviewId) { + QcQualityReview review = baseMapper.selectById(reviewId); + if (review == null) { + throw new RuntimeException("评审单不存在"); + } + Long status = review.getFlowStatus(); + if (!Long.valueOf(1L).equals(status) && !Long.valueOf(4L).equals(status)) { + throw new RuntimeException("当前状态不允许送审"); + } + // 校验:必须有品质部意见 + if (StringUtils.isBlank(review.getDeptOpinion())) { + throw new RuntimeException("请先填写品质部评审意见"); + } + // 校验:至少有一个钢卷 + Long coilCount = coilMapper.selectCount( + Wrappers.lambdaQuery() + .eq(QcQualityReviewCoil::getReviewId, reviewId) + .eq(QcQualityReviewCoil::getDelFlag, 0)); + if (coilCount == null || coilCount == 0) { + throw new RuntimeException("请至少添加一个钢卷"); + } + + // 更新流程状态为待审批,清除驳回原因 + baseMapper.update(null, Wrappers.lambdaUpdate() + .eq(QcQualityReview::getReviewId, reviewId) + .set(QcQualityReview::getFlowStatus, 2L) + .set(QcQualityReview::getRejectReason, null)); + + // 记录审批日志 + addLog(reviewId, "submit", "提交送审", null); + return true; + } + + /** + * 审批通过 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean approve(QcQualityReviewApproveBo bo) { + QcQualityReview review = baseMapper.selectById(bo.getReviewId()); + if (review == null) { + throw new RuntimeException("评审单不存在"); + } + if (!Long.valueOf(2L).equals(review.getFlowStatus())) { + throw new RuntimeException("只有待审批状态的评审单才能审批"); + } + if (CollUtil.isEmpty(bo.getCoilRegradeList())) { + throw new RuntimeException("请为每个钢卷指定改判后质量状态"); + } + + // 1. 更新主表流程状态 + baseMapper.update(null, Wrappers.lambdaUpdate() + .eq(QcQualityReview::getReviewId, bo.getReviewId()) + .set(QcQualityReview::getFlowStatus, 3L) + .set(QcQualityReview::getLeaderOpinion, bo.getLeaderOpinion()) + .set(QcQualityReview::getLeaderSign, bo.getLeaderSign()) + .set(QcQualityReview::getLeaderSignDate, new java.sql.Date(System.currentTimeMillis()))); + + // 2. 更新每个钢卷的改判状态 + for (QcQualityReviewApproveBo.CoilRegradeBo regrade : bo.getCoilRegradeList()) { + coilMapper.update(null, Wrappers.lambdaUpdate() + .eq(QcQualityReviewCoil::getDetailId, regrade.getDetailId()) + .set(QcQualityReviewCoil::getRegradeQuality, regrade.getRegradeQuality())); + } + + // 3. 记录审批日志 + addLog(bo.getReviewId(), "approve", bo.getLeaderOpinion(), bo.getLeaderSign()); + return true; + } + + /** + * 驳回 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean reject(Long reviewId, String reason) { + QcQualityReview review = baseMapper.selectById(reviewId); + if (review == null) { + throw new RuntimeException("评审单不存在"); + } + if (!Long.valueOf(2L).equals(review.getFlowStatus())) { + throw new RuntimeException("只有待审批状态的评审单才能驳回"); + } + if (StringUtils.isBlank(reason)) { + throw new RuntimeException("请填写驳回原因"); + } + + // 更新流程状态为已驳回 + baseMapper.update(null, Wrappers.lambdaUpdate() + .eq(QcQualityReview::getReviewId, reviewId) + .set(QcQualityReview::getFlowStatus, 4L) + .set(QcQualityReview::getRejectReason, reason)); + + // 记录审批日志 + addLog(reviewId, "reject", reason, null); + return true; + } + + /** + * 执行改判 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean execute(Long reviewId) { + QcQualityReview review = baseMapper.selectById(reviewId); + if (review == null) { + throw new RuntimeException("评审单不存在"); + } + if (!Long.valueOf(3L).equals(review.getFlowStatus())) { + throw new RuntimeException("只有已通过的评审单才能执行改判"); + } + + // 查询待执行的钢卷明细 + List coilList = coilMapper.selectList( + Wrappers.lambdaQuery() + .eq(QcQualityReviewCoil::getReviewId, reviewId) + .eq(QcQualityReviewCoil::getDelFlag, 0) + .eq(QcQualityReviewCoil::getExecuteStatus, 0)); + + if (CollUtil.isEmpty(coilList)) { + throw new RuntimeException("没有待执行的钢卷"); + } + + Date now = new Date(); + for (QcQualityReviewCoil coil : coilList) { + // 1. 写入 wms_coil_quality_rejudge 改判记录 + WmsCoilQualityRejudge rejudge = new WmsCoilQualityRejudge(); + rejudge.setCoilId(coil.getCoilId()); + rejudge.setBeforeQuality(coil.getBeforeQuality()); + rejudge.setAfterQuality(coil.getRegradeQuality()); + rejudge.setRejudgeReason("异常产品评审改判,评审单号:" + review.getReviewNo()); + wmsCoilQualityRejudgeMapper.insert(rejudge); + + // 2. 更新钢卷的 qualityStatus 为改判后的值 + if (coil.getCoilId() != null && StringUtils.isNotBlank(coil.getRegradeQuality())) { + wmsMaterialCoilMapper.update(null, Wrappers.lambdaUpdate() + .eq(WmsMaterialCoil::getCoilId, coil.getCoilId()) + .set(WmsMaterialCoil::getQualityStatus, coil.getRegradeQuality())); + } + + // 3. 更新明细执行状态 + coilMapper.update(null, Wrappers.lambdaUpdate() + .eq(QcQualityReviewCoil::getDetailId, coil.getDetailId()) + .set(QcQualityReviewCoil::getExecuteStatus, 1L) + .set(QcQualityReviewCoil::getExecuteTime, now)); + } + + return true; + } + + // ==================== 查询方法 ==================== + + @Override + public List queryCoilListByReviewId(Long reviewId) { + return coilMapper.selectVoListByReviewId(reviewId); + } + + @Override + public List queryLogListByReviewId(Long reviewId) { + return logMapper.selectVoListByReviewId(reviewId); + } + + // ==================== 私有方法 ==================== + + /** + * 保存钢卷明细列表 + */ + private void saveCoilList(Long reviewId, List coilBoList) { + int seq = 1; + for (QcQualityReviewCoilBo coilBo : coilBoList) { + QcQualityReviewCoil coil = BeanUtil.toBean(coilBo, QcQualityReviewCoil.class); + coil.setReviewId(reviewId); + coil.setExecuteStatus(0L); + if (coil.getGroupSeq() == null) { + coil.setGroupSeq(seq); + } + // 若未传改判前质量等级,从钢卷表获取 + if (StringUtils.isBlank(coil.getBeforeQuality()) && coil.getCoilId() != null) { + WmsMaterialCoil wmsCoil = wmsMaterialCoilMapper.selectById(coil.getCoilId()); + if (wmsCoil != null) { + coil.setBeforeQuality(wmsCoil.getQualityStatus()); + if (StringUtils.isBlank(coil.getCurrentCoilNo())) { + coil.setCurrentCoilNo(wmsCoil.getCurrentCoilNo()); + } + if (StringUtils.isBlank(coil.getSupplierCoilNo())) { + coil.setSupplierCoilNo(wmsCoil.getSupplierCoilNo()); + } + if (coil.getNetWeight() == null) { + coil.setNetWeight(wmsCoil.getNetWeight()); + } + } + } + coilMapper.insert(coil); + seq++; + } + } + + /** + * 添加审批日志 + */ + private void addLog(Long reviewId, String action, String opinion, String operator) { + QcQualityReviewLog log = new QcQualityReviewLog(); + log.setReviewId(reviewId); + log.setAction(action); + log.setOpinion(opinion); + log.setOperator(operator); + log.setOperateTime(new Date()); + logMapper.insert(log); + } + + /** + * 生成评审单编号: QR-20260630-0001 + */ + private String generateReviewNo() { + String dateStr = DateUtil.format(new Date(), "yyyyMMdd"); + Long count = baseMapper.selectCount(Wrappers.lambdaQuery() + .likeRight(QcQualityReview::getReviewNo, "QR-" + dateStr)); + return "QR-" + dateStr + "-" + String.format("%04d", count + 1); + } + + private void validEntityBeforeSave(QcQualityReview entity) { + // TODO 数据校验 + } +} diff --git a/klp-mes/src/main/resources/mapper/qc/QcQualityReviewCoilMapper.xml b/klp-mes/src/main/resources/mapper/qc/QcQualityReviewCoilMapper.xml new file mode 100644 index 000000000..b22759e1b --- /dev/null +++ b/klp-mes/src/main/resources/mapper/qc/QcQualityReviewCoilMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-mes/src/main/resources/mapper/qc/QcQualityReviewLogMapper.xml b/klp-mes/src/main/resources/mapper/qc/QcQualityReviewLogMapper.xml new file mode 100644 index 000000000..e78c65040 --- /dev/null +++ b/klp-mes/src/main/resources/mapper/qc/QcQualityReviewLogMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/klp-mes/src/main/resources/mapper/qc/QcQualityReviewMapper.xml b/klp-mes/src/main/resources/mapper/qc/QcQualityReviewMapper.xml new file mode 100644 index 000000000..3ed4a68df --- /dev/null +++ b/klp-mes/src/main/resources/mapper/qc/QcQualityReviewMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-ui/src/api/hrm/index.js b/klp-ui/src/api/hrm/index.js index f45bf7542..582a0c769 100644 --- a/klp-ui/src/api/hrm/index.js +++ b/klp-ui/src/api/hrm/index.js @@ -1,4 +1,3 @@ -// 导出所有 HRM 模块 API export * from './employee' export * from './org' export * from './certContract' diff --git a/klp-ui/src/api/mes/qc/qualityReview.js b/klp-ui/src/api/mes/qc/qualityReview.js new file mode 100644 index 000000000..8f7667686 --- /dev/null +++ b/klp-ui/src/api/mes/qc/qualityReview.js @@ -0,0 +1,94 @@ +import request from '@/utils/request' + +// 查询质量评审单列表 +export function listQualityReview(query) { + return request({ + url: '/qc/qualityReview/list', + method: 'get', + params: query + }) +} + +// 查询质量评审单详细 +export function getQualityReview(reviewId) { + return request({ + url: '/qc/qualityReview/' + reviewId, + method: 'get' + }) +} + +// 新增质量评审单 +export function addQualityReview(data) { + return request({ + url: '/qc/qualityReview', + method: 'post', + data: data + }) +} + +// 修改质量评审单 +export function updateQualityReview(data) { + return request({ + url: '/qc/qualityReview', + method: 'put', + data: data + }) +} + +// 删除质量评审单 +export function delQualityReview(reviewIds) { + return request({ + url: '/qc/qualityReview/' + reviewIds, + method: 'delete' + }) +} + +// 提交送审 +export function submitQualityReview(reviewId) { + return request({ + url: '/qc/qualityReview/submit/' + reviewId, + method: 'post' + }) +} + +// 审批通过 +export function approveQualityReview(data) { + return request({ + url: '/qc/qualityReview/approve', + method: 'post', + data: data + }) +} + +// 驳回 +export function rejectQualityReview(reviewId, reason) { + return request({ + url: '/qc/qualityReview/reject/' + reviewId, + method: 'post', + params: { reason } + }) +} + +// 执行改判 +export function executeQualityReview(reviewId) { + return request({ + url: '/qc/qualityReview/execute/' + reviewId, + method: 'post' + }) +} + +// 查询钢卷明细 +export function listQualityReviewCoil(reviewId) { + return request({ + url: '/qc/qualityReview/coilList/' + reviewId, + method: 'get' + }) +} + +// 查询审批日志 +export function listQualityReviewLog(reviewId) { + return request({ + url: '/qc/qualityReview/logList/' + reviewId, + method: 'get' + }) +} diff --git a/klp-ui/src/views/mes/qc/qualityReview/index.vue b/klp-ui/src/views/mes/qc/qualityReview/index.vue new file mode 100644 index 000000000..b08cfe63f --- /dev/null +++ b/klp-ui/src/views/mes/qc/qualityReview/index.vue @@ -0,0 +1,815 @@ + + + + + diff --git a/klp-ui/src/views/mes/qc/qualityReview/todo.vue b/klp-ui/src/views/mes/qc/qualityReview/todo.vue new file mode 100644 index 000000000..25bae2859 --- /dev/null +++ b/klp-ui/src/views/mes/qc/qualityReview/todo.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/klp-ui/vue.config.js b/klp-ui/vue.config.js index 8d9cb0d79..b14f87c2e 100644 --- a/klp-ui/vue.config.js +++ b/klp-ui/vue.config.js @@ -86,6 +86,10 @@ module.exports = { '@': resolve('src') } }, + // 解决 chokidar 监视系统文件 (pagefile.sys) 导致的 EBUSY 错误 + watchOptions: { + ignored: ['node_modules', '\.git', /pagefile\.sys$/, /swapfile\.sys$/] + }, plugins: [ // http://doc.klp.vip/klp-vue/other/faq.html#使用gzip解压缩静态文件 new CompressionPlugin({