feat(safety): 安全生产五期 - 安全教育培训与持证管理
覆盖培训计划→组织→签到→考试→持证归档全链路。
三张表:
- mes_safety_training 培训批次(类型/层级/讲师/时间/学时/内容/状态)
- mes_safety_training_attendee 参训人员(签到状态 + 签到时间 + 考试成绩 + 是否通过)
- mes_safety_certificate 资格证书(类型/编号/发证机关/发证日期/有效期至)
后端:
- 培训:新增/修改/删除(删除时级联清理参训记录,避免孤儿数据)、
时间区间校验、编码唯一校验
- 参训人员:全量保存(先清后插,保证与前端列表一致)+ 单个更新签到/成绩 + 删除
- 冗余统计自动刷新:参训人数、实到人数(已签到+迟到)、平均分(只统计有成绩的)
- 资格证书:证书编号唯一、有效期必须晚于发证日期
- 到期计算由服务端完成:返回距到期天数、是否已过期、是否 30 天内到期
- 支持 expiringSoon 筛选(只看 30 天内到期含已过期)
- 错误码 1_040_907_xxx / 1_040_908_xxx;字典常量 MES_SAFETY_TRAINING_* / MES_SAFETY_CERT_*
前端:
- 培训列表(参训/实到用颜色区分是否到齐)+ 培训表单
- 参训人员弹窗:多选添加人员、逐行设置签到状态与成绩、实时统计人数
- 资格证书列表(已过期红色标记、30 天内到期橙色 + 剩余天数、长期有效单独标记)+ 表单
SQL(mes_safety_training_init.sql,可重复执行):
- 建表 3 张、菜单 2 个(培训管理/资格证书)、字典 5 组、10 个按钮权限
注:本期只提交代码,未部署。
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================================== |
| | | -- å®å
¨ç产模å ââ äºæï¼å®å
¨æè²å¹è® |
| | | -- |
| | | -- å®ä½ï¼å¹è®è®¡å â ç»ç»å¹è® â åè®ç¾å° â èè¯è¯å â æè¯ç®¡çï¼å½¢æå¹è®æ¡£æ¡éç¯ã |
| | | -- ç¹ç§ä½ä¸äººåæ¯å¦æææè¯ä»¶ï¼å¯éè¿èµæ ¼è¯ä¹¦è¡¨æ ¸æ¥ã |
| | | -- |
| | | -- ä¸å¼ è¡¨ï¼ |
| | | -- mes_safety_training å¹è®æ¹æ¬¡ï¼ä¸æ¬¡å¹è®æ´»å¨ï¼ |
| | | -- mes_safety_training_attendee åè®äººåï¼å«ç¾å°ä¸èè¯æç»©ï¼ |
| | | -- mes_safety_certificate å®å
¨èµæ ¼è¯ä¹¦ï¼ç¹ç§ä½ä¸è¯çï¼å«æææï¼ |
| | | -- |
| | | -- å
å®¹ï¼ |
| | | -- 1. 建表 3 å¼ |
| | | -- 2. åå
¸ï¼å¹è®ç±»å / å¹è®ç¶æ / ç¾å°ç¶æ / è¯ä¹¦ç±»å |
| | | -- 3. èåï¼å¹è®ç®¡çãèµæ ¼è¯ä¹¦ï¼æå¨ãå®å
¨ç产ãç®å½ä¸ |
| | | -- 4. ææè¶
级管çå |
| | | -- |
| | | -- ç¹æ§ï¼å¯é夿§è¡ |
| | | -- ===================================================================== |
| | | |
| | | -- --------------------------------------------------------------------- |
| | | -- 1. å¹è®æ¹æ¬¡ |
| | | -- --------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `mes_safety_training` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `code` varchar(64) NOT NULL COMMENT 'å¹è®ç¼å·', |
| | | `title` varchar(200) NOT NULL COMMENT 'å¹è®ä¸»é¢', |
| | | |
| | | `training_type` tinyint DEFAULT NULL COMMENT 'å¹è®ç±»åï¼åå
¸ mes_safety_training_typeï¼', |
| | | `training_level` tinyint DEFAULT NULL COMMENT 'å¹è®å±çº§ï¼åå
¸ mes_safety_training_levelï¼1å
¬å¸çº§ 2车é´çº§ 3çç»çº§ï¼', |
| | | |
| | | `trainer` varchar(100) DEFAULT NULL COMMENT '讲å¸/æè¯¾äºº', |
| | | `trainer_org` varchar(200) DEFAULT NULL COMMENT '讲å¸åä½ï¼å¤é¨è®²å¸æ¶å¡«åï¼', |
| | | `location` varchar(255) DEFAULT NULL COMMENT 'å¹è®å°ç¹', |
| | | |
| | | `start_time` datetime DEFAULT NULL COMMENT 'å¹è®å¼å§æ¶é´', |
| | | `end_time` datetime DEFAULT NULL COMMENT 'å¹è®ç»ææ¶é´', |
| | | `duration_hours` decimal(6,1) DEFAULT NULL COMMENT '妿¶', |
| | | |
| | | `content` varchar(2000) DEFAULT NULL COMMENT 'å¹è®å
容', |
| | | `material` varchar(500) DEFAULT NULL COMMENT 'å¹è®èµæ/ææ', |
| | | |
| | | `status` tinyint NOT NULL DEFAULT '0' COMMENT 'ç¶æï¼0计åä¸ 10è¿è¡ä¸ 20已宿 30已忶', |
| | | |
| | | `attendee_count` int DEFAULT '0' COMMENT 'åè®äººæ°ï¼åä½ç»è®¡ï¼', |
| | | `signed_count` int DEFAULT '0' COMMENT 'å®å°äººæ°ï¼åä½ç»è®¡ï¼', |
| | | `avg_score` decimal(6,2) DEFAULT NULL COMMENT 'èè¯å¹³ååï¼åä½ç»è®¡ï¼', |
| | | |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) USING BTREE, |
| | | UNIQUE KEY `uk_code` (`code`) USING BTREE, |
| | | KEY `idx_status` (`status`) USING BTREE, |
| | | KEY `idx_start` (`start_time`) USING BTREE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='å®å
¨ç产-å¹è®æ¹æ¬¡'; |
| | | |
| | | -- --------------------------------------------------------------------- |
| | | -- 2. åè®äººåï¼å«ç¾å°ä¸èè¯æç»©ï¼ |
| | | -- --------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `mes_safety_training_attendee` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `training_id` bigint NOT NULL COMMENT 'å¹è®æ¹æ¬¡ç¼å·', |
| | | `user_id` bigint NOT NULL COMMENT 'åè®äººç¼å·', |
| | | `dept_id` bigint DEFAULT NULL COMMENT 'æå±é¨é¨ç¼å·', |
| | | |
| | | `sign_status` tinyint DEFAULT '0' COMMENT 'ç¾å°ç¶æï¼0æªç¾å° 1å·²ç¾å° 2è¿å° 3缺å¸', |
| | | `sign_time` datetime DEFAULT NULL COMMENT 'ç¾å°æ¶é´', |
| | | |
| | | `score` decimal(6,2) DEFAULT NULL COMMENT 'èè¯æç»©', |
| | | `passed` tinyint DEFAULT '0' COMMENT 'æ¯å¦éè¿ï¼0æªè 1éè¿ 2ä¸éè¿', |
| | | |
| | | `remark` varchar(255) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) USING BTREE, |
| | | KEY `idx_training` (`training_id`) USING BTREE, |
| | | KEY `idx_user` (`user_id`) USING BTREE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='å®å
¨ç产-å¹è®åè®äººå'; |
| | | |
| | | -- --------------------------------------------------------------------- |
| | | -- 3. å®å
¨èµæ ¼è¯ä¹¦ |
| | | -- --------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `mes_safety_certificate` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `user_id` bigint NOT NULL COMMENT 'æè¯äººç¼å·', |
| | | `dept_id` bigint DEFAULT NULL COMMENT 'æå±é¨é¨ç¼å·', |
| | | |
| | | `cert_type` tinyint NOT NULL COMMENT 'è¯ä¹¦ç±»åï¼åå
¸ mes_safety_cert_typeï¼', |
| | | `cert_no` varchar(100) NOT NULL COMMENT 'è¯ä¹¦ç¼å·', |
| | | `issue_org` varchar(200) DEFAULT NULL COMMENT 'åè¯æºå
³', |
| | | `issue_date` date DEFAULT NULL COMMENT 'åè¯æ¥æ', |
| | | `expire_date` date DEFAULT NULL COMMENT 'æææè³ï¼ç©ºè¡¨ç¤ºé¿æææï¼', |
| | | |
| | | `status` tinyint NOT NULL DEFAULT '1' COMMENT 'ç¶æï¼1ææ 0å·²ä½åº', |
| | | `attachment_url` varchar(500) DEFAULT NULL COMMENT 'è¯ä¹¦æ«æä»¶å°å', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) USING BTREE, |
| | | UNIQUE KEY `uk_cert_no` (`cert_no`) USING BTREE, |
| | | KEY `idx_user` (`user_id`) USING BTREE, |
| | | KEY `idx_expire` (`expire_date`) USING BTREE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='å®å
¨ç产-å®å
¨èµæ ¼è¯ä¹¦'; |
| | | |
| | | -- --------------------------------------------------------------------- |
| | | -- 4. åå
¸ |
| | | -- --------------------------------------------------------------------- |
| | | DELETE FROM system_dict_data WHERE dict_type IN |
| | | ('mes_safety_training_type', 'mes_safety_training_level', 'mes_safety_training_status', |
| | | 'mes_safety_attendee_status', 'mes_safety_cert_type'); |
| | | |
| | | DELETE FROM system_dict_type WHERE type IN |
| | | ('mes_safety_training_type', 'mes_safety_training_level', 'mes_safety_training_status', |
| | | 'mes_safety_attendee_status', 'mes_safety_cert_type'); |
| | | |
| | | INSERT INTO system_dict_type (name, type, status, remark, creator, create_time, updater, update_time, deleted) |
| | | VALUES ('å®å
¨ç产-å¹è®ç±»å', 'mes_safety_training_type', 0, 'å¹è®æ´»å¨åç±»', '1', NOW(), '1', NOW(), b'0'), |
| | | ('å®å
¨ç产-å¹è®å±çº§', 'mes_safety_training_level', 0, 'ä¸çº§æè²å±çº§', '1', NOW(), '1', NOW(), b'0'), |
| | | ('å®å
¨ç产-å¹è®ç¶æ', 'mes_safety_training_status', 0, 'å¹è®æ¹æ¬¡ç¶æ', '1', NOW(), '1', NOW(), b'0'), |
| | | ('å®å
¨ç产-ç¾å°ç¶æ', 'mes_safety_attendee_status', 0, 'åè®ç¾å°æ
åµ', '1', NOW(), '1', NOW(), b'0'), |
| | | ('å®å
¨ç产-è¯ä¹¦ç±»å', 'mes_safety_cert_type', 0, 'å®å
¨èµæ ¼è¯ä¹¦ç±»å', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO system_dict_data (sort, label, value, dict_type, status, color_type, creator, create_time, updater, update_time, deleted) |
| | | VALUES |
| | | -- å¹è®ç±»å |
| | | (1, 'ä¸çº§å®å
¨æè²', '1', 'mes_safety_training_type', 0, 'processing', '1', NOW(), '1', NOW(), b'0'), |
| | | (2, 'ä¸é¡¹å¹è®', '2', 'mes_safety_training_type', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | (3, 'å¤è®', '3', 'mes_safety_training_type', 0, 'warning', '1', NOW(), '1', NOW(), b'0'), |
| | | (4, 'æ¥å¸¸å®å
¨æè²', '4', 'mes_safety_training_type', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | (5, 'å
¶ä»', '5', 'mes_safety_training_type', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | -- å¹è®å±çº§ |
| | | (1, 'å
¬å¸çº§', '1', 'mes_safety_training_level', 0, 'processing', '1', NOW(), '1', NOW(), b'0'), |
| | | (2, '车é´çº§', '2', 'mes_safety_training_level', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | (3, 'çç»çº§', '3', 'mes_safety_training_level', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | -- å¹è®ç¶æ |
| | | (1, '计åä¸', '0', 'mes_safety_training_status', 0, 'processing', '1', NOW(), '1', NOW(), b'0'), |
| | | (2, 'è¿è¡ä¸', '10', 'mes_safety_training_status', 0, 'warning', '1', NOW(), '1', NOW(), b'0'), |
| | | (3, '已宿', '20', 'mes_safety_training_status', 0, 'success', '1', NOW(), '1', NOW(), b'0'), |
| | | (4, '已忶', '30', 'mes_safety_training_status', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | -- ç¾å°ç¶æ |
| | | (1, 'æªç¾å°', '0', 'mes_safety_attendee_status', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | (2, 'å·²ç¾å°', '1', 'mes_safety_attendee_status', 0, 'success', '1', NOW(), '1', NOW(), b'0'), |
| | | (3, 'è¿å°', '2', 'mes_safety_attendee_status', 0, 'warning', '1', NOW(), '1', NOW(), b'0'), |
| | | (4, '缺å¸', '3', 'mes_safety_attendee_status', 0, 'error', '1', NOW(), '1', NOW(), b'0'), |
| | | -- è¯ä¹¦ç±»å |
| | | (1, 'ç¹ç§ä½ä¸æä½è¯', '1', 'mes_safety_cert_type', 0, 'processing', '1', NOW(), '1', NOW(), b'0'), |
| | | (2, 'å®å
¨ç®¡ç人åè¯', '2', 'mes_safety_cert_type', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | (3, '主è¦è´è´£äººè¯', '3', 'mes_safety_cert_type', 0, 'default', '1', NOW(), '1', NOW(), b'0'), |
| | | (4, 'å
¶ä»èµæ ¼è¯', '4', 'mes_safety_cert_type', 0, 'default', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- --------------------------------------------------------------------- |
| | | -- 5. èåï¼æå¨ 1065910 å®å
¨ç产ä¸ï¼ |
| | | -- --------------------------------------------------------------------- |
| | | DELETE FROM system_role_menu WHERE menu_id BETWEEN 1065941 AND 1065960; |
| | | |
| | | DELETE FROM system_menu WHERE id BETWEEN 1065941 AND 1065960; |
| | | |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, |
| | | component, component_name, status, visible, keep_alive, always_show, |
| | | creator, create_time, updater, update_time, deleted) |
| | | VALUES |
| | | -- å¹è®ç®¡ç |
| | | (1065941, 'å®å
¨æè²å¹è®', '', 2, 6, 1065910, 'training', 'ep:reading', |
| | | 'safety/training/index', 'SafetyTraining', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065942, 'å¹è®æ¥è¯¢', 'mes:safety-training:query', 3, 1, 1065941, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065943, 'å¹è®å建', 'mes:safety-training:create', 3, 2, 1065941, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065944, 'å¹è®ä¿®æ¹', 'mes:safety-training:update', 3, 3, 1065941, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065945, 'å¹è®å é¤', 'mes:safety-training:delete', 3, 4, 1065941, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065946, 'åè®äººåç»´æ¤', 'mes:safety-training:attendee', 3, 5, 1065941, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | -- èµæ ¼è¯ä¹¦ |
| | | (1065947, 'å®å
¨èµæ ¼è¯ä¹¦', '', 2, 7, 1065910, 'certificate', 'ep:medal', |
| | | 'safety/certificate/index', 'SafetyCertificate', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065948, 'è¯ä¹¦æ¥è¯¢', 'mes:safety-certificate:query', 3, 1, 1065947, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065949, 'è¯ä¹¦å建', 'mes:safety-certificate:create', 3, 2, 1065947, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065950, 'è¯ä¹¦ä¿®æ¹', 'mes:safety-certificate:update', 3, 3, 1065947, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1065951, 'è¯ä¹¦å é¤', 'mes:safety-certificate:delete', 3, 4, 1065947, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted) |
| | | SELECT 1, m.id, '1', NOW(), '1', NOW(), b'0' |
| | | FROM system_menu m |
| | | WHERE m.id BETWEEN 1065941 AND 1065960; |
| | | |
| | | -- --------------------------------------------------------------------- |
| | | -- 6. éªè¯ |
| | | -- --------------------------------------------------------------------- |
| | | SELECT id, parent_id, name, path, component, permission, type |
| | | FROM system_menu WHERE id BETWEEN 1065910 AND 1065960 ORDER BY id; |
| | | |
| | | SELECT dict_type, label, value FROM system_dict_data |
| | | WHERE dict_type LIKE 'mes_safety_training%' OR dict_type IN ('mes_safety_attendee_status', 'mes_safety_cert_type') |
| | | ORDER BY dict_type, sort; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificatePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificateRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificateSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyCertificateDO; |
| | | import cn.iocoder.yudao.module.mes.service.safety.MesSafetyCertificateService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.temporal.ChronoUnit; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å®å
¨èµæ ¼è¯ä¹¦ Controller |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Tag(name = "管çåå° - å®å
¨ç产-å®å
¨èµæ ¼è¯ä¹¦") |
| | | @RestController |
| | | @RequestMapping("/mes/safety/certificate") |
| | | @Validated |
| | | public class MesSafetyCertificateController { |
| | | |
| | | /** å³å°å°æéå¼ï¼å¤©ï¼ */ |
| | | private static final long EXPIRING_SOON_DAYS = 30L; |
| | | |
| | | @Resource |
| | | private MesSafetyCertificateService certificateService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "åå»ºèµæ ¼è¯ä¹¦") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-certificate:create')") |
| | | public CommonResult<Long> createCertificate(@Valid @RequestBody MesSafetyCertificateSaveReqVO createReqVO) { |
| | | return success(certificateService.createCertificate(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°èµæ ¼è¯ä¹¦") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-certificate:update')") |
| | | public CommonResult<Boolean> updateCertificate(@Valid @RequestBody MesSafetyCertificateSaveReqVO updateReqVO) { |
| | | certificateService.updateCertificate(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤èµæ ¼è¯ä¹¦") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-certificate:delete')") |
| | | public CommonResult<Boolean> deleteCertificate(@RequestParam("id") Long id) { |
| | | certificateService.deleteCertificate(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾èµæ ¼è¯ä¹¦") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-certificate:query')") |
| | | public CommonResult<MesSafetyCertificateRespVO> getCertificate(@RequestParam("id") Long id) { |
| | | MesSafetyCertificateDO certificate = certificateService.getCertificate(id); |
| | | if (certificate == null) { |
| | | return success(null); |
| | | } |
| | | List<MesSafetyCertificateRespVO> list = buildRespList(Collections.singletonList(certificate)); |
| | | return success(list.isEmpty() ? null : list.get(0)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èµæ ¼è¯ä¹¦å页") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-certificate:query')") |
| | | public CommonResult<PageResult<MesSafetyCertificateRespVO>> getCertificatePage(@Valid MesSafetyCertificatePageReqVO pageReqVO) { |
| | | PageResult<MesSafetyCertificateDO> pageResult = certificateService.getCertificatePage(pageReqVO); |
| | | List<MesSafetyCertificateRespVO> list = buildRespList(pageResult.getList()); |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * 转æ¢ä¸º VO å¹¶å¡«å
æè¯äººå§åãé¨é¨åç§°ã尿天æ°ä¸å°ææ è®° |
| | | */ |
| | | private List<MesSafetyCertificateRespVO> buildRespList(List<MesSafetyCertificateDO> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<MesSafetyCertificateRespVO> respList = BeanUtils.toBean(list, MesSafetyCertificateRespVO.class); |
| | | |
| | | Set<Long> userIds = list.stream().map(MesSafetyCertificateDO::getUserId) |
| | | .filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, AdminUserRespDTO> userMap = userIds.isEmpty() |
| | | ? Collections.emptyMap() : adminUserApi.getUserMap(userIds); |
| | | |
| | | Set<Long> deptIds = list.stream().map(MesSafetyCertificateDO::getDeptId) |
| | | .filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, String> deptNameMap = new HashMap<>(); |
| | | if (!deptIds.isEmpty()) { |
| | | List<DeptRespDTO> depts = deptApi.getDeptList(deptIds); |
| | | if (depts != null) { |
| | | depts.forEach(d -> deptNameMap.put(d.getId(), d.getName())); |
| | | } |
| | | } |
| | | |
| | | LocalDate today = LocalDate.now(); |
| | | for (MesSafetyCertificateRespVO vo : respList) { |
| | | AdminUserRespDTO user = userMap.get(vo.getUserId()); |
| | | if (user != null) { |
| | | vo.setUserName(user.getNickname()); |
| | | } |
| | | vo.setDeptName(deptNameMap.get(vo.getDeptId())); |
| | | if (vo.getExpireDate() != null) { |
| | | long days = ChronoUnit.DAYS.between(today, vo.getExpireDate()); |
| | | vo.setDaysToExpire(days); |
| | | vo.setExpired(days < 0); |
| | | vo.setExpiringSoon(days >= 0 && days <= EXPIRING_SOON_DAYS); |
| | | } else { |
| | | vo.setExpired(false); |
| | | vo.setExpiringSoon(false); |
| | | } |
| | | } |
| | | return respList; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingAttendeeRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingAttendeeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingAttendeeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingDO; |
| | | import cn.iocoder.yudao.module.mes.service.safety.MesSafetyTrainingService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å®å
¨æè²å¹è® Controller |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Tag(name = "管çåå° - å®å
¨ç产-å®å
¨æè²å¹è®") |
| | | @RestController |
| | | @RequestMapping("/mes/safety/training") |
| | | @Validated |
| | | public class MesSafetyTrainingController { |
| | | |
| | | @Resource |
| | | private MesSafetyTrainingService trainingService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建å¹è®æ¹æ¬¡") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:create')") |
| | | public CommonResult<Long> createTraining(@Valid @RequestBody MesSafetyTrainingSaveReqVO createReqVO) { |
| | | return success(trainingService.createTraining(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°å¹è®æ¹æ¬¡") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:update')") |
| | | public CommonResult<Boolean> updateTraining(@Valid @RequestBody MesSafetyTrainingSaveReqVO updateReqVO) { |
| | | trainingService.updateTraining(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤å¹è®æ¹æ¬¡") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:delete')") |
| | | public CommonResult<Boolean> deleteTraining(@RequestParam("id") Long id) { |
| | | trainingService.deleteTraining(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾å¹è®æ¹æ¬¡") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:query')") |
| | | public CommonResult<MesSafetyTrainingRespVO> getTraining(@RequestParam("id") Long id) { |
| | | MesSafetyTrainingDO training = trainingService.getTraining(id); |
| | | return success(training == null ? null : BeanUtils.toBean(training, MesSafetyTrainingRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾å¹è®æ¹æ¬¡å页") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:query')") |
| | | public CommonResult<PageResult<MesSafetyTrainingRespVO>> getTrainingPage(@Valid MesSafetyTrainingPageReqVO pageReqVO) { |
| | | PageResult<MesSafetyTrainingDO> pageResult = trainingService.getTrainingPage(pageReqVO); |
| | | return success(new PageResult<>( |
| | | BeanUtils.toBean(pageResult.getList(), MesSafetyTrainingRespVO.class), |
| | | pageResult.getTotal())); |
| | | } |
| | | |
| | | // ==================== åè®äººå ==================== |
| | | |
| | | @GetMapping("/attendee-list") |
| | | @Operation(summary = "è·å¾åè®äººåå表") |
| | | @Parameter(name = "trainingId", description = "å¹è®æ¹æ¬¡ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:query')") |
| | | public CommonResult<List<MesSafetyTrainingAttendeeRespVO>> getAttendeeList(@RequestParam("trainingId") Long trainingId) { |
| | | return success(buildAttendeeRespList(trainingService.getAttendeeList(trainingId))); |
| | | } |
| | | |
| | | @PostMapping("/save-attendees") |
| | | @Operation(summary = "å
¨éä¿ååè®äººå") |
| | | @Parameter(name = "trainingId", description = "å¹è®æ¹æ¬¡ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:attendee')") |
| | | public CommonResult<Boolean> saveAttendees(@RequestParam("trainingId") Long trainingId, |
| | | @RequestBody List<MesSafetyTrainingAttendeeSaveReqVO> attendees) { |
| | | trainingService.saveAttendees(trainingId, attendees); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-attendee") |
| | | @Operation(summary = "æ´æ°åè®äººåç¾å°/æç»©") |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:attendee')") |
| | | public CommonResult<Boolean> updateAttendee(@Valid @RequestBody MesSafetyTrainingAttendeeSaveReqVO reqVO) { |
| | | trainingService.updateAttendee(reqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete-attendee") |
| | | @Operation(summary = "å é¤åè®äººå") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:safety-training:attendee')") |
| | | public CommonResult<Boolean> deleteAttendee(@RequestParam("id") Long id) { |
| | | trainingService.deleteAttendee(id); |
| | | return success(true); |
| | | } |
| | | |
| | | private List<MesSafetyTrainingAttendeeRespVO> buildAttendeeRespList(List<MesSafetyTrainingAttendeeDO> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<MesSafetyTrainingAttendeeRespVO> respList = BeanUtils.toBean(list, MesSafetyTrainingAttendeeRespVO.class); |
| | | |
| | | Set<Long> userIds = list.stream().map(MesSafetyTrainingAttendeeDO::getUserId) |
| | | .filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, AdminUserRespDTO> userMap = userIds.isEmpty() |
| | | ? Collections.emptyMap() : adminUserApi.getUserMap(userIds); |
| | | |
| | | Set<Long> deptIds = list.stream().map(MesSafetyTrainingAttendeeDO::getDeptId) |
| | | .filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, String> deptNameMap = new HashMap<>(); |
| | | if (!deptIds.isEmpty()) { |
| | | List<DeptRespDTO> depts = deptApi.getDeptList(deptIds); |
| | | if (depts != null) { |
| | | depts.forEach(d -> deptNameMap.put(d.getId(), d.getName())); |
| | | } |
| | | } |
| | | |
| | | for (MesSafetyTrainingAttendeeRespVO vo : respList) { |
| | | AdminUserRespDTO user = userMap.get(vo.getUserId()); |
| | | if (user != null) { |
| | | vo.setUserName(user.getNickname()); |
| | | } |
| | | vo.setDeptName(deptNameMap.get(vo.getDeptId())); |
| | | } |
| | | return respList; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-èµæ ¼è¯ä¹¦å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MesSafetyCertificatePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "æè¯äººç¼å·", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç±»å", example = "1") |
| | | private Integer certType; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", example = "T123456789") |
| | | private String certNo; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "æ¯å¦åªçå³å°å°æï¼30 天å
ï¼", example = "false") |
| | | private Boolean expiringSoon; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-èµæ ¼è¯ä¹¦ Response VO") |
| | | @Data |
| | | public class MesSafetyCertificateRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "æè¯äººç¼å·", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "æè¯äººå§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "æå±é¨é¨ç¼å·", example = "120") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "æå±é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç±»å", example = "1") |
| | | private Integer certType; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", example = "T123456789") |
| | | private String certNo; |
| | | |
| | | @Schema(description = "åè¯æºå
³") |
| | | private String issueOrg; |
| | | |
| | | @Schema(description = "åè¯æ¥æ") |
| | | private LocalDate issueDate; |
| | | |
| | | @Schema(description = "æææè³") |
| | | private LocalDate expireDate; |
| | | |
| | | @Schema(description = "è·å°æå¤©æ°ï¼è´æ°è¡¨ç¤ºå·²è¿æï¼", example = "180") |
| | | private Long daysToExpire; |
| | | |
| | | @Schema(description = "æ¯å¦å·²è¿æ", example = "false") |
| | | private Boolean expired; |
| | | |
| | | @Schema(description = "æ¯å¦å³å°å°æï¼30 天å
ï¼", example = "false") |
| | | private Boolean expiringSoon; |
| | | |
| | | @Schema(description = "ç¶æï¼1ææ 0å·²ä½åº", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "è¯ä¹¦æ«æä»¶å°å") |
| | | private String attachmentUrl; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-èµæ ¼è¯ä¹¦æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MesSafetyCertificateSaveReqVO { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "æè¯äººç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "æè¯äººä¸è½ä¸ºç©º") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "æå±é¨é¨ç¼å·", example = "120") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "è¯ä¹¦ç±»åä¸è½ä¸ºç©º") |
| | | private Integer certType; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "T123456789") |
| | | @NotEmpty(message = "è¯ä¹¦ç¼å·ä¸è½ä¸ºç©º") |
| | | private String certNo; |
| | | |
| | | @Schema(description = "åè¯æºå
³", example = "æ°çåºæ¥ç®¡çå
") |
| | | private String issueOrg; |
| | | |
| | | @Schema(description = "åè¯æ¥æ") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate issueDate; |
| | | |
| | | @Schema(description = "æææè³ï¼çç©ºè¡¨ç¤ºé¿æææï¼") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate expireDate; |
| | | |
| | | @Schema(description = "ç¶æï¼1ææ 0å·²ä½åº", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "è¯ä¹¦æ«æä»¶å°å") |
| | | private String attachmentUrl; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-åè®äººå Response VO") |
| | | @Data |
| | | public class MesSafetyTrainingAttendeeRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å¹è®æ¹æ¬¡ç¼å·", example = "1") |
| | | private Long trainingId; |
| | | |
| | | @Schema(description = "åè®äººç¼å·", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åè®äººå§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "æå±é¨é¨ç¼å·", example = "120") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "æå±é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "ç¾å°ç¶æï¼0æªç¾å° 1å·²ç¾å° 2è¿å° 3缺å¸", example = "1") |
| | | private Integer signStatus; |
| | | |
| | | @Schema(description = "ç¾å°æ¶é´") |
| | | private LocalDateTime signTime; |
| | | |
| | | @Schema(description = "èè¯æç»©", example = "88") |
| | | private BigDecimal score; |
| | | |
| | | @Schema(description = "æ¯å¦éè¿ï¼0æªè 1éè¿ 2ä¸éè¿", example = "1") |
| | | private Integer passed; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-åè®äººå ä¿å Request VO") |
| | | @Data |
| | | public class MesSafetyTrainingAttendeeSaveReqVO { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å¹è®æ¹æ¬¡ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "å¹è®æ¹æ¬¡ä¸è½ä¸ºç©º") |
| | | private Long trainingId; |
| | | |
| | | @Schema(description = "åè®äººç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åè®äººä¸è½ä¸ºç©º") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "æå±é¨é¨ç¼å·", example = "120") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "ç¾å°ç¶æï¼0æªç¾å° 1å·²ç¾å° 2è¿å° 3缺å¸", example = "0") |
| | | private Integer signStatus; |
| | | |
| | | @Schema(description = "ç¾å°æ¶é´") |
| | | private LocalDateTime signTime; |
| | | |
| | | @Schema(description = "èè¯æç»©", example = "88") |
| | | private BigDecimal score; |
| | | |
| | | @Schema(description = "æ¯å¦éè¿ï¼0æªè 1éè¿ 2ä¸éè¿", example = "0") |
| | | private Integer passed; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-å¹è®å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MesSafetyTrainingPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "å¹è®ç¼å·", example = "PX-2026-001") |
| | | private String code; |
| | | |
| | | @Schema(description = "å¹è®ä¸»é¢", example = "ç¹ç§ä½ä¸å®å
¨æä½å¹è®") |
| | | private String title; |
| | | |
| | | @Schema(description = "å¹è®ç±»å", example = "2") |
| | | private Integer trainingType; |
| | | |
| | | @Schema(description = "å¹è®å±çº§", example = "1") |
| | | private Integer trainingLevel; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å¹è®å¼å§æ¶é´-èµ·") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime startTimeStart; |
| | | |
| | | @Schema(description = "å¹è®å¼å§æ¶é´-æ¢") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime startTimeEnd; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-å¹è® Response VO") |
| | | @Data |
| | | public class MesSafetyTrainingRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å¹è®ç¼å·", example = "PX-2026-001") |
| | | private String code; |
| | | |
| | | @Schema(description = "å¹è®ä¸»é¢") |
| | | private String title; |
| | | |
| | | @Schema(description = "å¹è®ç±»å", example = "2") |
| | | private Integer trainingType; |
| | | |
| | | @Schema(description = "å¹è®å±çº§", example = "1") |
| | | private Integer trainingLevel; |
| | | |
| | | @Schema(description = "讲å¸/æè¯¾äºº") |
| | | private String trainer; |
| | | |
| | | @Schema(description = "讲å¸åä½") |
| | | private String trainerOrg; |
| | | |
| | | @Schema(description = "å¹è®å°ç¹") |
| | | private String location; |
| | | |
| | | @Schema(description = "å¹è®å¼å§æ¶é´") |
| | | private LocalDateTime startTime; |
| | | |
| | | @Schema(description = "å¹è®ç»ææ¶é´") |
| | | private LocalDateTime endTime; |
| | | |
| | | @Schema(description = "妿¶", example = "4") |
| | | private BigDecimal durationHours; |
| | | |
| | | @Schema(description = "å¹è®å
容") |
| | | private String content; |
| | | |
| | | @Schema(description = "å¹è®èµæ/ææ") |
| | | private String material; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "åè®äººæ°", example = "10") |
| | | private Integer attendeeCount; |
| | | |
| | | @Schema(description = "å®å°äººæ°", example = "9") |
| | | private Integer signedCount; |
| | | |
| | | @Schema(description = "èè¯å¹³åå", example = "85.5") |
| | | private BigDecimal avgScore; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| | | |
| | | @Schema(description = "管çåå° - å®å
¨ç产-å¹è®æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MesSafetyTrainingSaveReqVO { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å¹è®ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "PX-2026-001") |
| | | @NotEmpty(message = "å¹è®ç¼å·ä¸è½ä¸ºç©º") |
| | | private String code; |
| | | |
| | | @Schema(description = "å¹è®ä¸»é¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "ç¹ç§ä½ä¸å®å
¨æä½å¹è®") |
| | | @NotEmpty(message = "å¹è®ä¸»é¢ä¸è½ä¸ºç©º") |
| | | private String title; |
| | | |
| | | @Schema(description = "å¹è®ç±»å", example = "2") |
| | | private Integer trainingType; |
| | | |
| | | @Schema(description = "å¹è®å±çº§", example = "1") |
| | | private Integer trainingLevel; |
| | | |
| | | @Schema(description = "讲å¸/æè¯¾äºº", example = "å¼ å·¥") |
| | | private String trainer; |
| | | |
| | | @Schema(description = "讲å¸åä½") |
| | | private String trainerOrg; |
| | | |
| | | @Schema(description = "å¹è®å°ç¹", example = "䏿¥¼å¹è®å®¤") |
| | | private String location; |
| | | |
| | | @Schema(description = "å¹è®å¼å§æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime startTime; |
| | | |
| | | @Schema(description = "å¹è®ç»ææ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime endTime; |
| | | |
| | | @Schema(description = "妿¶", example = "4") |
| | | private BigDecimal durationHours; |
| | | |
| | | @Schema(description = "å¹è®å
容") |
| | | private String content; |
| | | |
| | | @Schema(description = "å¹è®èµæ/ææ") |
| | | private String material; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @NotNull(message = "ç¶æä¸è½ä¸ºç©º") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å®å
¨èµæ ¼è¯ä¹¦ DO |
| | | * |
| | | * ç¹ç§ä½ä¸æä½è¯ãå®å
¨ç®¡ç人åè¯çï¼å«æææç¨äºå°ææé |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("mes_safety_certificate") |
| | | @KeySequence("mes_safety_certificate_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MesSafetyCertificateDO extends BaseDO { |
| | | |
| | | /** ç¶æï¼ææ */ |
| | | public static final Integer STATUS_VALID = 1; |
| | | /** ç¶æï¼å·²ä½åº */ |
| | | public static final Integer STATUS_INVALID = 0; |
| | | |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * æè¯äººç¼å· |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * æå±é¨é¨ç¼å· |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * è¯ä¹¦ç±»å |
| | | * |
| | | * åå
¸ mes_safety_cert_typeï¼1ç¹ç§ä½ä¸æä½è¯ 2å®å
¨ç®¡ç人åè¯ 3主è¦è´è´£äººè¯ 4å
¶ä»èµæ ¼è¯ |
| | | */ |
| | | private Integer certType; |
| | | |
| | | /** |
| | | * è¯ä¹¦ç¼å· |
| | | */ |
| | | private String certNo; |
| | | |
| | | /** |
| | | * åè¯æºå
³ |
| | | */ |
| | | private String issueOrg; |
| | | |
| | | /** |
| | | * åè¯æ¥æ |
| | | */ |
| | | private LocalDate issueDate; |
| | | |
| | | /** |
| | | * æææè³ï¼ä¸ºç©ºè¡¨ç¤ºé¿æææï¼ |
| | | */ |
| | | private LocalDate expireDate; |
| | | |
| | | /** |
| | | * ç¶æï¼1ææ 0å·²ä½åº |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * è¯ä¹¦æ«æä»¶å°å |
| | | */ |
| | | private String attachmentUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å¹è®åè®äººå DO |
| | | * |
| | | * å«ç¾å°æ
åµä¸èè¯æç»© |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("mes_safety_training_attendee") |
| | | @KeySequence("mes_safety_training_attendee_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MesSafetyTrainingAttendeeDO extends BaseDO { |
| | | |
| | | /** ç¾å°ç¶æï¼æªç¾å° */ |
| | | public static final Integer SIGN_NONE = 0; |
| | | /** ç¾å°ç¶æï¼å·²ç¾å° */ |
| | | public static final Integer SIGN_DONE = 1; |
| | | /** ç¾å°ç¶æï¼è¿å° */ |
| | | public static final Integer SIGN_LATE = 2; |
| | | /** ç¾å°ç¶æï¼ç¼ºå¸ */ |
| | | public static final Integer SIGN_ABSENT = 3; |
| | | |
| | | /** èè¯ç»æï¼æªè */ |
| | | public static final Integer PASS_NONE = 0; |
| | | /** èè¯ç»æï¼éè¿ */ |
| | | public static final Integer PASS_YES = 1; |
| | | /** èè¯ç»æï¼ä¸éè¿ */ |
| | | public static final Integer PASS_NO = 2; |
| | | |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * å¹è®æ¹æ¬¡ç¼å· |
| | | */ |
| | | private Long trainingId; |
| | | |
| | | /** |
| | | * åè®äººç¼å· |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * æå±é¨é¨ç¼å· |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * ç¾å°ç¶æï¼0æªç¾å° 1å·²ç¾å° 2è¿å° 3ç¼ºå¸ |
| | | */ |
| | | private Integer signStatus; |
| | | |
| | | /** |
| | | * ç¾å°æ¶é´ |
| | | */ |
| | | private LocalDateTime signTime; |
| | | |
| | | /** |
| | | * èè¯æç»© |
| | | */ |
| | | private BigDecimal score; |
| | | |
| | | /** |
| | | * æ¯å¦éè¿ï¼0æªè 1éè¿ 2ä¸éè¿ |
| | | */ |
| | | private Integer passed; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å¹è®æ¹æ¬¡ DO |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("mes_safety_training") |
| | | @KeySequence("mes_safety_training_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MesSafetyTrainingDO extends BaseDO { |
| | | |
| | | /** ç¶æï¼è®¡åä¸ */ |
| | | public static final Integer STATUS_PLANNED = 0; |
| | | /** ç¶æï¼è¿è¡ä¸ */ |
| | | public static final Integer STATUS_ONGOING = 10; |
| | | /** ç¶æï¼å·²å®æ */ |
| | | public static final Integer STATUS_FINISHED = 20; |
| | | /** ç¶æï¼å·²åæ¶ */ |
| | | public static final Integer STATUS_CANCELED = 30; |
| | | |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * å¹è®ç¼å· |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * å¹è®ä¸»é¢ |
| | | */ |
| | | private String title; |
| | | |
| | | /** |
| | | * å¹è®ç±»å |
| | | * |
| | | * åå
¸ mes_safety_training_typeï¼1ä¸çº§å®å
¨æè² 2ä¸é¡¹å¹è® 3å¤è® 4æ¥å¸¸å®å
¨æè² 5å
¶ä» |
| | | */ |
| | | private Integer trainingType; |
| | | |
| | | /** |
| | | * å¹è®å±çº§ |
| | | * |
| | | * åå
¸ mes_safety_training_levelï¼1å
¬å¸çº§ 2车é´çº§ 3çç»çº§ |
| | | */ |
| | | private Integer trainingLevel; |
| | | |
| | | /** |
| | | * è®²å¸ / æè¯¾äºº |
| | | */ |
| | | private String trainer; |
| | | |
| | | /** |
| | | * 讲å¸åä½ï¼å¤é¨è®²å¸æ¶å¡«åï¼ |
| | | */ |
| | | private String trainerOrg; |
| | | |
| | | /** |
| | | * å¹è®å°ç¹ |
| | | */ |
| | | private String location; |
| | | |
| | | /** |
| | | * å¹è®å¼å§æ¶é´ |
| | | */ |
| | | private LocalDateTime startTime; |
| | | |
| | | /** |
| | | * å¹è®ç»ææ¶é´ |
| | | */ |
| | | private LocalDateTime endTime; |
| | | |
| | | /** |
| | | * 妿¶ |
| | | */ |
| | | private BigDecimal durationHours; |
| | | |
| | | /** |
| | | * å¹è®å
容 |
| | | */ |
| | | private String content; |
| | | |
| | | /** |
| | | * å¹è®èµæ / ææ |
| | | */ |
| | | private String material; |
| | | |
| | | /** |
| | | * ç¶æï¼0计åä¸ 10è¿è¡ä¸ 20已宿 30已忶 |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * åè®äººæ°ï¼åä½ç»è®¡ï¼ |
| | | */ |
| | | private Integer attendeeCount; |
| | | |
| | | /** |
| | | * å®å°äººæ°ï¼åä½ç»è®¡ï¼ |
| | | */ |
| | | private Integer signedCount; |
| | | |
| | | /** |
| | | * èè¯å¹³ååï¼åä½ç»è®¡ï¼ |
| | | */ |
| | | private BigDecimal avgScore; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificatePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyCertificateDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å®å
¨èµæ ¼è¯ä¹¦ Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface MesSafetyCertificateMapper extends BaseMapperX<MesSafetyCertificateDO> { |
| | | |
| | | default PageResult<MesSafetyCertificateDO> selectPage(MesSafetyCertificatePageReqVO reqVO) { |
| | | LambdaQueryWrapperX<MesSafetyCertificateDO> wrapper = new LambdaQueryWrapperX<MesSafetyCertificateDO>() |
| | | .eqIfPresent(MesSafetyCertificateDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(MesSafetyCertificateDO::getCertType, reqVO.getCertType()) |
| | | .likeIfPresent(MesSafetyCertificateDO::getCertNo, reqVO.getCertNo()) |
| | | .eqIfPresent(MesSafetyCertificateDO::getStatus, reqVO.getStatus()); |
| | | // åªçå³å°å°æï¼å«å·²è¿æï¼ï¼expireDate å¨ä»å¤©+30 ä¹å |
| | | if (Boolean.TRUE.equals(reqVO.getExpiringSoon())) { |
| | | LocalDate today = LocalDate.now(); |
| | | wrapper.isNotNull(MesSafetyCertificateDO::getExpireDate) |
| | | .le(MesSafetyCertificateDO::getExpireDate, today.plusDays(30)); |
| | | } |
| | | wrapper.orderByAsc(MesSafetyCertificateDO::getExpireDate) |
| | | .orderByDesc(MesSafetyCertificateDO::getId); |
| | | return selectPage(reqVO, wrapper); |
| | | } |
| | | |
| | | default MesSafetyCertificateDO selectByCertNo(String certNo) { |
| | | return selectOne(MesSafetyCertificateDO::getCertNo, certNo); |
| | | } |
| | | |
| | | /** |
| | | * ç»è®¡ææä½å·²è¿æçè¯ä¹¦æ°é |
| | | */ |
| | | default Long selectCountExpired(LocalDate today) { |
| | | return selectCount(new LambdaQueryWrapperX<MesSafetyCertificateDO>() |
| | | .eq(MesSafetyCertificateDO::getStatus, MesSafetyCertificateDO.STATUS_VALID) |
| | | .isNotNull(MesSafetyCertificateDO::getExpireDate) |
| | | .lt(MesSafetyCertificateDO::getExpireDate, today)); |
| | | } |
| | | |
| | | default List<MesSafetyCertificateDO> selectAllList() { |
| | | return selectList(new LambdaQueryWrapperX<MesSafetyCertificateDO>() |
| | | .orderByAsc(MesSafetyCertificateDO::getExpireDate)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingAttendeeDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å¹è®åè®äººå Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface MesSafetyTrainingAttendeeMapper extends BaseMapperX<MesSafetyTrainingAttendeeDO> { |
| | | |
| | | default List<MesSafetyTrainingAttendeeDO> selectListByTrainingId(Long trainingId) { |
| | | return selectList(new LambdaQueryWrapperX<MesSafetyTrainingAttendeeDO>() |
| | | .eq(MesSafetyTrainingAttendeeDO::getTrainingId, trainingId) |
| | | .orderByAsc(MesSafetyTrainingAttendeeDO::getId)); |
| | | } |
| | | |
| | | default MesSafetyTrainingAttendeeDO selectByTrainingIdAndUserId(Long trainingId, Long userId) { |
| | | return selectOne(new LambdaQueryWrapperX<MesSafetyTrainingAttendeeDO>() |
| | | .eq(MesSafetyTrainingAttendeeDO::getTrainingId, trainingId) |
| | | .eq(MesSafetyTrainingAttendeeDO::getUserId, userId)); |
| | | } |
| | | |
| | | default void deleteByTrainingId(Long trainingId) { |
| | | delete(new LambdaQueryWrapperX<MesSafetyTrainingAttendeeDO>() |
| | | .eq(MesSafetyTrainingAttendeeDO::getTrainingId, trainingId)); |
| | | } |
| | | |
| | | default Long selectCountByTrainingId(Long trainingId) { |
| | | return selectCount(new LambdaQueryWrapperX<MesSafetyTrainingAttendeeDO>() |
| | | .eq(MesSafetyTrainingAttendeeDO::getTrainingId, trainingId)); |
| | | } |
| | | |
| | | default Long selectCountSignedByTrainingId(Long trainingId) { |
| | | return selectCount(new LambdaQueryWrapperX<MesSafetyTrainingAttendeeDO>() |
| | | .eq(MesSafetyTrainingAttendeeDO::getTrainingId, trainingId) |
| | | .in(MesSafetyTrainingAttendeeDO::getSignStatus, |
| | | MesSafetyTrainingAttendeeDO.SIGN_DONE, MesSafetyTrainingAttendeeDO.SIGN_LATE)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å¹è®æ¹æ¬¡ Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface MesSafetyTrainingMapper extends BaseMapperX<MesSafetyTrainingDO> { |
| | | |
| | | default PageResult<MesSafetyTrainingDO> selectPage(MesSafetyTrainingPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesSafetyTrainingDO>() |
| | | .likeIfPresent(MesSafetyTrainingDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesSafetyTrainingDO::getTitle, reqVO.getTitle()) |
| | | .eqIfPresent(MesSafetyTrainingDO::getTrainingType, reqVO.getTrainingType()) |
| | | .eqIfPresent(MesSafetyTrainingDO::getTrainingLevel, reqVO.getTrainingLevel()) |
| | | .eqIfPresent(MesSafetyTrainingDO::getStatus, reqVO.getStatus()) |
| | | .geIfPresent(MesSafetyTrainingDO::getStartTime, reqVO.getStartTimeStart()) |
| | | .leIfPresent(MesSafetyTrainingDO::getStartTime, reqVO.getStartTimeEnd()) |
| | | .orderByDesc(MesSafetyTrainingDO::getId)); |
| | | } |
| | | |
| | | default MesSafetyTrainingDO selectByCode(String code) { |
| | | return selectOne(MesSafetyTrainingDO::getCode, code); |
| | | } |
| | | |
| | | default Long selectCountByStatus(Integer status) { |
| | | return selectCount(new LambdaQueryWrapperX<MesSafetyTrainingDO>() |
| | | .eq(MesSafetyTrainingDO::getStatus, status)); |
| | | } |
| | | |
| | | default List<MesSafetyTrainingDO> selectAllList() { |
| | | return selectList(new LambdaQueryWrapperX<MesSafetyTrainingDO>() |
| | | .orderByDesc(MesSafetyTrainingDO::getId)); |
| | | } |
| | | |
| | | } |
| | |
| | | String MES_SAFETY_TICKET_TYPE = "mes_safety_ticket_type"; // ä½ä¸ç±»å |
| | | String MES_SAFETY_TICKET_LEVEL = "mes_safety_ticket_level"; // ä½ä¸çº§å« |
| | | String MES_SAFETY_TICKET_STATUS = "mes_safety_ticket_status"; // ä½ä¸ç¥¨ç¶æ |
| | | |
| | | // å®å
¨æè²å¹è® |
| | | String MES_SAFETY_TRAINING_TYPE = "mes_safety_training_type"; // å¹è®ç±»å |
| | | String MES_SAFETY_TRAINING_LEVEL = "mes_safety_training_level"; // å¹è®å±çº§ï¼ä¸çº§æè²ï¼ |
| | | String MES_SAFETY_TRAINING_STATUS = "mes_safety_training_status"; // å¹è®ç¶æ |
| | | String MES_SAFETY_ATTENDEE_STATUS = "mes_safety_attendee_status"; // ç¾å°ç¶æ |
| | | |
| | | // å®å
¨èµæ ¼è¯ä¹¦ |
| | | String MES_SAFETY_CERT_TYPE = "mes_safety_cert_type"; // è¯ä¹¦ç±»å |
| | | } |
| | |
| | | ErrorCode MES_SAFETY_TICKET_REJECT_REASON_REQUIRED = new ErrorCode(1_040_906_004, "审æ¹é©³åæ¶å¿
须填å驳ååå "); |
| | | ErrorCode MES_SAFETY_TICKET_HAS_REFERENCE = new ErrorCode(1_040_906_005, "该记å½å·²è¢«ä½ä¸ç¥¨å¼ç¨ï¼æ æ³å é¤"); |
| | | |
| | | // ========== MES å®å
¨ç产 - å®å
¨æè²å¹è®ï¼1-040-907-000ï¼ ========== |
| | | ErrorCode MES_SAFETY_TRAINING_NOT_EXISTS = new ErrorCode(1_040_907_000, "å¹è®æ¹æ¬¡ä¸åå¨"); |
| | | ErrorCode MES_SAFETY_TRAINING_CODE_DUPLICATE = new ErrorCode(1_040_907_001, "å¹è®ç¼å·å·²åå¨"); |
| | | ErrorCode MES_SAFETY_TRAINING_TIME_INVALID = new ErrorCode(1_040_907_002, "å¹è®ç»ææ¶é´å¿
é¡»æäºå¼å§æ¶é´"); |
| | | ErrorCode MES_SAFETY_TRAINING_ATTENDEE_NOT_EXISTS = new ErrorCode(1_040_907_003, "åè®äººåè®°å½ä¸åå¨"); |
| | | |
| | | // ========== MES å®å
¨ç产 - å®å
¨èµæ ¼è¯ä¹¦ï¼1-040-908-000ï¼ ========== |
| | | ErrorCode MES_SAFETY_CERTIFICATE_NOT_EXISTS = new ErrorCode(1_040_908_000, "èµæ ¼è¯ä¹¦ä¸åå¨"); |
| | | ErrorCode MES_SAFETY_CERTIFICATE_NO_DUPLICATE = new ErrorCode(1_040_908_001, "è¯ä¹¦ç¼å·å·²åå¨"); |
| | | ErrorCode MES_SAFETY_CERTIFICATE_DATE_INVALID = new ErrorCode(1_040_908_002, "æææå¿
é¡»æäºåè¯æ¥æ"); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificatePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificateSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyCertificateDO; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - èµæ ¼è¯ä¹¦ Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface MesSafetyCertificateService { |
| | | |
| | | PageResult<MesSafetyCertificateDO> getCertificatePage(MesSafetyCertificatePageReqVO pageReqVO); |
| | | |
| | | MesSafetyCertificateDO getCertificate(Long id); |
| | | |
| | | Long createCertificate(MesSafetyCertificateSaveReqVO createReqVO); |
| | | |
| | | void updateCertificate(MesSafetyCertificateSaveReqVO updateReqVO); |
| | | |
| | | void deleteCertificate(Long id); |
| | | |
| | | MesSafetyCertificateDO validateCertificateExists(Long id); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificatePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.certificate.MesSafetyCertificateSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyCertificateDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.safety.MesSafetyCertificateMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.Objects; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - èµæ ¼è¯ä¹¦ Service å®ç° |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MesSafetyCertificateServiceImpl implements MesSafetyCertificateService { |
| | | |
| | | @Resource |
| | | private MesSafetyCertificateMapper certificateMapper; |
| | | |
| | | @Override |
| | | public PageResult<MesSafetyCertificateDO> getCertificatePage(MesSafetyCertificatePageReqVO pageReqVO) { |
| | | return certificateMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public MesSafetyCertificateDO getCertificate(Long id) { |
| | | return certificateMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public Long createCertificate(MesSafetyCertificateSaveReqVO createReqVO) { |
| | | validateCertNoUnique(null, createReqVO.getCertNo()); |
| | | validateDateRange(createReqVO); |
| | | MesSafetyCertificateDO certificate = BeanUtils.toBean(createReqVO, MesSafetyCertificateDO.class); |
| | | if (certificate.getStatus() == null) { |
| | | certificate.setStatus(MesSafetyCertificateDO.STATUS_VALID); |
| | | } |
| | | certificateMapper.insert(certificate); |
| | | return certificate.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateCertificate(MesSafetyCertificateSaveReqVO updateReqVO) { |
| | | validateCertificateExists(updateReqVO.getId()); |
| | | validateCertNoUnique(updateReqVO.getId(), updateReqVO.getCertNo()); |
| | | validateDateRange(updateReqVO); |
| | | MesSafetyCertificateDO updateObj = BeanUtils.toBean(updateReqVO, MesSafetyCertificateDO.class); |
| | | certificateMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteCertificate(Long id) { |
| | | validateCertificateExists(id); |
| | | certificateMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MesSafetyCertificateDO validateCertificateExists(Long id) { |
| | | if (id == null) { |
| | | throw exception(MES_SAFETY_CERTIFICATE_NOT_EXISTS); |
| | | } |
| | | MesSafetyCertificateDO certificate = certificateMapper.selectById(id); |
| | | if (certificate == null) { |
| | | throw exception(MES_SAFETY_CERTIFICATE_NOT_EXISTS); |
| | | } |
| | | return certificate; |
| | | } |
| | | |
| | | /** |
| | | * æææå¿
é¡»æäºåè¯æ¥æ |
| | | */ |
| | | private void validateDateRange(MesSafetyCertificateSaveReqVO reqVO) { |
| | | if (reqVO.getIssueDate() != null && reqVO.getExpireDate() != null |
| | | && !reqVO.getExpireDate().isAfter(reqVO.getIssueDate())) { |
| | | throw exception(MES_SAFETY_CERTIFICATE_DATE_INVALID); |
| | | } |
| | | } |
| | | |
| | | private void validateCertNoUnique(Long id, String certNo) { |
| | | MesSafetyCertificateDO exists = certificateMapper.selectByCertNo(certNo); |
| | | if (exists == null) { |
| | | return; |
| | | } |
| | | if (id == null || !Objects.equals(exists.getId(), id)) { |
| | | throw exception(MES_SAFETY_CERTIFICATE_NO_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingAttendeeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingAttendeeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingDO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å¹è® Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface MesSafetyTrainingService { |
| | | |
| | | PageResult<MesSafetyTrainingDO> getTrainingPage(MesSafetyTrainingPageReqVO pageReqVO); |
| | | |
| | | MesSafetyTrainingDO getTraining(Long id); |
| | | |
| | | Long createTraining(MesSafetyTrainingSaveReqVO createReqVO); |
| | | |
| | | void updateTraining(MesSafetyTrainingSaveReqVO updateReqVO); |
| | | |
| | | void deleteTraining(Long id); |
| | | |
| | | MesSafetyTrainingDO validateTrainingExists(Long id); |
| | | |
| | | /** |
| | | * è·å¾æå®å¹è®çåè®äººåå表 |
| | | */ |
| | | List<MesSafetyTrainingAttendeeDO> getAttendeeList(Long trainingId); |
| | | |
| | | /** |
| | | * å
¨éä¿ååè®äººåï¼ä»¥ä¼ å
¥å表为åè¦çï¼ |
| | | */ |
| | | void saveAttendees(Long trainingId, List<MesSafetyTrainingAttendeeSaveReqVO> attendees); |
| | | |
| | | /** |
| | | * æ´æ°å个åè®äººåçç¾å° / æç»© |
| | | */ |
| | | void updateAttendee(MesSafetyTrainingAttendeeSaveReqVO reqVO); |
| | | |
| | | /** |
| | | * å é¤åè®äººå |
| | | */ |
| | | void deleteAttendee(Long id); |
| | | |
| | | /** |
| | | * å·æ°å¹è®æ¹æ¬¡çåä½ç»è®¡ï¼åè®äººæ° / å®å°äººæ° / å¹³ååï¼ |
| | | */ |
| | | void refreshStatistics(Long trainingId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.safety; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingAttendeeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.training.MesSafetyTrainingSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingAttendeeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyTrainingDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.safety.MesSafetyTrainingAttendeeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.safety.MesSafetyTrainingMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * å®å
¨ç产 - å¹è® Service å®ç° |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MesSafetyTrainingServiceImpl implements MesSafetyTrainingService { |
| | | |
| | | @Resource |
| | | private MesSafetyTrainingMapper trainingMapper; |
| | | |
| | | @Resource |
| | | private MesSafetyTrainingAttendeeMapper attendeeMapper; |
| | | |
| | | @Override |
| | | public PageResult<MesSafetyTrainingDO> getTrainingPage(MesSafetyTrainingPageReqVO pageReqVO) { |
| | | return trainingMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public MesSafetyTrainingDO getTraining(Long id) { |
| | | return trainingMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public Long createTraining(MesSafetyTrainingSaveReqVO createReqVO) { |
| | | validateCodeUnique(null, createReqVO.getCode()); |
| | | validateTimeRange(createReqVO); |
| | | MesSafetyTrainingDO training = BeanUtils.toBean(createReqVO, MesSafetyTrainingDO.class); |
| | | training.setAttendeeCount(0); |
| | | training.setSignedCount(0); |
| | | trainingMapper.insert(training); |
| | | return training.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateTraining(MesSafetyTrainingSaveReqVO updateReqVO) { |
| | | validateTrainingExists(updateReqVO.getId()); |
| | | validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); |
| | | validateTimeRange(updateReqVO); |
| | | MesSafetyTrainingDO updateObj = BeanUtils.toBean(updateReqVO, MesSafetyTrainingDO.class); |
| | | // ç»è®¡å段ç±åè®äººåç»´æ¤ï¼ä¸éè¿æ¤æ¥å£ä¿®æ¹ |
| | | updateObj.setAttendeeCount(null); |
| | | updateObj.setSignedCount(null); |
| | | updateObj.setAvgScore(null); |
| | | trainingMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteTraining(Long id) { |
| | | validateTrainingExists(id); |
| | | // 级èå é¤åè®è®°å½ï¼é¿å
å¤å¿æ°æ® |
| | | attendeeMapper.deleteByTrainingId(id); |
| | | trainingMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MesSafetyTrainingDO validateTrainingExists(Long id) { |
| | | if (id == null) { |
| | | throw exception(MES_SAFETY_TRAINING_NOT_EXISTS); |
| | | } |
| | | MesSafetyTrainingDO training = trainingMapper.selectById(id); |
| | | if (training == null) { |
| | | throw exception(MES_SAFETY_TRAINING_NOT_EXISTS); |
| | | } |
| | | return training; |
| | | } |
| | | |
| | | @Override |
| | | public List<MesSafetyTrainingAttendeeDO> getAttendeeList(Long trainingId) { |
| | | return attendeeMapper.selectListByTrainingId(trainingId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void saveAttendees(Long trainingId, List<MesSafetyTrainingAttendeeSaveReqVO> attendees) { |
| | | validateTrainingExists(trainingId); |
| | | // å
¨éè¦çï¼å
æ¸
空åæå
¥ï¼ä¿è¯ä¸å端å表ä¸è´ |
| | | attendeeMapper.deleteByTrainingId(trainingId); |
| | | if (attendees != null && !attendees.isEmpty()) { |
| | | List<MesSafetyTrainingAttendeeDO> list = new ArrayList<>(attendees.size()); |
| | | for (MesSafetyTrainingAttendeeSaveReqVO vo : attendees) { |
| | | MesSafetyTrainingAttendeeDO attendee = BeanUtils.toBean(vo, MesSafetyTrainingAttendeeDO.class); |
| | | attendee.setId(null); |
| | | attendee.setTrainingId(trainingId); |
| | | if (attendee.getSignStatus() == null) { |
| | | attendee.setSignStatus(MesSafetyTrainingAttendeeDO.SIGN_NONE); |
| | | } |
| | | if (attendee.getPassed() == null) { |
| | | attendee.setPassed(MesSafetyTrainingAttendeeDO.PASS_NONE); |
| | | } |
| | | list.add(attendee); |
| | | } |
| | | attendeeMapper.insertBatch(list); |
| | | } |
| | | refreshStatistics(trainingId); |
| | | } |
| | | |
| | | @Override |
| | | public void updateAttendee(MesSafetyTrainingAttendeeSaveReqVO reqVO) { |
| | | if (reqVO.getId() == null) { |
| | | throw exception(MES_SAFETY_TRAINING_ATTENDEE_NOT_EXISTS); |
| | | } |
| | | MesSafetyTrainingAttendeeDO exists = attendeeMapper.selectById(reqVO.getId()); |
| | | if (exists == null) { |
| | | throw exception(MES_SAFETY_TRAINING_ATTENDEE_NOT_EXISTS); |
| | | } |
| | | MesSafetyTrainingAttendeeDO updateObj = new MesSafetyTrainingAttendeeDO(); |
| | | updateObj.setId(reqVO.getId()); |
| | | updateObj.setSignStatus(reqVO.getSignStatus()); |
| | | updateObj.setSignTime(reqVO.getSignTime()); |
| | | updateObj.setScore(reqVO.getScore()); |
| | | updateObj.setPassed(reqVO.getPassed()); |
| | | updateObj.setRemark(reqVO.getRemark()); |
| | | attendeeMapper.updateById(updateObj); |
| | | refreshStatistics(exists.getTrainingId()); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteAttendee(Long id) { |
| | | MesSafetyTrainingAttendeeDO exists = attendeeMapper.selectById(id); |
| | | if (exists == null) { |
| | | throw exception(MES_SAFETY_TRAINING_ATTENDEE_NOT_EXISTS); |
| | | } |
| | | attendeeMapper.deleteById(id); |
| | | refreshStatistics(exists.getTrainingId()); |
| | | } |
| | | |
| | | @Override |
| | | public void refreshStatistics(Long trainingId) { |
| | | Long total = attendeeMapper.selectCountByTrainingId(trainingId); |
| | | Long signed = attendeeMapper.selectCountSignedByTrainingId(trainingId); |
| | | List<MesSafetyTrainingAttendeeDO> list = attendeeMapper.selectListByTrainingId(trainingId); |
| | | // å¹³åååªç»è®¡ææç»©ç |
| | | BigDecimal sum = BigDecimal.ZERO; |
| | | int scored = 0; |
| | | for (MesSafetyTrainingAttendeeDO a : list) { |
| | | if (a.getScore() != null) { |
| | | sum = sum.add(a.getScore()); |
| | | scored++; |
| | | } |
| | | } |
| | | BigDecimal avg = scored > 0 |
| | | ? sum.divide(BigDecimal.valueOf(scored), 2, RoundingMode.HALF_UP) |
| | | : null; |
| | | MesSafetyTrainingDO updateObj = new MesSafetyTrainingDO(); |
| | | updateObj.setId(trainingId); |
| | | updateObj.setAttendeeCount(total == null ? 0 : total.intValue()); |
| | | updateObj.setSignedCount(signed == null ? 0 : signed.intValue()); |
| | | updateObj.setAvgScore(avg); |
| | | trainingMapper.updateById(updateObj); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªå¹è®æ¶é´åºé´ |
| | | */ |
| | | private void validateTimeRange(MesSafetyTrainingSaveReqVO reqVO) { |
| | | LocalDateTime start = reqVO.getStartTime(); |
| | | LocalDateTime end = reqVO.getEndTime(); |
| | | if (start != null && end != null && !end.isAfter(start)) { |
| | | throw exception(MES_SAFETY_TRAINING_TIME_INVALID); |
| | | } |
| | | } |
| | | |
| | | private void validateCodeUnique(Long id, String code) { |
| | | MesSafetyTrainingDO exists = trainingMapper.selectByCode(code); |
| | | if (exists == null) { |
| | | return; |
| | | } |
| | | if (id == null || !Objects.equals(exists.getId(), id)) { |
| | | throw exception(MES_SAFETY_TRAINING_CODE_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | } |