6 天以前 0c23c1e9b9e06ffc570edac28ee45555b772b99c
feat(safety): 新增安全培训测评功能

- 添加了安全培训考核报告相关实体、控制器、服务和映射器
- 实现了测评任务管理功能,包括开始测评和提交测评结果
- 新增培训完成记录的增删改查接口
- 添加安全基础实体类和基础服务实现
- 更新应用配置文件并添加开发环境配置
- 在pom.xml中引入lombok依赖和编译插件配置
- 创建安全模块前端联调文档,详细说明接口规范和使用方式
已添加78个文件
已修改2个文件
3142 ■■■■■ 文件已修改
doc/safety-front-integration.md 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyAssessmentReportController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyAssessmentTaskController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyControllerSupport.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyEmergencyResourceController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyEquipmentController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyInspectionRecordController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyInspectionStatisticsController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyLearningRecordController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyPersonnelController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyRiskController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyTrainingMaterialController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyTrainingPlanController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyTrainingRecordController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/controller/SafetyWorkAreaController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/dto/SafetyInspectionTodayStatistics.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/dto/SafetyInspectionTrendStat.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/dto/SafetyInspectionTypeStat.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/dto/SafetyInspectorStat.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/dto/SafetyLearningStatistics.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyAssessmentReportMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyAssessmentTaskEmployeeMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyAssessmentTaskMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyEmergencyResourceMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyEquipmentMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyInspectionRecordMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyLearningRecordMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyPersonnelMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyRiskMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyTrainingMaterialMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyTrainingPlanMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyTrainingRecordMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/mapper/SafetyWorkAreaMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyAssessmentReport.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyAssessmentTask.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyAssessmentTaskEmployee.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyBaseEntity.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyEmergencyResource.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyEquipment.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyInspectionRecord.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyLearningRecord.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyPersonnel.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyRisk.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyTrainingMaterial.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyTrainingPlan.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyTrainingRecord.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/pojo/SafetyWorkArea.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyAssessmentReportService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyAssessmentTaskEmployeeService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyAssessmentTaskService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyBaseService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyEmergencyResourceService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyEquipmentService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyInspectionRecordService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyLearningRecordService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyPersonnelService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyRiskService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyTrainingMaterialService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyTrainingPlanService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyTrainingRecordService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/SafetyWorkAreaService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentReportServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskEmployeeServiceImpl.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyBaseServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyEmergencyResourceServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyEquipmentServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyInspectionRecordServiceImpl.java 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyLearningRecordServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyPersonnelServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyRiskServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyTrainingMaterialServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyTrainingPlanServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyTrainingRecordServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safety/service/impl/SafetyWorkAreaServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safety/SafetyInspectionRecordMapper.xml 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safety/SafetyLearningRecordMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/safety-front-integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,274 @@
# safety模块前端联调文档
更新时间:2026-05-25
## 1. å…¬å…±çº¦å®š
### 1.1 è®¤è¯
- è¯·æ±‚头:`Authorization: Bearer ${token}`
- ç™»å½•接口:`POST /login`
### 1.2 ç»Ÿä¸€è¿”回
普通接口统一返回 `AjaxResult`:
```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {}
}
```
### 1.3 åˆ†é¡µè¿”回
safety æ¨¡å—列表接口返回 MyBatis Plus `Page`,核心字段:
- `data.records`
- `data.total`
- `data.current`
- `data.size`
分页参数建议统一使用:
- `pageNum`
- `pageSize`
### 1.4 æ—¥æœŸæ ¼å¼
- `LocalDate`:`yyyy-MM-dd`
- `LocalDateTime`:`yyyy-MM-dd HH:mm:ss`
### 1.5 å…¬å…±å­—段
所有 safety å®žä½“都包含以下公共字段(新增时无需传):
- `id`
- `createBy`
- `createTime`
- `updateBy`
- `updateTime`
- `remark`
- `delFlag`(逻辑删除)
- `tenantId`
## 2. æŽ¥å£æ¸…单
### 2.1 åŸºç¡€æ¡£æ¡ˆ
- äººå‘˜æ¡£æ¡ˆ
  - `GET /safety/personnel/list`
  - `POST /safety/personnel/add`
  - `PUT /safety/personnel/update`
  - `DELETE /safety/personnel/delete/{id}`
  - `GET /safety/personnel/detail/{id}`
- å²—位风险
  - `GET /safety/risk/list`
  - `POST /safety/risk/add`
  - `PUT /safety/risk/update`
  - `DELETE /safety/risk/delete/{id}`
  - `GET /safety/risk/detail/{id}`
- ä½œä¸šåŒºåŸŸ
  - `GET /safety/workArea/list`
  - `GET /safety/workArea/all`
  - `POST /safety/workArea/add`
  - `PUT /safety/workArea/update`
  - `DELETE /safety/workArea/delete/{id}`
  - `GET /safety/workArea/detail/{id}`
- è®¾å¤‡è®¾æ–½
  - `GET /safety/equipment/list`
  - `POST /safety/equipment/add`
  - `PUT /safety/equipment/update`
  - `DELETE /safety/equipment/delete/{id}`
  - `GET /safety/equipment/detail/{id}`
- åº”急资源
  - `GET /safety/emergency/list`
  - `POST /safety/emergency/add`
  - `PUT /safety/emergency/update`
  - `DELETE /safety/emergency/delete/{id}`
  - `GET /safety/emergency/detail/{id}`
### 2.2 å·¡æ£€
- å·¡æ£€è®°å½•
  - `GET /safety/inspection/record/list`
  - `POST /safety/inspection/record/add`
  - `PUT /safety/inspection/record/update`
  - `DELETE /safety/inspection/record/delete/{id}`
  - `POST /safety/inspection/record/sync`(新增:模拟子系统同步,自动创建18条)
- å·¡æ£€ç»Ÿè®¡
  - `GET /safety/inspection/statistics/today`
  - `GET /safety/inspection/statistics/trend`
  - `GET /safety/inspection/statistics/type`
  - `GET /safety/inspection/statistics/inspector`
### 2.3 åŸ¹è®­å­¦ä¹ 
- åŸ¹è®­èµ„æ–™
  - `GET /safety/training/material/list`
  - `POST /safety/training/material/upload`(保存元数据)
  - `PUT /safety/training/material/update`
  - `DELETE /safety/training/material/delete/{id}`
  - `GET /safety/training/material/detail/{id}`
- åŸ¹è®­è®¡åˆ’
  - `GET /safety/training/plan/list`
  - `POST /safety/training/plan/add`
  - `PUT /safety/training/plan/update`
  - `DELETE /safety/training/plan/delete/{id}`
  - `GET /safety/training/plan/detail/{id}`
- åŸ¹è®­å®Œæˆè®°å½•
  - `GET /safety/training/record/list`
  - `POST /safety/training/record/add`
  - `PUT /safety/training/record/update`
  - `DELETE /safety/training/record/delete/{id}`
  - `GET /safety/training/record/detail/{id}`
  - `GET /safety/training/record/export`
- å‘˜å·¥å­¦ä¹ è®°å½•
  - `GET /safety/learning/record/list`
  - `GET /safety/learning/record/statistics`
### 2.4 æµ‹è¯„与报告
- æµ‹è¯„任务
  - `GET /safety/learning/assessment/list`
  - `POST /safety/learning/assessment/start`
  - `POST /safety/learning/assessment/submit`
- è€ƒæ ¸æŠ¥å‘Š
  - `GET /safety/learning/report/list`
  - `GET /safety/learning/report/detail/{id}`
## 3. å·¡æ£€æ¨¡å—联调重点
### 3.1 å·¡æ£€è®°å½•查询
`GET /safety/inspection/record/list`
可用筛选参数:
- `startDate`、`endDate`(按巡检时间区间)
- `inspectorId`、`inspector`
- `areaId`、`area`
- `type`
- `status`
- `pageNum`、`pageSize`
关键字段:
- `inspectionTime`
- `inspectorId`、`inspector`
- `areaId`、`area`
- `type`
- `status`
- `abnormalDesc`
- `isMissed`
### 3.2 å·¡æ£€çŠ¶æ€å£å¾„ï¼ˆåŽç«¯ç»Ÿè®¡å£å¾„ï¼‰
- `status=0`:已完成(正常)
- `status=1`:已完成(异常)
- `status=2`:已完成(漏检)
- `status=3`:未执行
- `isMissed=1`:也计入漏检统计
### 3.3 åŒæ­¥æ¨¡æ‹Ÿå­ç³»ç»Ÿæ•°æ®ï¼ˆæ–°å¢žï¼‰
接口:`POST /safety/inspection/record/sync`
用途:前端点击“同步数据”按钮时调用,系统会自动生成 18 æ¡æ¨¡æ‹Ÿå·¡æ£€æ•°æ®å†™å…¥æ•°æ®åº“,并将这 18 æ¡è®°å½•返回给前端。
请求参数:无
调用限制:每天只能成功调用 1 æ¬¡ï¼ˆRedis æŒ‰â€œç§Ÿæˆ·+日期”控制)。同一天重复调用会返回失败提示:`今日已同步,明天再试`。
返回示例:
```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "count": 18,
    "records": [
      {
        "inspectionTime": "2026-05-25 08:20:00",
        "inspectorId": 101,
        "inspector": "inspector-a",
        "areaId": 1,
        "area": "workshop-a",
        "type": "daily",
        "status": 0,
        "abnormalDesc": null,
        "isMissed": 0
      }
    ]
  }
}
```
联调建议调用顺序:
1. ç‚¹å‡»åŒæ­¥æŒ‰é’®åŽå…ˆè°ƒç”¨ `POST /safety/inspection/record/sync`
2. æˆåŠŸåŽåˆ·æ–°åˆ—è¡¨ï¼š`GET /safety/inspection/record/list`
3. å†åˆ·æ–°ç»Ÿè®¡å¡ç‰‡å’Œå›¾è¡¨ï¼š
   - `GET /safety/inspection/statistics/today`
   - `GET /safety/inspection/statistics/trend`
   - `GET /safety/inspection/statistics/type`
   - `GET /safety/inspection/statistics/inspector`
### 3.4 å·¡æ£€ç»Ÿè®¡é»˜è®¤æ—¶é—´èŒƒå›´
`trend/type/inspector` ä¸‰ä¸ªç»Ÿè®¡æŽ¥å£è‹¥ä¸ä¼  `startDate/endDate`,后端默认最近 7 å¤©ï¼ˆå½“天往前推 6 å¤©ï¼‰ã€‚
## 4. åŸ¹è®­èµ„料上传说明
`/safety/training/material/upload` åªä¿å­˜èµ„料元数据,不接收二进制文件。
推荐流程:
1. å…ˆè°ƒç”¨ `POST /common/upload` ä¸Šä¼ æ–‡ä»¶
2. æ‹¿åˆ° `url/fileName/originalFilename` åŽè°ƒç”¨ `POST /safety/training/material/upload` ä¿å­˜å…ƒæ•°æ®
## 5. å‰ç«¯å°è£…示例(巡检同步)
```js
import request from '@/utils/request'
export function syncInspectionData() {
  return request({
    url: '/safety/inspection/record/sync',
    method: 'post'
  })
}
```
## 6. åŸ¹è®­å®Œæˆè®°å½•补充(增删改查)
基础地址:`/safety/training/record`
已开放接口:
1. `GET /list`:分页查询
2. `POST /add`:新增
3. `PUT /update`:修改
4. `DELETE /delete/{id}`:删除
5. `GET /detail/{id}`:详情
6. `GET /export`:导出
新增/修改请求体示例:
```json
{
  "planId": 1,
  "employeeId": 1001,
  "employeeName": "张三",
  "content": "三级安全教育培训",
  "completeTime": "2026-05-25 10:00:00",
  "duration": 2.0,
  "method": "线下授课",
  "result": "通过",
  "score": 92,
  "status": 1,
  "remark": "补录"
}
```
pom.xml
@@ -41,9 +41,10 @@
        <okhttp.version>4.9.0</okhttp.version>
        <logback.version>1.2.13</logback.version>
        <spring-security.version>5.7.12</spring-security.version>
        <spring-framework.version>5.3.39</spring-framework.version>
        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
    </properties>
        <spring-framework.version>5.3.39</spring-framework.version>
        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
        <lombok.version>1.18.42</lombok.version>
    </properties>
    <dependencies>
        <dependency>
@@ -304,10 +305,28 @@
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <proc>full</proc>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork> <!-- å¦‚果没有该配置,devtools不会生效 -->
                </configuration>
src/main/java/com/ruoyi/safety/controller/SafetyAssessmentReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyAssessmentReport;
import com.ruoyi.safety.service.SafetyAssessmentReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-考核报告接口。
 */
@RestController
@Api(tags = "安环管理-考核报告")
@RequestMapping("/safety/learning/report")
public class SafetyAssessmentReportController extends SafetyControllerSupport {
    @Autowired
    private SafetyAssessmentReportService reportService;
    /**
     * åˆ†é¡µæŸ¥è¯¢è€ƒæ ¸æŠ¥å‘Šã€‚
     */
    @Log(title = "安环管理-考核报告-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询考核报告")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyAssessmentReport> page, SafetyAssessmentReport query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(reportService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æŸ¥è¯¢è€ƒæ ¸æŠ¥å‘Šè¯¦æƒ…。
     */
    @Log(title = "安环管理-考核报告-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询考核报告详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(reportService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyAssessmentTaskController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyAssessmentTask;
import com.ruoyi.safety.pojo.SafetyAssessmentTaskEmployee;
import com.ruoyi.safety.service.SafetyAssessmentTaskEmployeeService;
import com.ruoyi.safety.service.SafetyAssessmentTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-测评任务接口。
 */
@RestController
@Api(tags = "安环管理-测评任务")
@RequestMapping("/safety/learning/assessment")
public class SafetyAssessmentTaskController extends SafetyControllerSupport {
    @Autowired
    private SafetyAssessmentTaskService taskService;
    @Autowired
    private SafetyAssessmentTaskEmployeeService taskEmployeeService;
    /**
     * åˆ†é¡µæŸ¥è¯¢æµ‹è¯„任务。
     */
    @Log(title = "安环管理-测评任务-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询测评任务")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyAssessmentTask> page, SafetyAssessmentTask query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(taskService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * å¼€å§‹æµ‹è¯„,生成当前员工与测评任务的关联记录。
     */
    @Log(title = "安环管理-测评任务-开始测评", businessType = BusinessType.INSERT)
    @ApiOperation("开始测评")
    @PostMapping("/start")
    public AjaxResult start(@RequestBody SafetyAssessmentTaskEmployee request) {
        return toAjax(taskEmployeeService.start(request));
    }
    /**
     * æäº¤æµ‹è¯„结果。
     */
    @Log(title = "安环管理-测评任务-提交测评", businessType = BusinessType.UPDATE)
    @ApiOperation("提交测评")
    @PostMapping("/submit")
    public AjaxResult submit(@RequestBody SafetyAssessmentTaskEmployee request) {
        return toAjax(taskEmployeeService.submit(request));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyControllerSupport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
/**
 * å®‰çŽ¯ç®¡ç† Controller å…¬å…±æ–¹æ³•。
 */
public abstract class SafetyControllerSupport {
    /**
     * å…¼å®¹ MyBatis Plus çš„ current/size ä¸Žæ–‡æ¡£ä¸­çš„ pageNum/pageSize åˆ†é¡µå‚数。
     */
    protected <T> Page<T> buildPage(Page<T> page, Long pageNum, Long pageSize) {
        Page<T> result = page == null ? new Page<T>() : page;
        if (pageNum != null) {
            result.setCurrent(pageNum);
        }
        if (pageSize != null) {
            result.setSize(pageSize);
        }
        return result;
    }
    /**
     * å°†å¸ƒå°”处理结果转换为统一响应。
     */
    protected AjaxResult toAjax(boolean success) {
        return success ? AjaxResult.success() : AjaxResult.error();
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyEmergencyResourceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyEmergencyResource;
import com.ruoyi.safety.service.SafetyEmergencyResourceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-应急资源接口。
 */
@RestController
@Api(tags = "安环管理-应急资源")
@RequestMapping("/safety/emergency")
public class SafetyEmergencyResourceController extends SafetyControllerSupport {
    @Autowired
    private SafetyEmergencyResourceService emergencyResourceService;
    /**
     * åˆ†é¡µæŸ¥è¯¢åº”急资源。
     */
    @Log(title = "安环管理-应急资源-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询应急资源")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyEmergencyResource> page, SafetyEmergencyResource query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(emergencyResourceService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æ–°å¢žåº”急资源。
     */
    @Log(title = "安环管理-应急资源-新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增应急资源")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyEmergencyResource resource) {
        return toAjax(emergencyResourceService.saveSafety(resource));
    }
    /**
     * ä¿®æ”¹åº”急资源。
     */
    @Log(title = "安环管理-应急资源-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改应急资源")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyEmergencyResource resource) {
        return toAjax(emergencyResourceService.updateSafety(resource));
    }
    /**
     * åˆ é™¤åº”急资源。
     */
    @Log(title = "安环管理-应急资源-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除应急资源")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(emergencyResourceService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢åº”急资源详情。
     */
    @Log(title = "安环管理-应急资源-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询应急资源详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(emergencyResourceService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyEquipmentController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyEquipment;
import com.ruoyi.safety.service.SafetyEquipmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-设备设施接口。
 */
@RestController
@Api(tags = "安环管理-设备设施")
@RequestMapping("/safety/equipment")
public class SafetyEquipmentController extends SafetyControllerSupport {
    @Autowired
    private SafetyEquipmentService equipmentService;
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡è®¾æ–½ã€‚
     */
    @Log(title = "安环管理-设备设施-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询设备设施")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyEquipment> page, SafetyEquipment query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(equipmentService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æ–°å¢žè®¾å¤‡è®¾æ–½ã€‚
     */
    @Log(title = "安环管理-设备设施-新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增设备设施")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyEquipment equipment) {
        return toAjax(equipmentService.saveSafety(equipment));
    }
    /**
     * ä¿®æ”¹è®¾å¤‡è®¾æ–½ã€‚
     */
    @Log(title = "安环管理-设备设施-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改设备设施")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyEquipment equipment) {
        return toAjax(equipmentService.updateSafety(equipment));
    }
    /**
     * åˆ é™¤è®¾å¤‡è®¾æ–½ã€‚
     */
    @Log(title = "安环管理-设备设施-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除设备设施")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(equipmentService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡è®¾æ–½è¯¦æƒ…。
     */
    @Log(title = "安环管理-设备设施-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询设备设施详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(equipmentService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyInspectionRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyInspectionRecord;
import com.ruoyi.safety.service.SafetyInspectionRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Safety inspection record APIs.
 */
@RestController
@Api(tags = "safety-inspection-record")
@RequestMapping("/safety/inspection/record")
public class SafetyInspectionRecordController extends SafetyControllerSupport {
    @Autowired
    private SafetyInspectionRecordService recordService;
    @Log(title = "safety-inspection-record-list", businessType = BusinessType.OTHER)
    @ApiOperation("query safety inspection records by page")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyInspectionRecord> page,
                           SafetyInspectionRecord query,
                           @RequestParam(value = "startDate", required = false) String startDate,
                           @RequestParam(value = "endDate", required = false) String endDate,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(recordService.queryPage(buildPage(page, pageNum, pageSize), query, startDate, endDate));
    }
    @Log(title = "safety-inspection-record-add", businessType = BusinessType.INSERT)
    @ApiOperation("add safety inspection record")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyInspectionRecord record) {
        return toAjax(recordService.saveSafety(record));
    }
    @Log(title = "safety-inspection-record-update", businessType = BusinessType.UPDATE)
    @ApiOperation("update safety inspection record")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyInspectionRecord record) {
        return toAjax(recordService.updateSafety(record));
    }
    @Log(title = "safety-inspection-record-delete", businessType = BusinessType.DELETE)
    @ApiOperation("delete safety inspection record")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(recordService.deleteSafetyById(id));
    }
    @Log(title = "safety-inspection-record-sync", businessType = BusinessType.IMPORT)
    @ApiOperation("sync mock subsystem inspection data")
    @PostMapping("/sync")
    public AjaxResult sync() {
        List<SafetyInspectionRecord> records = recordService.syncMockSubsystemData();
        Map<String, Object> data = new HashMap<String, Object>(2);
        data.put("count", records.size());
        data.put("records", records);
        return AjaxResult.success(data);
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyInspectionStatisticsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.safety.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.service.SafetyInspectionRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-巡检统计报表接口。
 */
@RestController
@Api(tags = "安环管理-巡检统计报表")
@RequestMapping("/safety/inspection/statistics")
public class SafetyInspectionStatisticsController {
    @Autowired
    private SafetyInspectionRecordService recordService;
    /**
     * æŸ¥è¯¢ä»Šæ—¥å·¡æ£€ç»Ÿè®¡ã€‚
     */
    @Log(title = "安环管理-巡检统计-今日统计", businessType = BusinessType.OTHER)
    @ApiOperation("查询今日巡检统计")
    @GetMapping("/today")
    public AjaxResult todayStatistics() {
        return AjaxResult.success(recordService.getTodayStatistics());
    }
    /**
     * æŸ¥è¯¢å·¡æ£€è¶‹åŠ¿ç»Ÿè®¡ã€‚
     */
    @Log(title = "安环管理-巡检统计-趋势统计", businessType = BusinessType.OTHER)
    @ApiOperation("查询巡检趋势统计")
    @GetMapping("/trend")
    public AjaxResult trendStatistics(@RequestParam(value = "startDate", required = false) String startDate,
                                      @RequestParam(value = "endDate", required = false) String endDate) {
        return AjaxResult.success(recordService.getTrendStatistics(startDate, endDate));
    }
    /**
     * æŸ¥è¯¢å·¡æ£€ç±»åž‹åˆ†å¸ƒã€‚
     */
    @Log(title = "安环管理-巡检统计-类型分布", businessType = BusinessType.OTHER)
    @ApiOperation("查询巡检类型分布")
    @GetMapping("/type")
    public AjaxResult typeStatistics(@RequestParam(value = "startDate", required = false) String startDate,
                                     @RequestParam(value = "endDate", required = false) String endDate) {
        return AjaxResult.success(recordService.getTypeStatistics(startDate, endDate));
    }
    /**
     * æŸ¥è¯¢å·¡æ£€äººå‘˜å±¥èŒç»Ÿè®¡ã€‚
     */
    @Log(title = "安环管理-巡检统计-人员履职", businessType = BusinessType.OTHER)
    @ApiOperation("查询巡检人员履职统计")
    @GetMapping("/inspector")
    public AjaxResult inspectorStatistics(@RequestParam(value = "startDate", required = false) String startDate,
                                          @RequestParam(value = "endDate", required = false) String endDate) {
        return AjaxResult.success(recordService.getInspectorStatistics(startDate, endDate));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyLearningRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyLearningRecord;
import com.ruoyi.safety.service.SafetyLearningRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-员工学习记录接口。
 */
@RestController
@Api(tags = "安环管理-员工学习记录")
@RequestMapping("/safety/learning/record")
public class SafetyLearningRecordController extends SafetyControllerSupport {
    @Autowired
    private SafetyLearningRecordService learningRecordService;
    /**
     * åˆ†é¡µæŸ¥è¯¢å‘˜å·¥å­¦ä¹ è®°å½•。
     */
    @Log(title = "安环管理-员工学习记录-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询员工学习记录")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyLearningRecord> page, SafetyLearningRecord query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(learningRecordService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æŸ¥è¯¢å‘˜å·¥å­¦ä¹ ç»Ÿè®¡ã€‚
     */
    @Log(title = "安环管理-员工学习记录-统计", businessType = BusinessType.OTHER)
    @ApiOperation("查询员工学习统计")
    @GetMapping("/statistics")
    public AjaxResult statistics() {
        return AjaxResult.success(learningRecordService.getStatistics());
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyPersonnelController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyPersonnel;
import com.ruoyi.safety.service.SafetyPersonnelService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-人员档案接口。
 */
@RestController
@Api(tags = "安环管理-人员档案")
@RequestMapping("/safety/personnel")
public class SafetyPersonnelController extends SafetyControllerSupport {
    @Autowired
    private SafetyPersonnelService personnelService;
    /**
     * åˆ†é¡µæŸ¥è¯¢äººå‘˜æ¡£æ¡ˆã€‚
     */
    @Log(title = "安环管理-人员档案-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询人员档案")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyPersonnel> page, SafetyPersonnel query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(personnelService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æ–°å¢žäººå‘˜æ¡£æ¡ˆã€‚
     */
    @Log(title = "安环管理-人员档案-新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增人员档案")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyPersonnel personnel) {
        return toAjax(personnelService.saveSafety(personnel));
    }
    /**
     * ä¿®æ”¹äººå‘˜æ¡£æ¡ˆã€‚
     */
    @Log(title = "安环管理-人员档案-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改人员档案")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyPersonnel personnel) {
        return toAjax(personnelService.updateSafety(personnel));
    }
    /**
     * åˆ é™¤äººå‘˜æ¡£æ¡ˆã€‚
     */
    @Log(title = "安环管理-人员档案-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除人员档案")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(personnelService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢äººå‘˜æ¡£æ¡ˆè¯¦æƒ…。
     */
    @Log(title = "安环管理-人员档案-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询人员档案详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(personnelService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyRiskController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyRisk;
import com.ruoyi.safety.service.SafetyRiskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-岗位风险接口。
 */
@RestController
@Api(tags = "安环管理-岗位风险")
@RequestMapping("/safety/risk")
public class SafetyRiskController extends SafetyControllerSupport {
    @Autowired
    private SafetyRiskService riskService;
    /**
     * åˆ†é¡µæŸ¥è¯¢å²—位风险。
     */
    @Log(title = "安环管理-岗位风险-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询岗位风险")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyRisk> page, SafetyRisk query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(riskService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æ–°å¢žå²—位风险。
     */
    @Log(title = "安环管理-岗位风险-新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增岗位风险")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyRisk risk) {
        return toAjax(riskService.saveSafety(risk));
    }
    /**
     * ä¿®æ”¹å²—位风险。
     */
    @Log(title = "安环管理-岗位风险-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改岗位风险")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyRisk risk) {
        return toAjax(riskService.updateSafety(risk));
    }
    /**
     * åˆ é™¤å²—位风险。
     */
    @Log(title = "安环管理-岗位风险-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除岗位风险")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(riskService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢å²—位风险详情。
     */
    @Log(title = "安环管理-岗位风险-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询岗位风险详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(riskService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyTrainingMaterialController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyTrainingMaterial;
import com.ruoyi.safety.service.SafetyTrainingMaterialService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-培训资料接口。
 */
@RestController
@Api(tags = "安环管理-培训资料")
@RequestMapping("/safety/training/material")
public class SafetyTrainingMaterialController extends SafetyControllerSupport {
    @Autowired
    private SafetyTrainingMaterialService materialService;
    /**
     * åˆ†é¡µæŸ¥è¯¢åŸ¹è®­èµ„料。
     */
    @Log(title = "安环管理-培训资料-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询培训资料")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyTrainingMaterial> page, SafetyTrainingMaterial query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(materialService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * ä¸Šä¼ åŸ¹è®­èµ„料元数据。
     */
    @Log(title = "安环管理-培训资料-上传", businessType = BusinessType.INSERT)
    @ApiOperation("上传培训资料")
    @PostMapping("/upload")
    public AjaxResult upload(@RequestBody SafetyTrainingMaterial material) {
        return toAjax(materialService.saveSafety(material));
    }
    /**
     * ä¿®æ”¹åŸ¹è®­èµ„料。
     */
    @Log(title = "安环管理-培训资料-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改培训资料")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyTrainingMaterial material) {
        return toAjax(materialService.updateSafety(material));
    }
    /**
     * åˆ é™¤åŸ¹è®­èµ„料。
     */
    @Log(title = "安环管理-培训资料-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除培训资料")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(materialService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢åŸ¹è®­èµ„料详情。
     */
    @Log(title = "安环管理-培训资料-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询培训资料详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(materialService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyTrainingPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyTrainingPlan;
import com.ruoyi.safety.service.SafetyTrainingPlanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-培训计划接口。
 */
@RestController
@Api(tags = "安环管理-培训计划")
@RequestMapping("/safety/training/plan")
public class SafetyTrainingPlanController extends SafetyControllerSupport {
    @Autowired
    private SafetyTrainingPlanService planService;
    /**
     * åˆ†é¡µæŸ¥è¯¢åŸ¹è®­è®¡åˆ’。
     */
    @Log(title = "安环管理-培训计划-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询培训计划")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyTrainingPlan> page, SafetyTrainingPlan query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(planService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æ–°å¢žåŸ¹è®­è®¡åˆ’。
     */
    @Log(title = "安环管理-培训计划-新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增培训计划")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyTrainingPlan plan) {
        return toAjax(planService.saveSafety(plan));
    }
    /**
     * ä¿®æ”¹åŸ¹è®­è®¡åˆ’。
     */
    @Log(title = "安环管理-培训计划-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改培训计划")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyTrainingPlan plan) {
        return toAjax(planService.updateSafety(plan));
    }
    /**
     * åˆ é™¤åŸ¹è®­è®¡åˆ’。
     */
    @Log(title = "安环管理-培训计划-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除培训计划")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(planService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢åŸ¹è®­è®¡åˆ’详情。
     */
    @Log(title = "安环管理-培训计划-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询培训计划详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(planService.getById(id));
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyTrainingRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyTrainingRecord;
import com.ruoyi.safety.service.SafetyTrainingRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * å®‰çŽ¯ç®¡ç†-培训完成记录接口。
 */
@RestController
@Api(tags = "安环管理-培训完成记录")
@RequestMapping("/safety/training/record")
public class SafetyTrainingRecordController extends SafetyControllerSupport {
    @Autowired
    private SafetyTrainingRecordService recordService;
    /**
     * åˆ†é¡µæŸ¥è¯¢åŸ¹è®­å®Œæˆè®°å½•。
     */
    @Log(title = "安环管理-培训完成记录-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询培训完成记录")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyTrainingRecord> page, SafetyTrainingRecord query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(recordService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * add training completion record.
     */
    @Log(title = "safety-training-record-add", businessType = BusinessType.INSERT)
    @ApiOperation("add safety training completion record")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyTrainingRecord record) {
        return toAjax(recordService.saveSafety(record));
    }
    /**
     * update training completion record.
     */
    @Log(title = "safety-training-record-update", businessType = BusinessType.UPDATE)
    @ApiOperation("update safety training completion record")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyTrainingRecord record) {
        return toAjax(recordService.updateSafety(record));
    }
    /**
     * delete training completion record.
     */
    @Log(title = "safety-training-record-delete", businessType = BusinessType.DELETE)
    @ApiOperation("delete safety training completion record")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(recordService.deleteSafetyById(id));
    }
    /**
     * training completion record detail.
     */
    @Log(title = "safety-training-record-detail", businessType = BusinessType.OTHER)
    @ApiOperation("query safety training completion record detail")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(recordService.getById(id));
    }
    /**
     * å¯¼å‡ºåŸ¹è®­å®Œæˆè®°å½•。
     */
    @Log(title = "安环管理-培训完成记录-导出", businessType = BusinessType.EXPORT)
    @ApiOperation("导出培训完成记录")
    @GetMapping("/export")
    public void export(HttpServletResponse response, SafetyTrainingRecord query) {
        List<SafetyTrainingRecord> records = recordService.queryPage(new Page<SafetyTrainingRecord>(1, -1), query)
                .getRecords();
        ExcelUtil<SafetyTrainingRecord> util = new ExcelUtil<SafetyTrainingRecord>(SafetyTrainingRecord.class);
        util.exportExcel(response, records, "safety_training_record");
    }
}
src/main/java/com/ruoyi/safety/controller/SafetyWorkAreaController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.safety.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safety.pojo.SafetyWorkArea;
import com.ruoyi.safety.service.SafetyWorkAreaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * å®‰çŽ¯ç®¡ç†-作业区域接口。
 */
@RestController
@Api(tags = "安环管理-作业区域")
@RequestMapping("/safety/workArea")
public class SafetyWorkAreaController extends SafetyControllerSupport {
    @Autowired
    private SafetyWorkAreaService workAreaService;
    /**
     * åˆ†é¡µæŸ¥è¯¢ä½œä¸šåŒºåŸŸã€‚
     */
    @Log(title = "安环管理-作业区域-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询作业区域")
    @GetMapping("/list")
    public AjaxResult list(Page<SafetyWorkArea> page, SafetyWorkArea query,
                           @RequestParam(value = "pageNum", required = false) Long pageNum,
                           @RequestParam(value = "pageSize", required = false) Long pageSize) {
        return AjaxResult.success(workAreaService.queryPage(buildPage(page, pageNum, pageSize), query));
    }
    /**
     * æ–°å¢žä½œä¸šåŒºåŸŸã€‚
     */
    @Log(title = "安环管理-作业区域-新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增作业区域")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SafetyWorkArea workArea) {
        return toAjax(workAreaService.saveSafety(workArea));
    }
    /**
     * ä¿®æ”¹ä½œä¸šåŒºåŸŸã€‚
     */
    @Log(title = "安环管理-作业区域-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改作业区域")
    @PutMapping("/update")
    public AjaxResult update(@RequestBody SafetyWorkArea workArea) {
        return toAjax(workAreaService.updateSafety(workArea));
    }
    /**
     * åˆ é™¤ä½œä¸šåŒºåŸŸã€‚
     */
    @Log(title = "安环管理-作业区域-删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除作业区域")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        return toAjax(workAreaService.deleteSafetyById(id));
    }
    /**
     * æŸ¥è¯¢ä½œä¸šåŒºåŸŸè¯¦æƒ…。
     */
    @Log(title = "安环管理-作业区域-详情", businessType = BusinessType.OTHER)
    @ApiOperation("查询作业区域详情")
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(workAreaService.getById(id));
    }
    /**
     * æŸ¥è¯¢å…¨éƒ¨ä½œä¸šåŒºåŸŸï¼Œç”¨äºŽä¸‹æ‹‰é€‰æ‹©ã€‚
     */
    @Log(title = "安环管理-作业区域-全部查询", businessType = BusinessType.OTHER)
    @ApiOperation("查询全部作业区域")
    @GetMapping("/all")
    public AjaxResult all() {
        return AjaxResult.success(workAreaService.list(new QueryWrapper<SafetyWorkArea>().orderByDesc("create_time")));
    }
}
src/main/java/com/ruoyi/safety/dto/SafetyInspectionTodayStatistics.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.safety.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SafetyInspectionTodayStatistics {
    private Long totalCount;
    private Long completedCount;
    private Long abnormalCount;
    private Long missedCount;
    private Long unexecutedCount;
    private BigDecimal completionRate;
    private Long inspectorCount;
}
src/main/java/com/ruoyi/safety/dto/SafetyInspectionTrendStat.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.safety.dto;
import lombok.Data;
import java.time.LocalDate;
@Data
public class SafetyInspectionTrendStat {
    private LocalDate statDate;
    private Long totalCount;
    private Long completedCount;
    private Long abnormalCount;
    private Long missedCount;
    private Long unexecutedCount;
}
src/main/java/com/ruoyi/safety/dto/SafetyInspectionTypeStat.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.safety.dto;
import lombok.Data;
@Data
public class SafetyInspectionTypeStat {
    private String type;
    private Long count;
}
src/main/java/com/ruoyi/safety/dto/SafetyInspectorStat.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.safety.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SafetyInspectorStat {
    private Long inspectorId;
    private String inspector;
    private Long totalCount;
    private Long completedCount;
    private Long abnormalCount;
    private Long missedCount;
    private Long unexecutedCount;
    private BigDecimal completionRate;
}
src/main/java/com/ruoyi/safety/dto/SafetyLearningStatistics.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.safety.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SafetyLearningStatistics {
    private Long totalCount;
    private Long completedCount;
    private Long unfinishedCount;
    private BigDecimal totalDuration;
    private BigDecimal completionRate;
}
src/main/java/com/ruoyi/safety/mapper/SafetyAssessmentReportMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyAssessmentReport;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyAssessmentReportMapper extends BaseMapper<SafetyAssessmentReport> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyAssessmentTaskEmployeeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyAssessmentTaskEmployee;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyAssessmentTaskEmployeeMapper extends BaseMapper<SafetyAssessmentTaskEmployee> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyAssessmentTaskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyAssessmentTask;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyAssessmentTaskMapper extends BaseMapper<SafetyAssessmentTask> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyEmergencyResourceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyEmergencyResource;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyEmergencyResourceMapper extends BaseMapper<SafetyEmergencyResource> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyEquipmentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyEquipment;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyEquipmentMapper extends BaseMapper<SafetyEquipment> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyInspectionRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.dto.SafetyInspectionTodayStatistics;
import com.ruoyi.safety.dto.SafetyInspectionTrendStat;
import com.ruoyi.safety.dto.SafetyInspectionTypeStat;
import com.ruoyi.safety.dto.SafetyInspectorStat;
import com.ruoyi.safety.pojo.SafetyInspectionRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
@Mapper
public interface SafetyInspectionRecordMapper extends BaseMapper<SafetyInspectionRecord> {
    SafetyInspectionTodayStatistics selectTodayStatistics(@Param("statDate") LocalDate statDate);
    List<SafetyInspectionTrendStat> selectTrendStatistics(@Param("startDate") String startDate,
                                                          @Param("endDate") String endDate);
    List<SafetyInspectionTypeStat> selectTypeStatistics(@Param("startDate") String startDate,
                                                        @Param("endDate") String endDate);
    List<SafetyInspectorStat> selectInspectorStatistics(@Param("startDate") String startDate,
                                                        @Param("endDate") String endDate);
}
src/main/java/com/ruoyi/safety/mapper/SafetyLearningRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.dto.SafetyLearningStatistics;
import com.ruoyi.safety.pojo.SafetyLearningRecord;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyLearningRecordMapper extends BaseMapper<SafetyLearningRecord> {
    SafetyLearningStatistics selectStatistics();
}
src/main/java/com/ruoyi/safety/mapper/SafetyPersonnelMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyPersonnel;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyPersonnelMapper extends BaseMapper<SafetyPersonnel> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyRiskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyRisk;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyRiskMapper extends BaseMapper<SafetyRisk> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyTrainingMaterialMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyTrainingMaterial;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyTrainingMaterialMapper extends BaseMapper<SafetyTrainingMaterial> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyTrainingPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyTrainingPlan;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyTrainingPlanMapper extends BaseMapper<SafetyTrainingPlan> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyTrainingRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyTrainingRecord;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyTrainingRecordMapper extends BaseMapper<SafetyTrainingRecord> {
}
src/main/java/com/ruoyi/safety/mapper/SafetyWorkAreaMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.safety.pojo.SafetyWorkArea;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SafetyWorkAreaMapper extends BaseMapper<SafetyWorkArea> {
}
src/main/java/com/ruoyi/safety/pojo/SafetyAssessmentReport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_assessment_report")
public class SafetyAssessmentReport extends SafetyBaseEntity {
    private Long employeeId;
    private String employeeName;
    private String name;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime assessTime;
    private BigDecimal score;
    private String grade;
    private Integer qualified;
}
src/main/java/com/ruoyi/safety/pojo/SafetyAssessmentTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_assessment_task")
public class SafetyAssessmentTask extends SafetyBaseEntity {
    private String title;
    private String description;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate deadline;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyAssessmentTaskEmployee.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_assessment_task_employee")
public class SafetyAssessmentTaskEmployee extends SafetyBaseEntity {
    private Long taskId;
    private Long employeeId;
    private String employeeName;
    private Integer status;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime completeTime;
    private BigDecimal score;
}
src/main/java/com/ruoyi/safety/pojo/SafetyBaseEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class SafetyBaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField("create_by")
    private String createBy;
    @TableField(condition = "create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField("update_by")
    private String updateBy;
    @TableField(condition = "update_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private String remark;
    @TableField("del_flag")
    @TableLogic(value = "0", delval = "1")
    private Integer delFlag;
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/safety/pojo/SafetyEmergencyResource.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_emergency_resource")
public class SafetyEmergencyResource extends SafetyBaseEntity {
    private String name;
    private String type;
    private Integer quantity;
    private String location;
    private Long areaId;
    private String manager;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyEquipment.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_equipment")
public class SafetyEquipment extends SafetyBaseEntity {
    private String name;
    private String model;
    private Long areaId;
    private String areaName;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyInspectionRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_inspection_record")
public class SafetyInspectionRecord extends SafetyBaseEntity {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime inspectionTime;
    private Long inspectorId;
    private String inspector;
    private Long areaId;
    private String area;
    private String type;
    private Integer status;
    private String abnormalDesc;
    private Integer isMissed;
}
src/main/java/com/ruoyi/safety/pojo/SafetyLearningRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_learning_record")
public class SafetyLearningRecord extends SafetyBaseEntity {
    private Long employeeId;
    private String employeeName;
    private String content;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime trainingTime;
    private BigDecimal duration;
    private String method;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyPersonnel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_personnel")
public class SafetyPersonnel extends SafetyBaseEntity {
    private String name;
    private String dept;
    private String post;
    private String phone;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate entryDate;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyRisk.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_risk")
public class SafetyRisk extends SafetyBaseEntity {
    private String type;
    private String level;
    private String description;
    private String post;
    private String controlMeasures;
}
src/main/java/com/ruoyi/safety/pojo/SafetyTrainingMaterial.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_training_material")
public class SafetyTrainingMaterial extends SafetyBaseEntity {
    private String name;
    private String type;
    private String fileUrl;
    private String fileSize;
    private String uploader;
    private Long uploaderId;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime uploadTime;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyTrainingPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_training_plan")
public class SafetyTrainingPlan extends SafetyBaseEntity {
    @TableField("`year`")
    private String year;
    private String post;
    @TableField("`level`")
    private String level;
    private String content;
    private BigDecimal hours;
    private String materialIds;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyTrainingRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_training_record")
public class SafetyTrainingRecord extends SafetyBaseEntity {
    private Long planId;
    private Long employeeId;
    private String employeeName;
    private String content;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime completeTime;
    private BigDecimal duration;
    private String method;
    private String result;
    private BigDecimal score;
    private Integer status;
}
src/main/java/com/ruoyi/safety/pojo/SafetyWorkArea.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.safety.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("safety_work_area")
public class SafetyWorkArea extends SafetyBaseEntity {
    private String name;
    private String location;
    private String manager;
    private Long managerId;
}
src/main/java/com/ruoyi/safety/service/SafetyAssessmentReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyAssessmentReport;
public interface SafetyAssessmentReportService extends SafetyBaseService<SafetyAssessmentReport> {
}
src/main/java/com/ruoyi/safety/service/SafetyAssessmentTaskEmployeeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyAssessmentTaskEmployee;
public interface SafetyAssessmentTaskEmployeeService extends SafetyBaseService<SafetyAssessmentTaskEmployee> {
    boolean start(SafetyAssessmentTaskEmployee request);
    boolean submit(SafetyAssessmentTaskEmployee request);
}
src/main/java/com/ruoyi/safety/service/SafetyAssessmentTaskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyAssessmentTask;
public interface SafetyAssessmentTaskService extends SafetyBaseService<SafetyAssessmentTask> {
}
src/main/java/com/ruoyi/safety/service/SafetyBaseService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.safety.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.safety.pojo.SafetyBaseEntity;
public interface SafetyBaseService<T extends SafetyBaseEntity> extends IService<T> {
    IPage<T> queryPage(Page<T> page, T query);
    boolean saveSafety(T entity);
    boolean updateSafety(T entity);
    boolean deleteSafetyById(Long id);
}
src/main/java/com/ruoyi/safety/service/SafetyEmergencyResourceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyEmergencyResource;
public interface SafetyEmergencyResourceService extends SafetyBaseService<SafetyEmergencyResource> {
}
src/main/java/com/ruoyi/safety/service/SafetyEquipmentService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyEquipment;
public interface SafetyEquipmentService extends SafetyBaseService<SafetyEquipment> {
}
src/main/java/com/ruoyi/safety/service/SafetyInspectionRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.safety.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.dto.SafetyInspectionTodayStatistics;
import com.ruoyi.safety.dto.SafetyInspectionTrendStat;
import com.ruoyi.safety.dto.SafetyInspectionTypeStat;
import com.ruoyi.safety.dto.SafetyInspectorStat;
import com.ruoyi.safety.pojo.SafetyInspectionRecord;
import java.util.List;
public interface SafetyInspectionRecordService extends SafetyBaseService<SafetyInspectionRecord> {
    IPage<SafetyInspectionRecord> queryPage(Page<SafetyInspectionRecord> page,
                                            SafetyInspectionRecord query,
                                            String startDate,
                                            String endDate);
    SafetyInspectionTodayStatistics getTodayStatistics();
    List<SafetyInspectionTrendStat> getTrendStatistics(String startDate, String endDate);
    List<SafetyInspectionTypeStat> getTypeStatistics(String startDate, String endDate);
    List<SafetyInspectorStat> getInspectorStatistics(String startDate, String endDate);
    List<SafetyInspectionRecord> syncMockSubsystemData();
}
src/main/java/com/ruoyi/safety/service/SafetyLearningRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.dto.SafetyLearningStatistics;
import com.ruoyi.safety.pojo.SafetyLearningRecord;
public interface SafetyLearningRecordService extends SafetyBaseService<SafetyLearningRecord> {
    SafetyLearningStatistics getStatistics();
}
src/main/java/com/ruoyi/safety/service/SafetyPersonnelService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyPersonnel;
public interface SafetyPersonnelService extends SafetyBaseService<SafetyPersonnel> {
}
src/main/java/com/ruoyi/safety/service/SafetyRiskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyRisk;
public interface SafetyRiskService extends SafetyBaseService<SafetyRisk> {
}
src/main/java/com/ruoyi/safety/service/SafetyTrainingMaterialService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyTrainingMaterial;
public interface SafetyTrainingMaterialService extends SafetyBaseService<SafetyTrainingMaterial> {
}
src/main/java/com/ruoyi/safety/service/SafetyTrainingPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyTrainingPlan;
public interface SafetyTrainingPlanService extends SafetyBaseService<SafetyTrainingPlan> {
}
src/main/java/com/ruoyi/safety/service/SafetyTrainingRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyTrainingRecord;
public interface SafetyTrainingRecordService extends SafetyBaseService<SafetyTrainingRecord> {
}
src/main/java/com/ruoyi/safety/service/SafetyWorkAreaService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.safety.service;
import com.ruoyi.safety.pojo.SafetyWorkArea;
public interface SafetyWorkAreaService extends SafetyBaseService<SafetyWorkArea> {
}
src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentReportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyAssessmentReportMapper;
import com.ruoyi.safety.pojo.SafetyAssessmentReport;
import com.ruoyi.safety.service.SafetyAssessmentReportService;
import org.springframework.stereotype.Service;
@Service
public class SafetyAssessmentReportServiceImpl
        extends SafetyBaseServiceImpl<SafetyAssessmentReportMapper, SafetyAssessmentReport>
        implements SafetyAssessmentReportService {
    @Override
    public IPage<SafetyAssessmentReport> queryPage(Page<SafetyAssessmentReport> page, SafetyAssessmentReport query) {
        QueryWrapper<SafetyAssessmentReport> wrapper =
                new QueryWrapper<SafetyAssessmentReport>().orderByDesc("create_time");
        if (query != null) {
            if (query.getEmployeeId() != null) {
                wrapper.eq("employee_id", query.getEmployeeId());
            }
            if (hasText(query.getEmployeeName())) {
                wrapper.like("employee_name", query.getEmployeeName());
            }
            if (hasText(query.getName())) {
                wrapper.like("name", query.getName());
            }
            if (query.getQualified() != null) {
                wrapper.eq("qualified", query.getQualified());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskEmployeeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyAssessmentTaskEmployeeMapper;
import com.ruoyi.safety.pojo.SafetyAssessmentTask;
import com.ruoyi.safety.pojo.SafetyAssessmentTaskEmployee;
import com.ruoyi.safety.service.SafetyAssessmentTaskEmployeeService;
import com.ruoyi.safety.service.SafetyAssessmentTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
public class SafetyAssessmentTaskEmployeeServiceImpl
        extends SafetyBaseServiceImpl<SafetyAssessmentTaskEmployeeMapper, SafetyAssessmentTaskEmployee>
        implements SafetyAssessmentTaskEmployeeService {
    @Autowired
    private SafetyAssessmentTaskService taskService;
    @Override
    public IPage<SafetyAssessmentTaskEmployee> queryPage(Page<SafetyAssessmentTaskEmployee> page,
                                                         SafetyAssessmentTaskEmployee query) {
        QueryWrapper<SafetyAssessmentTaskEmployee> wrapper =
                new QueryWrapper<SafetyAssessmentTaskEmployee>().orderByDesc("create_time");
        if (query != null) {
            if (query.getTaskId() != null) {
                wrapper.eq("task_id", query.getTaskId());
            }
            if (query.getEmployeeId() != null) {
                wrapper.eq("employee_id", query.getEmployeeId());
            }
            if (hasText(query.getEmployeeName())) {
                wrapper.like("employee_name", query.getEmployeeName());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
    @Override
    public boolean start(SafetyAssessmentTaskEmployee request) {
        if (request == null || request.getTaskId() == null) {
            return false;
        }
        fillCurrentEmployeeIfMissing(request);
        if (request.getEmployeeId() == null) {
            return false;
        }
        SafetyAssessmentTaskEmployee existing = getOne(new QueryWrapper<SafetyAssessmentTaskEmployee>()
                .eq("task_id", request.getTaskId())
                .eq("employee_id", request.getEmployeeId())
                .last("limit 1"));
        if (existing != null) {
            return true;
        }
        if (request.getStatus() == null) {
            request.setStatus(0);
        }
        updateTaskStatus(request.getTaskId(), 1);
        return saveSafety(request);
    }
    @Override
    public boolean submit(SafetyAssessmentTaskEmployee request) {
        if (request == null) {
            return false;
        }
        fillCurrentEmployeeIfMissing(request);
        SafetyAssessmentTaskEmployee target = findSubmitTarget(request);
        if (target == null) {
            if (request.getTaskId() == null || request.getEmployeeId() == null) {
                return false;
            }
            request.setStatus(1);
            if (request.getCompleteTime() == null) {
                request.setCompleteTime(LocalDateTime.now());
            }
            boolean saved = saveSafety(request);
            finishTaskWhenAllSubmitted(request.getTaskId());
            return saved;
        }
        target.setStatus(1);
        target.setScore(request.getScore());
        target.setRemark(request.getRemark());
        target.setCompleteTime(request.getCompleteTime() == null ? LocalDateTime.now() : request.getCompleteTime());
        boolean updated = updateSafety(target);
        finishTaskWhenAllSubmitted(target.getTaskId());
        return updated;
    }
    private SafetyAssessmentTaskEmployee findSubmitTarget(SafetyAssessmentTaskEmployee request) {
        if (request.getId() != null) {
            SafetyAssessmentTaskEmployee byId = getById(request.getId());
            if (byId != null) {
                return byId;
            }
        }
        if (request.getTaskId() != null && request.getEmployeeId() != null) {
            return getOne(new QueryWrapper<SafetyAssessmentTaskEmployee>()
                    .eq("task_id", request.getTaskId())
                    .eq("employee_id", request.getEmployeeId())
                    .last("limit 1"));
        }
        return null;
    }
    private void fillCurrentEmployeeIfMissing(SafetyAssessmentTaskEmployee request) {
        if (request.getEmployeeId() == null) {
            request.setEmployeeId(currentUserId());
        }
        if (!hasText(request.getEmployeeName())) {
            request.setEmployeeName(currentUsername());
        }
    }
    private void updateTaskStatus(Long taskId, Integer status) {
        SafetyAssessmentTask task = taskService.getById(taskId);
        if (task != null && (task.getStatus() == null || task.getStatus() < status)) {
            task.setStatus(status);
            taskService.updateSafety(task);
        }
    }
    private void finishTaskWhenAllSubmitted(Long taskId) {
        if (taskId == null) {
            return;
        }
        long pending = count(new QueryWrapper<SafetyAssessmentTaskEmployee>()
                .eq("task_id", taskId)
                .eq("status", 0));
        if (pending == 0) {
            updateTaskStatus(taskId, 2);
        }
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyAssessmentTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyAssessmentTaskMapper;
import com.ruoyi.safety.pojo.SafetyAssessmentTask;
import com.ruoyi.safety.service.SafetyAssessmentTaskService;
import org.springframework.stereotype.Service;
@Service
public class SafetyAssessmentTaskServiceImpl
        extends SafetyBaseServiceImpl<SafetyAssessmentTaskMapper, SafetyAssessmentTask>
        implements SafetyAssessmentTaskService {
    @Override
    public IPage<SafetyAssessmentTask> queryPage(Page<SafetyAssessmentTask> page, SafetyAssessmentTask query) {
        QueryWrapper<SafetyAssessmentTask> wrapper =
                new QueryWrapper<SafetyAssessmentTask>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getTitle())) {
                wrapper.like("title", query.getTitle());
            }
            if (query.getDeadline() != null) {
                wrapper.eq("deadline", query.getDeadline());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyBaseServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.safety.pojo.SafetyBaseEntity;
import com.ruoyi.safety.service.SafetyBaseService;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDateTime;
public abstract class SafetyBaseServiceImpl<M extends BaseMapper<T>, T extends SafetyBaseEntity>
        extends ServiceImpl<M, T> implements SafetyBaseService<T> {
    @Override
    public boolean saveSafety(T entity) {
        entity.setCreateBy(currentUsername());
        entity.setCreateTime(LocalDateTime.now());
        if (entity.getDelFlag() == null) {
            entity.setDelFlag(0);
        }
        return save(entity);
    }
    @Override
    public boolean updateSafety(T entity) {
        entity.setUpdateBy(currentUsername());
        entity.setUpdateTime(LocalDateTime.now());
        return updateById(entity);
    }
    @Override
    public boolean deleteSafetyById(Long id) {
        return removeById(id);
    }
    protected boolean hasText(String value) {
        return StringUtils.isNotBlank(value);
    }
    protected String currentUsername() {
        try {
            return SecurityUtils.getLoginUser().getNickName();
        } catch (Exception ignored) {
            return null;
        }
    }
    protected Long currentUserId() {
        try {
            return SecurityUtils.getUserId();
        } catch (Exception ignored) {
            return null;
        }
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyEmergencyResourceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyEmergencyResourceMapper;
import com.ruoyi.safety.pojo.SafetyEmergencyResource;
import com.ruoyi.safety.service.SafetyEmergencyResourceService;
import org.springframework.stereotype.Service;
@Service
public class SafetyEmergencyResourceServiceImpl
        extends SafetyBaseServiceImpl<SafetyEmergencyResourceMapper, SafetyEmergencyResource>
        implements SafetyEmergencyResourceService {
    @Override
    public IPage<SafetyEmergencyResource> queryPage(Page<SafetyEmergencyResource> page,
                                                    SafetyEmergencyResource query) {
        QueryWrapper<SafetyEmergencyResource> wrapper =
                new QueryWrapper<SafetyEmergencyResource>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getName())) {
                wrapper.like("name", query.getName());
            }
            if (hasText(query.getType())) {
                wrapper.like("type", query.getType());
            }
            if (query.getAreaId() != null) {
                wrapper.eq("area_id", query.getAreaId());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyEquipmentServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyEquipmentMapper;
import com.ruoyi.safety.pojo.SafetyEquipment;
import com.ruoyi.safety.service.SafetyEquipmentService;
import org.springframework.stereotype.Service;
@Service
public class SafetyEquipmentServiceImpl extends SafetyBaseServiceImpl<SafetyEquipmentMapper, SafetyEquipment>
        implements SafetyEquipmentService {
    @Override
    public IPage<SafetyEquipment> queryPage(Page<SafetyEquipment> page, SafetyEquipment query) {
        QueryWrapper<SafetyEquipment> wrapper = new QueryWrapper<SafetyEquipment>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getName())) {
                wrapper.like("name", query.getName());
            }
            if (hasText(query.getModel())) {
                wrapper.like("model", query.getModel());
            }
            if (query.getAreaId() != null) {
                wrapper.eq("area_id", query.getAreaId());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyInspectionRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,194 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.framework.redis.RedisCache;
import com.ruoyi.safety.dto.SafetyInspectionTodayStatistics;
import com.ruoyi.safety.dto.SafetyInspectionTrendStat;
import com.ruoyi.safety.dto.SafetyInspectionTypeStat;
import com.ruoyi.safety.dto.SafetyInspectorStat;
import com.ruoyi.safety.mapper.SafetyInspectionRecordMapper;
import com.ruoyi.safety.pojo.SafetyInspectionRecord;
import com.ruoyi.safety.service.SafetyInspectionRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Service
public class SafetyInspectionRecordServiceImpl
        extends SafetyBaseServiceImpl<SafetyInspectionRecordMapper, SafetyInspectionRecord>
        implements SafetyInspectionRecordService {
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final String SYNC_DAILY_KEY_PREFIX = "safety:inspection:sync:daily:";
    @Autowired
    private RedisCache redisCache;
    @Override
    public IPage<SafetyInspectionRecord> queryPage(Page<SafetyInspectionRecord> page,
                                                   SafetyInspectionRecord query,
                                                   String startDate,
                                                   String endDate) {
        QueryWrapper<SafetyInspectionRecord> wrapper =
                new QueryWrapper<SafetyInspectionRecord>().orderByDesc("inspection_time");
        if (query != null) {
            if (query.getInspectorId() != null) {
                wrapper.eq("inspector_id", query.getInspectorId());
            }
            if (hasText(query.getInspector())) {
                wrapper.like("inspector", query.getInspector());
            }
            if (query.getAreaId() != null) {
                wrapper.eq("area_id", query.getAreaId());
            }
            if (hasText(query.getArea())) {
                wrapper.like("area", query.getArea());
            }
            if (hasText(query.getType())) {
                wrapper.eq("type", query.getType());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        if (hasText(startDate)) {
            wrapper.ge("inspection_time", startDate + " 00:00:00");
        }
        if (hasText(endDate)) {
            wrapper.le("inspection_time", endDate + " 23:59:59");
        }
        return page(page, wrapper);
    }
    @Override
    public IPage<SafetyInspectionRecord> queryPage(Page<SafetyInspectionRecord> page, SafetyInspectionRecord query) {
        return queryPage(page, query, null, null);
    }
    @Override
    public SafetyInspectionTodayStatistics getTodayStatistics() {
        return baseMapper.selectTodayStatistics(LocalDate.now());
    }
    @Override
    public List<SafetyInspectionTrendStat> getTrendStatistics(String startDate, String endDate) {
        String[] range = normalizeRange(startDate, endDate);
        return baseMapper.selectTrendStatistics(range[0], range[1]);
    }
    @Override
    public List<SafetyInspectionTypeStat> getTypeStatistics(String startDate, String endDate) {
        String[] range = normalizeRange(startDate, endDate);
        return baseMapper.selectTypeStatistics(range[0], range[1]);
    }
    @Override
    public List<SafetyInspectorStat> getInspectorStatistics(String startDate, String endDate) {
        String[] range = normalizeRange(startDate, endDate);
        return baseMapper.selectInspectorStatistics(range[0], range[1]);
    }
    @Override
    public List<SafetyInspectionRecord> syncMockSubsystemData() {
        String todaySyncKey = buildTodaySyncKey();
        if (Boolean.TRUE.equals(redisCache.hasKey(todaySyncKey))) {
            throw new ServiceException("今日已同步,明天再试");
        }
        List<SafetyInspectionRecord> mockRecords = buildMockRecords();
        saveBatch(mockRecords);
        int secondsToEndOfDay = secondsToEndOfDay();
        redisCache.setCacheObject(todaySyncKey, "1", secondsToEndOfDay, TimeUnit.SECONDS);
        return mockRecords;
    }
    private String[] normalizeRange(String startDate, String endDate) {
        LocalDate end = hasText(endDate) ? LocalDate.parse(endDate, DATE_FORMATTER) : LocalDate.now();
        LocalDate start = hasText(startDate) ? LocalDate.parse(startDate, DATE_FORMATTER) : end.minusDays(6);
        return new String[]{start.format(DATE_FORMATTER), end.format(DATE_FORMATTER)};
    }
    private List<SafetyInspectionRecord> buildMockRecords() {
        LocalDate today = LocalDate.now();
        LocalDateTime now = LocalDateTime.now();
        String operator = currentUsername();
        List<SafetyInspectionRecord> records = new ArrayList<SafetyInspectionRecord>(18);
        records.add(createMockRecord(today.minusDays(6), LocalTime.of(8, 30), 101L, "李静", 1L, "大厅", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(6), LocalTime.of(10, 20), 102L, "李世杰", 2L, "前台", "fire", 1, 0, "\u706d\u706b\u5668\u538b\u529b\u4f4e", now, operator));
        records.add(createMockRecord(today.minusDays(5), LocalTime.of(9, 15), 101L, "王亚伟", 3L, "大厅", "equipment", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(5), LocalTime.of(14, 0), 103L, "王亚伟", 1L, "大厅", "daily", 3, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(4), LocalTime.of(8, 45), 102L, "李世杰", 2L, "机电房", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(4), LocalTime.of(15, 30), 104L, "顾全", 4L, "机房", "night", 2, 1, "\u5de1\u68c0\u70b9A3\u6f0f\u68c0", now, operator));
        records.add(createMockRecord(today.minusDays(3), LocalTime.of(9, 5), 101L, "李静", 1L, "锅炉房", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(3), LocalTime.of(16, 20), 103L, "王亚伟", 3L, "机电房", "fire", 1, 0, "\u5e94\u6025\u901a\u9053\u5806\u653e\u5835\u585e", now, operator));
        records.add(createMockRecord(today.minusDays(2), LocalTime.of(8, 55), 102L, "李世杰", 2L, "机电房", "equipment", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(2), LocalTime.of(13, 40), 104L, "顾全", 4L, "机房", "night", 3, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(1), LocalTime.of(8, 40), 101L, "李静", 1L, "机房", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(1), LocalTime.of(10, 5), 102L, "李世杰", 2L, "储物间", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today.minusDays(1), LocalTime.of(14, 35), 103L, "王亚伟", 3L, "储物间", "fire", 1, 0, "\u5b89\u5168\u6807\u8bc6\u7834\u635f", now, operator));
        records.add(createMockRecord(today.minusDays(1), LocalTime.of(17, 10), 104L, "顾全", 4L, "储物间", "equipment", 2, 1, "\u5de5\u5177\u7bb1\u70b9\u68c0\u6f0f\u68c0", now, operator));
        records.add(createMockRecord(today, LocalTime.of(8, 20), 101L, "李静", 1L, "二楼消防间", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today, LocalTime.of(10, 10), 102L, "李世杰", 2L, "二楼消防间", "daily", 0, 0, null, now, operator));
        records.add(createMockRecord(today, LocalTime.of(14, 25), 103L, "王亚伟", 3L, "二楼消防间", "equipment", 0, 0, null, now, operator));
        records.add(createMockRecord(today, LocalTime.of(16, 50), 104L, "顾全", 4L, "大厅", "night", 3, 0, null, now, operator));
        return records;
    }
    private SafetyInspectionRecord createMockRecord(LocalDate date,
                                                    LocalTime time,
                                                    Long inspectorId,
                                                    String inspector,
                                                    Long areaId,
                                                    String area,
                                                    String type,
                                                    Integer status,
                                                    Integer isMissed,
                                                    String abnormalDesc,
                                                    LocalDateTime createTime,
                                                    String createBy) {
        SafetyInspectionRecord record = new SafetyInspectionRecord();
        record.setInspectionTime(LocalDateTime.of(date, time));
        record.setInspectorId(inspectorId);
        record.setInspector(inspector);
        record.setAreaId(areaId);
        record.setArea(area);
        record.setType(type);
        record.setStatus(status);
        record.setIsMissed(isMissed);
        record.setAbnormalDesc(abnormalDesc);
        record.setRemark("mock-subsystem-sync");
        record.setCreateTime(createTime);
        record.setCreateBy(createBy);
        record.setDelFlag(0);
        return record;
    }
    private String buildTodaySyncKey() {
        String tenantPart = "default";
        try {
            Long tenantId = com.ruoyi.common.utils.SecurityUtils.getLoginUser().getTenantId();
            if (tenantId != null) {
                tenantPart = String.valueOf(tenantId);
            }
        } catch (Exception ignored) {
        }
        return SYNC_DAILY_KEY_PREFIX + tenantPart + ":" + LocalDate.now().format(DATE_FORMATTER);
    }
    private int secondsToEndOfDay() {
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime endOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
        long seconds = java.time.Duration.between(now, endOfDay).getSeconds();
        return (int) Math.max(seconds, 1L);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyLearningRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.dto.SafetyLearningStatistics;
import com.ruoyi.safety.mapper.SafetyLearningRecordMapper;
import com.ruoyi.safety.pojo.SafetyLearningRecord;
import com.ruoyi.safety.service.SafetyLearningRecordService;
import org.springframework.stereotype.Service;
@Service
public class SafetyLearningRecordServiceImpl
        extends SafetyBaseServiceImpl<SafetyLearningRecordMapper, SafetyLearningRecord>
        implements SafetyLearningRecordService {
    @Override
    public IPage<SafetyLearningRecord> queryPage(Page<SafetyLearningRecord> page, SafetyLearningRecord query) {
        QueryWrapper<SafetyLearningRecord> wrapper =
                new QueryWrapper<SafetyLearningRecord>().orderByDesc("create_time");
        if (query != null) {
            if (query.getEmployeeId() != null) {
                wrapper.eq("employee_id", query.getEmployeeId());
            }
            if (hasText(query.getEmployeeName())) {
                wrapper.like("employee_name", query.getEmployeeName());
            }
            if (hasText(query.getContent())) {
                wrapper.like("content", query.getContent());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
    @Override
    public SafetyLearningStatistics getStatistics() {
        return baseMapper.selectStatistics();
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyPersonnelServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyPersonnelMapper;
import com.ruoyi.safety.pojo.SafetyPersonnel;
import com.ruoyi.safety.service.SafetyPersonnelService;
import org.springframework.stereotype.Service;
@Service
public class SafetyPersonnelServiceImpl extends SafetyBaseServiceImpl<SafetyPersonnelMapper, SafetyPersonnel>
        implements SafetyPersonnelService {
    @Override
    public IPage<SafetyPersonnel> queryPage(Page<SafetyPersonnel> page, SafetyPersonnel query) {
        QueryWrapper<SafetyPersonnel> wrapper = new QueryWrapper<SafetyPersonnel>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getName())) {
                wrapper.like("name", query.getName());
            }
            if (hasText(query.getDept())) {
                wrapper.like("dept", query.getDept());
            }
            if (hasText(query.getPost())) {
                wrapper.like("post", query.getPost());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyRiskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyRiskMapper;
import com.ruoyi.safety.pojo.SafetyRisk;
import com.ruoyi.safety.service.SafetyRiskService;
import org.springframework.stereotype.Service;
@Service
public class SafetyRiskServiceImpl extends SafetyBaseServiceImpl<SafetyRiskMapper, SafetyRisk>
        implements SafetyRiskService {
    @Override
    public IPage<SafetyRisk> queryPage(Page<SafetyRisk> page, SafetyRisk query) {
        QueryWrapper<SafetyRisk> wrapper = new QueryWrapper<SafetyRisk>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getType())) {
                wrapper.like("type", query.getType());
            }
            if (hasText(query.getLevel())) {
                wrapper.eq("level", query.getLevel());
            }
            if (hasText(query.getPost())) {
                wrapper.like("post", query.getPost());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyTrainingMaterialServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyTrainingMaterialMapper;
import com.ruoyi.safety.pojo.SafetyTrainingMaterial;
import com.ruoyi.safety.service.SafetyTrainingMaterialService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
public class SafetyTrainingMaterialServiceImpl
        extends SafetyBaseServiceImpl<SafetyTrainingMaterialMapper, SafetyTrainingMaterial>
        implements SafetyTrainingMaterialService {
    @Override
    public IPage<SafetyTrainingMaterial> queryPage(Page<SafetyTrainingMaterial> page,
                                                   SafetyTrainingMaterial query) {
        QueryWrapper<SafetyTrainingMaterial> wrapper =
                new QueryWrapper<SafetyTrainingMaterial>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getName())) {
                wrapper.like("name", query.getName());
            }
            if (hasText(query.getType())) {
                wrapper.eq("type", query.getType());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
    @Override
    public boolean saveSafety(SafetyTrainingMaterial entity) {
        if (entity.getUploadTime() == null) {
            entity.setUploadTime(LocalDateTime.now());
        }
        if (!hasText(entity.getUploader())) {
            entity.setUploader(currentUsername());
        }
        if (entity.getUploaderId() == null) {
            entity.setUploaderId(currentUserId());
        }
        return super.saveSafety(entity);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyTrainingPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyTrainingPlanMapper;
import com.ruoyi.safety.pojo.SafetyTrainingPlan;
import com.ruoyi.safety.service.SafetyTrainingPlanService;
import org.springframework.stereotype.Service;
@Service
public class SafetyTrainingPlanServiceImpl
        extends SafetyBaseServiceImpl<SafetyTrainingPlanMapper, SafetyTrainingPlan>
        implements SafetyTrainingPlanService {
    @Override
    public IPage<SafetyTrainingPlan> queryPage(Page<SafetyTrainingPlan> page, SafetyTrainingPlan query) {
        QueryWrapper<SafetyTrainingPlan> wrapper = new QueryWrapper<SafetyTrainingPlan>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getYear())) {
                wrapper.eq("`year`", query.getYear());
            }
            if (hasText(query.getPost())) {
                wrapper.like("post", query.getPost());
            }
            if (hasText(query.getLevel())) {
                wrapper.eq("`level`", query.getLevel());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyTrainingRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyTrainingRecordMapper;
import com.ruoyi.safety.pojo.SafetyTrainingRecord;
import com.ruoyi.safety.service.SafetyTrainingRecordService;
import org.springframework.stereotype.Service;
@Service
public class SafetyTrainingRecordServiceImpl
        extends SafetyBaseServiceImpl<SafetyTrainingRecordMapper, SafetyTrainingRecord>
        implements SafetyTrainingRecordService {
    @Override
    public IPage<SafetyTrainingRecord> queryPage(Page<SafetyTrainingRecord> page, SafetyTrainingRecord query) {
        QueryWrapper<SafetyTrainingRecord> wrapper =
                new QueryWrapper<SafetyTrainingRecord>().orderByDesc("create_time");
        if (query != null) {
            if (query.getPlanId() != null) {
                wrapper.eq("plan_id", query.getPlanId());
            }
            if (query.getEmployeeId() != null) {
                wrapper.eq("employee_id", query.getEmployeeId());
            }
            if (hasText(query.getEmployeeName())) {
                wrapper.like("employee_name", query.getEmployeeName());
            }
            if (query.getStatus() != null) {
                wrapper.eq("status", query.getStatus());
            }
        }
        return page(page, wrapper);
    }
}
src/main/java/com/ruoyi/safety/service/impl/SafetyWorkAreaServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.safety.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safety.mapper.SafetyWorkAreaMapper;
import com.ruoyi.safety.pojo.SafetyWorkArea;
import com.ruoyi.safety.service.SafetyWorkAreaService;
import org.springframework.stereotype.Service;
@Service
public class SafetyWorkAreaServiceImpl extends SafetyBaseServiceImpl<SafetyWorkAreaMapper, SafetyWorkArea>
        implements SafetyWorkAreaService {
    @Override
    public IPage<SafetyWorkArea> queryPage(Page<SafetyWorkArea> page, SafetyWorkArea query) {
        QueryWrapper<SafetyWorkArea> wrapper = new QueryWrapper<SafetyWorkArea>().orderByDesc("create_time");
        if (query != null) {
            if (hasText(query.getName())) {
                wrapper.like("name", query.getName());
            }
            if (hasText(query.getManager())) {
                wrapper.like("manager", query.getManager());
            }
            if (query.getManagerId() != null) {
                wrapper.eq("manager_id", query.getManagerId());
            }
        }
        return page(page, wrapper);
    }
}
src/main/resources/application-dev.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
# èН坼-仓储物流系统项目相关配置
inspur:
  appId: 1205971611543404544
  appSecret: VkyDMDYwMTIwMjYxNzQxNDM2OTItrv
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /center-lims/mis/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 7003
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://localhost:3306/mis-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password:
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: false
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /center-lims/mis/file/temp/uploads
  upload-dir: /center-lims/mis/file/prod/uploads
src/main/resources/application.yml
@@ -1,7 +1,7 @@
# Spring配置
spring:
  profiles:
    active: yxglxt
    active: dev
#10.136.58.65    è´¢åŠ¡ç®¡ç†ç³»ç»Ÿ    cwglxt
#10.136.58.66    è®¾å¤‡ç®¡ç†ç³»ç»Ÿ    sbglxt
#10.136.58.67    ç”Ÿäº§ç®¡æŽ§ç³»ç»Ÿ    scgkxt
src/main/resources/mapper/safety/SafetyInspectionRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.safety.mapper.SafetyInspectionRecordMapper">
    <select id="selectTodayStatistics" resultType="com.ruoyi.safety.dto.SafetyInspectionTodayStatistics">
        SELECT
            COUNT(1) AS totalCount,
            IFNULL(SUM(CASE WHEN status &lt;&gt; 3 THEN 1 ELSE 0 END), 0) AS completedCount,
            IFNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END), 0) AS abnormalCount,
            IFNULL(SUM(CASE WHEN status = 2 OR is_missed = 1 THEN 1 ELSE 0 END), 0) AS missedCount,
            IFNULL(SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END), 0) AS unexecutedCount,
            CASE
                WHEN COUNT(1) = 0 THEN 0
                ELSE ROUND(IFNULL(SUM(CASE WHEN status &lt;&gt; 3 THEN 1 ELSE 0 END), 0) / COUNT(1) * 100, 2)
            END AS completionRate,
            COUNT(DISTINCT inspector_id) AS inspectorCount
        FROM safety_inspection_record
        WHERE del_flag = 0
          AND DATE(inspection_time) = #{statDate}
    </select>
    <select id="selectTrendStatistics" resultType="com.ruoyi.safety.dto.SafetyInspectionTrendStat">
        SELECT
            DATE(inspection_time) AS statDate,
            COUNT(1) AS totalCount,
            IFNULL(SUM(CASE WHEN status &lt;&gt; 3 THEN 1 ELSE 0 END), 0) AS completedCount,
            IFNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END), 0) AS abnormalCount,
            IFNULL(SUM(CASE WHEN status = 2 OR is_missed = 1 THEN 1 ELSE 0 END), 0) AS missedCount,
            IFNULL(SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END), 0) AS unexecutedCount
        FROM safety_inspection_record
        WHERE del_flag = 0
          AND DATE(inspection_time) BETWEEN #{startDate} AND #{endDate}
        GROUP BY DATE(inspection_time)
        ORDER BY statDate ASC
    </select>
    <select id="selectTypeStatistics" resultType="com.ruoyi.safety.dto.SafetyInspectionTypeStat">
        SELECT
            IFNULL(type, 'unknown') AS type,
            COUNT(1) AS count
        FROM safety_inspection_record
        WHERE del_flag = 0
          AND DATE(inspection_time) BETWEEN #{startDate} AND #{endDate}
        GROUP BY IFNULL(type, 'unknown')
        ORDER BY count DESC
    </select>
    <select id="selectInspectorStatistics" resultType="com.ruoyi.safety.dto.SafetyInspectorStat">
        SELECT
            inspector_id AS inspectorId,
            inspector AS inspector,
            COUNT(1) AS totalCount,
            IFNULL(SUM(CASE WHEN status &lt;&gt; 3 THEN 1 ELSE 0 END), 0) AS completedCount,
            IFNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END), 0) AS abnormalCount,
            IFNULL(SUM(CASE WHEN status = 2 OR is_missed = 1 THEN 1 ELSE 0 END), 0) AS missedCount,
            IFNULL(SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END), 0) AS unexecutedCount,
            CASE
                WHEN COUNT(1) = 0 THEN 0
                ELSE ROUND(IFNULL(SUM(CASE WHEN status &lt;&gt; 3 THEN 1 ELSE 0 END), 0) / COUNT(1) * 100, 2)
            END AS completionRate
        FROM safety_inspection_record
        WHERE del_flag = 0
          AND DATE(inspection_time) BETWEEN #{startDate} AND #{endDate}
        GROUP BY inspector_id, inspector
        ORDER BY totalCount DESC
    </select>
</mapper>
src/main/resources/mapper/safety/SafetyLearningRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.safety.mapper.SafetyLearningRecordMapper">
    <select id="selectStatistics" resultType="com.ruoyi.safety.dto.SafetyLearningStatistics">
        SELECT
            COUNT(1) AS totalCount,
            IFNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END), 0) AS completedCount,
            IFNULL(SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END), 0) AS unfinishedCount,
            IFNULL(SUM(duration), 0) AS totalDuration,
            CASE
                WHEN COUNT(1) = 0 THEN 0
                ELSE ROUND(IFNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END), 0) / COUNT(1) * 100, 2)
            END AS completionRate
        FROM safety_learning_record
        WHERE del_flag = 0
    </select>
</mapper>