3 天以前 d67b1903f6cf36c36f27e0a3b1ffc602c5c2881a
feat(device): 添加设备项目字段支持定时任务设备项目字段

- 在 MaintenanceTask 和 DeviceMaintenance 中新增 machineryCategory 字段
- 在 MaintenanceTaskJob 中实现设备项目字段的数据同步逻辑
- 添加数据库表结构变更脚本以支持 machinery_category 字段
- 更新定时任务执行逻辑将设备项目从任务同步到保养记录
- 为 InspectionTaskJob 添加注解配置和文档说明文件
- 实现前后端接口联调支持设备项目字段的传递和展示
已添加1个文件
已修改2个文件
133 ■■■■■ 文件已修改
doc/20260511_设备保养定时任务设备项目字段前端联调说明.md 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260511_É豸±£Ñø¶¨Ê±ÈÎÎñÉ豸ÏîÄ¿×Ö¶Îǰ¶ËÁªµ÷˵Ã÷.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
# è®¾å¤‡ä¿å…»å®šæ—¶ä»»åŠ¡è®¾å¤‡é¡¹ç›®å­—æ®µå‰ç«¯è”è°ƒè¯´æ˜Ž
> æ›´æ–°æ—¶é—´ï¼š2026-05-11
> é€‚用范围:设备保养定时任务(`maintenance_task`)与设备保养记录(`device_maintenance`)
## 1. å˜æ›´æ¦‚è¿°
本次后端变更:
1. `MaintenanceTask` æ–°å¢žå­—段 `machineryCategory`(设备项目)。
2. å®šæ—¶ä»»åŠ¡æ‰§è¡Œç”Ÿæˆè®¾å¤‡ä¿å…»è®°å½•æ—¶ï¼Œä¼šæŠŠ `MaintenanceTask.machineryCategory` åŒæ­¥å†™å…¥ `DeviceMaintenance.machineryCategory`。
对应代码位置:
- `src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java`
- `src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java`
## 2. æ•°æ®åº“变更
需要先执行数据库变更(否则新增/查询该字段会异常):
```sql
ALTER TABLE `maintenance_task`
  ADD COLUMN `machinery_category` VARCHAR(100) NULL COMMENT '设备项目' AFTER `device_model`;
```
## 3. å­—段约定
| å­—段 | å«ä¹‰ | ç±»åž‹ | å»ºè®® |
| --- | --- | --- | --- |
| machineryCategory | è®¾å¤‡é¡¹ç›® | string | å‰ç«¯æ–°å¢ž/编辑定时任务时传值 |
说明:
- åŽç«¯å½“前未对该字段做强制非空校验,但业务上建议前端作为必填处理。
- åŽ†å² `maintenance_task` æ—§æ•°æ®è‹¥è¯¥å­—段为空,则基于旧任务生成的保养记录也会为空。
## 4. æŽ¥å£è”è°ƒ
### 4.1 æ–°å¢žå®šæ—¶ä»»åŠ¡
```http
POST /deviceMaintenanceTask/add
Content-Type: application/json
```
请求示例:
```json
{
  "taskName": "空压机A-周保养",
  "taskId": 1001,
  "deviceModel": "GA75",
  "machineryCategory": "动力设备",
  "frequencyType": "WEEKLY",
  "frequencyDetail": "MON,09:00",
  "registrantId": 1,
  "registrationDate": "2026-05-11",
  "remarks": "联调样例"
}
```
### 4.2 ä¿®æ”¹å®šæ—¶ä»»åŠ¡
```http
POST /deviceMaintenanceTask/update
Content-Type: application/json
```
请求示例(含 `id`):
```json
{
  "id": 12,
  "machineryCategory": "动力设备"
}
```
### 4.3 å®šæ—¶ä»»åŠ¡åˆ—è¡¨
```http
GET /deviceMaintenanceTask/listPage?pageNum=1&pageSize=10
```
返回记录中会包含 `machineryCategory` å­—段。
### 4.4 è®¾å¤‡ä¿å…»è®°å½•列表/详情
```http
GET /device/maintenance/page?pageNum=1&pageSize=10
GET /device/maintenance/{id}
```
返回中 `machineryCategory` æ¥æºäºŽ `device_maintenance.machinery_category`。
对于“由定时任务自动生成”的记录,该值会继承生成时对应任务的 `machineryCategory`。
## 5. å‰ç«¯æ”¹é€ ç‚¹
1. å®šæ—¶ä»»åŠ¡æ–°å¢ž/编辑表单增加“设备项目(machineryCategory)”输入项。
2. æäº¤ `/deviceMaintenanceTask/add`、`/deviceMaintenanceTask/update` æ—¶æºå¸¦ `machineryCategory`。
3. å®šæ—¶ä»»åŠ¡åˆ—è¡¨å¢žåŠ â€œè®¾å¤‡é¡¹ç›®â€åˆ—ï¼ˆå¦‚é¡µé¢æœ‰è¯¥åˆ—è¡¨ï¼‰ã€‚
4. è®¾å¤‡ä¿å…»è®°å½•列表/详情增加“设备项目”展示,空值显示 `--`。
## 6. è”调验收清单
1. æ–°å¢žä¸€ä¸ªå¸¦ `machineryCategory` çš„定时任务,保存成功。
2. æŸ¥è¯¢ `/deviceMaintenanceTask/listPage`,确认该任务返回 `machineryCategory`。
3. ç­‰å¾…一次定时触发(或将频率调到临近时间),生成保养记录。
4. æŸ¥è¯¢ `/device/maintenance/page` æˆ–详情接口,确认新记录的 `machineryCategory` ä¸Žä»»åŠ¡ä¸€è‡´ã€‚
5. ä¿®æ”¹ä»»åŠ¡ `machineryCategory` åŽå†æ¬¡è§¦å‘,确认“新生成记录”使用新值(历史记录不回写)。
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -4,6 +4,7 @@
import com.ruoyi.device.pojo.MaintenanceTask;
import lombok.RequiredArgsConstructor;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@@ -18,14 +19,15 @@
import java.util.Set;
@Component
@DisallowConcurrentExecution // ç¦æ­¢å¹¶å‘执行同一个Job
@RequiredArgsConstructor
@DisallowConcurrentExecution
public class MaintenanceTaskJob implements Job, Serializable {
    private static final long serialVersionUID = 1L; // å¿…须定义序列化ID
    private static final long serialVersionUID = 1L;
    private final DeviceMaintenanceServiceImpl deviceMaintenanceService;
    @Autowired
    private DeviceMaintenanceServiceImpl deviceMaintenanceService;
    private final JdbcTemplate jdbcTemplate;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -5,6 +5,7 @@
import com.ruoyi.inspectiontask.pojo.TimingTask;
import lombok.RequiredArgsConstructor;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@@ -20,12 +21,13 @@
@Component
@DisallowConcurrentExecution // ç¦æ­¢å¹¶å‘执行同一个Job
@RequiredArgsConstructor
public class TimingTaskJob implements Job, Serializable {
    private static final long serialVersionUID = 1L; // å¿…须定义序列化ID
    private final InspectionTaskMapper inspectionTaskMapper;
    private final JdbcTemplate jdbcTemplate;
    @Autowired
    private InspectionTaskMapper inspectionTaskMapper;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
@@ -46,7 +48,7 @@
            if (timingTask == null) {
                throw new JobExecutionException("找不到定时任务: " + taskId);
            }
//            if (!timingTask.isActive()) {
//                throw new JobExecutionException("定时任务已禁用: " + taskId);
//            }