From 0afef28ce2e627dbebfebfd01ba23546b1496312 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 15 五月 2026 13:25:57 +0800
Subject: [PATCH] feat(inspectiontask): 添加设备巡检异常联动维修单功能

---
 doc/20260515_设备巡检异常联动维修单_前端联调文档.md                                                 |  170 ++++++++++++++++++
 src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java |  236 +++++++++++++++++++++++++-
 src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java                    |   20 ++
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java     |   53 +++++
 src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java                        |    8 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java             |   12 +
 doc/20260515_device_maintenance_inspection_abnormal_acceptance.sql                 |   22 ++
 7 files changed, 506 insertions(+), 15 deletions(-)

diff --git a/doc/20260515_device_maintenance_inspection_abnormal_acceptance.sql b/doc/20260515_device_maintenance_inspection_abnormal_acceptance.sql
new file mode 100644
index 0000000..7f34fe0
--- /dev/null
+++ b/doc/20260515_device_maintenance_inspection_abnormal_acceptance.sql
@@ -0,0 +1,22 @@
+ALTER TABLE `inspection_task`
+    ADD COLUMN `inspection_project` VARCHAR(100) NULL COMMENT '宸℃椤圭洰' AFTER `task_name`;
+
+ALTER TABLE `inspection_task`
+    ADD COLUMN `inspection_result` VARCHAR(1) NULL COMMENT '宸℃缁撴灉 0寮傚父 1姝e父' AFTER `remarks`,
+    ADD COLUMN `abnormal_description` VARCHAR(500) NULL COMMENT '寮傚父鎻忚堪' AFTER `inspection_result`,
+    ADD COLUMN `device_repair_id` BIGINT NULL COMMENT '鍏宠仈缁翠慨鍗旾D' AFTER `abnormal_description`,
+    ADD COLUMN `acceptance_user_id` BIGINT NULL COMMENT '楠屾敹浜篒D' AFTER `device_repair_id`,
+    ADD COLUMN `acceptance_name` VARCHAR(100) NULL COMMENT '楠屾敹浜�' AFTER `acceptance_user_id`;
+
+ALTER TABLE `timing_task`
+    ADD COLUMN `inspection_project` VARCHAR(100) NULL COMMENT '宸℃椤圭洰' AFTER `task_name`,
+    ADD COLUMN `is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '鏄惁鍚敤 0鍚� 1鏄�' AFTER `is_active`;
+
+CREATE INDEX `idx_inspection_task_device_repair_id`
+    ON `inspection_task` (`device_repair_id`);
+
+CREATE INDEX `idx_inspection_task_inspection_result`
+    ON `inspection_task` (`inspection_result`);
+
+CREATE INDEX `idx_timing_task_is_enabled`
+    ON `timing_task` (`is_enabled`);
diff --git "a/doc/20260515_\350\256\276\345\244\207\345\267\241\346\243\200\345\274\202\345\270\270\350\201\224\345\212\250\347\273\264\344\277\256\345\215\225_\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/doc/20260515_\350\256\276\345\244\207\345\267\241\346\243\200\345\274\202\345\270\270\350\201\224\345\212\250\347\273\264\344\277\256\345\215\225_\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..0df5fcc
--- /dev/null
+++ "b/doc/20260515_\350\256\276\345\244\207\345\267\241\346\243\200\345\274\202\345\270\270\350\201\224\345\212\250\347\273\264\344\277\256\345\215\225_\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,170 @@
+# 璁惧宸℃涓庡畾鏃跺贰妫�鍓嶇鑱旇皟鏂囨。锛坕nspectiontask锛�
+
+> 鏇存柊鏃ユ湡锛�2026-05-15  
+> 閫傜敤妯″潡锛氳澶囧贰妫�浠诲姟 `inspectiontask`锛坄/inspectionTask`锛変笌瀹氭椂宸℃浠诲姟锛坄/timingTask`锛�
+
+## 1. 鏈鏀瑰姩
+
+1. 宸℃浠诲姟鏂板瀛楁锛�
+   - `inspectionProject`锛堝贰妫�椤圭洰锛�
+   - `inspectionResult`锛堝贰妫�缁撴灉锛宍0`寮傚父 / `1`姝e父锛屽繀濉級
+   - `abnormalDescription`锛堝紓甯告弿杩帮級
+   - `deviceRepairId`锛堝叧鑱旂淮淇崟ID锛屽紓甯告椂鍚庣鑷姩鍥炲~锛�
+   - `acceptanceUserId`锛堥獙鏀朵汉ID锛�
+   - `acceptanceName`锛堥獙鏀朵汉锛�
+2. 寮傚父鏍¢獙瑙勫垯锛�
+   - `inspectionResult=1`锛堟甯革級锛氱収鐗囬潪蹇呭~銆�
+   - `inspectionResult=0`锛堝紓甯革級锛氬繀椤绘湁鐓х墖锛屼笖蹇呴』濉啓 `abnormalDescription`銆�
+3. 寮傚父鑱斿姩瑙勫垯锛�
+   - 寮傚父淇濆瓨鍚庤嚜鍔ㄧ敓鎴� `device_repair` 骞跺洖濉� `deviceRepairId`銆�
+4. 瀹氭椂浠诲姟鏂板瀛楁锛�
+   - `inspectionProject`锛堝贰妫�椤圭洰锛�
+   - `isEnabled`锛堟槸鍚﹀惎鐢紝`0`鍚� / `1`鏄級
+5. 澶囨敞甯﹀叆瑙勫垯锛�
+   - 瀹氭椂浠诲姟鑷姩鐢熸垚宸℃璁板綍鏃讹紝鑻ュ畾鏃朵换鍔� `remarks` 鏈夊�硷紝浼氭嫾鎺ュ埌宸℃璁板綍澶囨敞涓��
+
+## 2. 鏁版嵁搴撳彉鏇�
+
+鑱旇皟鍓嶆墽琛� SQL锛�
+
+- [doc/20260515_device_maintenance_inspection_abnormal_acceptance.sql](/D:/鐗涢┈/鍗楅��/鍚庣/product-inventory-management-after-jdk25/doc/20260515_device_maintenance_inspection_abnormal_acceptance.sql)
+
+> 璇存槑锛氳鑴氭湰褰撳墠浣滅敤浜� `inspection_task` 涓� `timing_task` 涓ゅ紶琛紝鏂囦欢鍚嶅巻鍙蹭繚鐣欐湭鏀广��
+
+## 3. 宸℃浠诲姟鎺ュ彛
+
+### 3.1 淇濆瓨鎺ュ彛
+
+`POST /inspectionTask/addOrEditInspectionTask`
+
+| 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| id | long | 鍚� | 鏈夊��=淇敼锛屾棤鍊�=鏂板 |
+| taskId | int | 寤鸿蹇呭~ | 璁惧ID锛堢敤浜庡紓甯歌嚜鍔ㄥ缓缁翠慨鍗曪級 |
+| taskName | string | 寤鸿蹇呭~ | 璁惧鍚嶇О |
+| inspectionProject | string | 鍚� | 宸℃椤圭洰 |
+| inspectorId | string | 鍚� | 宸℃浜篒D锛屾敮鎸侀�楀彿鍒嗛殧 |
+| inspectionResult | string | 鏄� | `0`=寮傚父锛宍1`=姝e父 |
+| abnormalDescription | string | 鏉′欢蹇呭~ | 寮傚父鏃跺繀濉� |
+| acceptanceUserId | long | 鍚� | 楠屾敹浜篒D |
+| acceptanceName | string | 鍚� | 楠屾敹浜哄鍚� |
+| commonFileListDTO | array | 鏉′欢蹇呭~ | 闄勪欢缁�1锛堝紓甯告椂涓夌粍鑷冲皯涓�缁勬湁鍥撅級 |
+| commonFileListAfterDTO | array | 鏉′欢蹇呭~ | 闄勪欢缁�2锛堝紓甯告椂涓夌粍鑷冲皯涓�缁勬湁鍥撅級 |
+| commonFileListBeforeDTO | array | 鏉′欢蹇呭~ | 闄勪欢缁�3锛堝紓甯告椂涓夌粍鑷冲皯涓�缁勬湁鍥撅級 |
+
+寮傚父绀轰緥锛�
+
+```json
+{
+  "taskId": 1001,
+  "taskName": "绌哄帇鏈篈-01",
+  "inspectionProject": "娑︽粦绯荤粺",
+  "inspectorId": "12",
+  "inspectionResult": "0",
+  "abnormalDescription": "鐢垫満寮傚搷锛屾俯鍗囧亸楂�",
+  "acceptanceUserId": 20,
+  "commonFileListDTO": [
+    {
+      "id": 90001,
+      "application": "file"
+    }
+  ]
+}
+```
+
+姝e父绀轰緥锛�
+
+```json
+{
+  "taskId": 1001,
+  "taskName": "绌哄帇鏈篈-01",
+  "inspectionProject": "鐐规",
+  "inspectorId": "12",
+  "inspectionResult": "1",
+  "acceptanceUserId": 20
+}
+```
+
+### 3.2 鍒楄〃鎺ュ彛
+
+`GET /inspectionTask/list`
+
+杩斿洖鍖呭惈鏂板瀛楁锛�
+
+- `inspectionProject`
+- `inspectionResult`
+- `abnormalDescription`
+- `deviceRepairId`
+- `acceptanceUserId`
+- `acceptanceName`
+
+## 4. 瀹氭椂浠诲姟鎺ュ彛
+
+### 4.1 淇濆瓨鎺ュ彛
+
+`POST /timingTask/addOrEditTimingTask`
+
+鏂板/鏇存柊瀛楁锛�
+
+| 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| inspectionProject | string | 鍚� | 宸℃椤圭洰 |
+| remarks | string | 鍚� | 澶囨敞 |
+| isEnabled | int | 鍚� | `0`=绂佺敤锛宍1`=鍚敤锛涗笉浼犻粯璁ゅ惎鐢� |
+
+绀轰緥锛�
+
+```json
+{
+  "taskName": "绌哄帇鏈篈-01瀹氭椂宸℃",
+  "inspectionProject": "鏈堝害宸℃",
+  "taskId": 1001,
+  "inspectorIds": "12,13",
+  "frequencyType": "DAILY",
+  "frequencyDetail": "09:00",
+  "remarks": "閲嶇偣妫�鏌ヨ酱鎵挎俯搴�",
+  "isEnabled": 1
+}
+```
+
+### 4.2 鍚敤鐘舵�佽涓�
+
+1. `isEnabled=1`锛氫换鍔¤繘鍏ヨ皟搴︼紝鎸夐娆¤嚜鍔ㄧ敓鎴愬贰妫�璁板綍銆�
+2. `isEnabled=0`锛氫换鍔′笉璋冨害锛涘凡瀛樺湪璋冨害浼氳绉婚櫎銆�
+
+### 4.3 澶囨敞甯﹀叆瑙勫垯
+
+瀹氭椂浠诲姟鑷姩鐢熸垚宸℃璁板綍鏃讹細
+
+1. 宸℃璁板綍澶囨敞鍥哄畾鍓嶇紑锛歚鑷姩鐢熸垚鑷畾鏃朵换鍔D: {id}`
+2. 褰撳畾鏃朵换鍔� `remarks` 闈炵┖鏃讹紝鎷兼帴涓猴細  
+   `鑷姩鐢熸垚鑷畾鏃朵换鍔D: {id}锛泏remarks}`
+
+## 5. 寮傚父鑷姩寤虹淮淇崟瑙勫垯
+
+褰撳贰妫�璁板綍 `inspectionResult=0` 鏃讹細
+
+1. 鑻� `deviceRepairId` 涓虹┖锛屽悗绔嚜鍔ㄥ垱寤� `device_repair`锛�
+   - `deviceLedgerId`锛氭潵鑷� `taskId`
+   - `deviceName`锛氫紭鍏� `taskName`锛屽惁鍒欏彇璁惧鍙拌处鍚嶇О
+   - `remark`锛氬紓甯告弿杩�
+   - `status`锛歚0`锛堝緟缁翠慨锛�
+2. 鑻ュ凡鏈夊叧鑱旂淮淇崟锛屼粎鍚屾鏇存柊缁翠慨鍗� `remark`銆�
+
+## 6. 鍓嶇鏀归�犲缓璁�
+
+1. 宸℃琛ㄥ崟鏂板 `inspectionProject` 杈撳叆妗嗐��
+2. 宸℃琛ㄥ崟淇濈暀鈥滄甯�/寮傚父鈥濊仈鍔ㄦ牎楠岋細
+   - 寮傚父鏃跺己鍒跺紓甯告弿杩� + 鑷冲皯涓�缁勫浘鐗囥��
+3. 瀹氭椂浠诲姟琛ㄥ崟鏂板鈥滄槸鍚﹀惎鐢ㄢ�濆紑鍏冲苟鏄犲皠 `isEnabled`銆�
+4. 瀹氭椂浠诲姟琛ㄥ崟鏂板 `inspectionProject` 涓� `remarks` 杈撳叆椤广��
+5. 宸℃鍒楄〃灞曠ず `inspectionProject` 鍜� `deviceRepairId`锛堟敮鎸佽烦杞淮淇崟璇︽儏锛夈��
+
+## 7. 鑱旇皟楠屾敹娓呭崟
+
+1. 宸℃鏂板/淇敼鍙纭彁浜� `inspectionProject` 骞跺湪鍒楄〃鍥炴樉銆�
+2. 寮傚父宸℃锛堟湁鎻忚堪+鏈夊浘锛変繚瀛樻垚鍔熷苟鍥炲~ `deviceRepairId`銆�
+3. 寮傚父宸℃缂烘弿杩版垨缂哄浘鐗囨椂琚嫤鎴��
+4. 瀹氭椂浠诲姟 `isEnabled=0` 鏃朵笉鍐嶈Е鍙戣嚜鍔ㄥ贰妫�璁板綍銆�
+5. 瀹氭椂浠诲姟 `isEnabled=1` 鏃舵寜棰戞鐢熸垚宸℃璁板綍銆�
+6. 瀹氭椂浠诲姟鏈� `remarks` 鏃讹紝鑷姩宸℃璁板綍澶囨敞甯︿笂璇ュ唴瀹广��
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java b/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
index c41d626..4e7efad 100644
--- a/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
+++ b/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -30,6 +30,10 @@
     @Excel(name = "宸℃浠诲姟鍚嶇О")
     private String taskName;
 
+    @Schema(description = "宸℃椤圭洰")
+    @Excel(name = "宸℃椤圭洰")
+    private String inspectionProject;
+
     @Schema(description = "璁惧id")
     private Integer taskId;
 
@@ -44,6 +48,22 @@
     @Excel(name = "澶囨敞")
     private String remarks;
 
+    @Schema(description = "宸℃缁撴灉 0 寮傚父 1 姝e父")
+    private String inspectionResult;
+
+    @Schema(description = "寮傚父鎻忚堪")
+    private String abnormalDescription;
+
+    @Schema(description = "鍏宠仈缁翠慨鍗旾D")
+    private Long deviceRepairId;
+
+    @Schema(description = "楠屾敹浜篒D")
+    private Long acceptanceUserId;
+
+    @Schema(description = "楠屾敹浜�")
+    @Excel(name = "楠屾敹浜�")
+    private String acceptanceName;
+
     @Schema(description = "浠诲姟鐧昏浜篒D")
     private Long registrantId;
 
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java b/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
index 2d8722e..43a3edc 100644
--- a/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
+++ b/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
@@ -33,6 +33,10 @@
     @Excel(name = "宸℃浠诲姟鍚嶇О")
     private String taskName;
 
+    @Schema(description = "宸℃椤圭洰")
+    @Excel(name = "宸℃椤圭洰")
+    private String inspectionProject;
+
     @Schema(description = "璁惧id")
     private Integer taskId;
 
@@ -60,6 +64,10 @@
     @Schema(description = "鏄惁婵�娲�")
     private boolean isActive;
 
+    @Schema(description = "鏄惁鍚敤 0鍚� 1鏄�")
+    @Excel(name = "鏄惁鍚敤", readConverterExp = "0=鍚�,1=鏄�")
+    private Integer isEnabled;
+
     @Schema(description = "澶囨敞")
     @Excel(name = "澶囨敞")
     private String remarks;
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
index 410336e..5826fa7 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -5,12 +5,17 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.StorageBlobDTO;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.device.mapper.DeviceLedgerMapper;
+import com.ruoyi.device.mapper.DeviceRepairMapper;
+import com.ruoyi.device.pojo.DeviceLedger;
+import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
 import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
 import com.ruoyi.inspectiontask.pojo.InspectionTask;
@@ -23,6 +28,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.format.DateTimeFormatter;
+import java.util.Date;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -43,6 +49,14 @@
 
     private final FileUtil fileUtil;
 
+    private final DeviceRepairMapper deviceRepairMapper;
+
+    private final DeviceLedgerMapper deviceLedgerMapper;
+
+    private static final String INSPECTION_RESULT_ABNORMAL = "0";
+    private static final String INSPECTION_RESULT_NORMAL = "1";
+    private static final int REPAIR_STATUS_PENDING = 0;
+
     @Override
     public IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) {
         LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>();
@@ -50,14 +64,15 @@
         if (StringUtils.isNotBlank(inspectionTaskDto.getTaskName())) {
             queryWrapper.like(InspectionTask::getTaskName, inspectionTaskDto.getTaskName());
         }
+        if (StringUtils.isNotBlank(inspectionTaskDto.getInspectionProject())) {
+            queryWrapper.like(InspectionTask::getInspectionProject, inspectionTaskDto.getInspectionProject());
+        }
         IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper);
 
         //  鏃犳暟鎹彁鍓嶈繑鍥�
         if (CollectionUtils.isEmpty(entityPage.getRecords())) {
             return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal());
         }
-        // 鑾峰彇id闆嗗悎
-        List<Long> ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList());
         //鐧昏浜篿ds
         List<Long> registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList());
         // 鎵归噺鏌ヨ鐧昏浜�
@@ -68,9 +83,6 @@
         } else {
             sysUserMap = new HashMap<>();
         }
-        //宸℃浜篿ds
-        List<String> inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList());
-
         //鑾峰彇鎵�鏈変笉閲嶅鐨勭敤鎴稩D
         Set<Long> allUserIds = entityPage.getRecords().stream()
                 .map(InspectionTask::getInspectorId) // 鑾峰彇"2,3"杩欐牱鐨勫瓧绗︿覆
@@ -140,24 +152,230 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) {
+        InspectionTask oldInspectionTask = null;
+        if (Objects.nonNull(inspectionTaskDto.getId())) {
+            oldInspectionTask = inspectionTaskMapper.selectById(inspectionTaskDto.getId());
+            if (oldInspectionTask == null) {
+                throw new IllegalArgumentException("宸℃浠诲姟涓嶅瓨鍦�");
+            }
+        }
+        validateInspectionInput(inspectionTaskDto, oldInspectionTask);
+
         InspectionTask inspectionTask = new InspectionTask();
         BeanUtils.copyProperties(inspectionTaskDto, inspectionTask);
         inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId());
         inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername());
+        fillAcceptanceInfo(inspectionTask, oldInspectionTask);
         int i;
         if (Objects.isNull(inspectionTaskDto.getId())) {
             i = inspectionTaskMapper.insert(inspectionTask);
         } else {
             i = inspectionTaskMapper.updateById(inspectionTask);
         }
-        // 淇濆瓨鏂囦欢
-        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListDTO());
-        fileUtil.saveStorageAttachment(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListAfterDTO());
-        fileUtil.saveStorageAttachment(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListBeforeDTO());
+        if (i <= 0) {
+            return i;
+        }
+        Long linkedRepairId = syncRepairOrderIfAbnormal(inspectionTask, oldInspectionTask);
+        if (linkedRepairId != null && !Objects.equals(linkedRepairId, inspectionTask.getDeviceRepairId())) {
+            InspectionTask relationUpdate = new InspectionTask();
+            relationUpdate.setId(inspectionTask.getId());
+            relationUpdate.setDeviceRepairId(linkedRepairId);
+            inspectionTaskMapper.updateById(relationUpdate);
+            inspectionTask.setDeviceRepairId(linkedRepairId);
+        }
+        // 淇濆瓨鏂囦欢锛堝瓧娈典笉浼犲垯淇濈暀鍘嗗彶锛�
+        saveInspectionAttachments(inspectionTask.getId(), inspectionTaskDto);
 
         return i;
     }
 
+    private void validateInspectionInput(InspectionTaskDto inspectionTaskDto, InspectionTask oldInspectionTask) {
+        String inspectionResult = inspectionTaskDto.getInspectionResult();
+        if (StringUtils.isBlank(inspectionResult) && oldInspectionTask != null) {
+            inspectionResult = oldInspectionTask.getInspectionResult();
+        }
+        if (StringUtils.isBlank(inspectionResult)) {
+            throw new IllegalArgumentException("璇烽�夋嫨宸℃缁撴灉");
+        }
+        if (!INSPECTION_RESULT_ABNORMAL.equals(inspectionResult) && !INSPECTION_RESULT_NORMAL.equals(inspectionResult)) {
+            throw new IllegalArgumentException("宸℃缁撴灉浠呮敮鎸侊細0-寮傚父锛�1-姝e父");
+        }
+        inspectionTaskDto.setInspectionResult(inspectionResult);
+
+        if (!INSPECTION_RESULT_ABNORMAL.equals(inspectionResult)) {
+            return;
+        }
+
+        String abnormalDescription = inspectionTaskDto.getAbnormalDescription();
+        if (StringUtils.isBlank(abnormalDescription) && oldInspectionTask != null) {
+            abnormalDescription = oldInspectionTask.getAbnormalDescription();
+        }
+        if (StringUtils.isBlank(abnormalDescription)) {
+            throw new IllegalArgumentException("宸℃缁撴灉涓哄紓甯告椂锛屽紓甯告弿杩颁笉鑳戒负绌�");
+        }
+        inspectionTaskDto.setAbnormalDescription(abnormalDescription);
+
+        if (!hasAnyInspectionPhotoAfterSave(inspectionTaskDto, oldInspectionTask)) {
+            throw new IllegalArgumentException("宸℃缁撴灉涓哄紓甯告椂锛屽繀椤讳笂浼犺嚦灏戜竴寮犵収鐗�");
+        }
+    }
+
+    private boolean hasAnyInspectionPhotoAfterSave(InspectionTaskDto inspectionTaskDto, InspectionTask oldInspectionTask) {
+        Long recordId = oldInspectionTask == null ? null : oldInspectionTask.getId();
+        return hasApplicationPhotoAfterSave(inspectionTaskDto.getCommonFileListDTO(), ApplicationTypeEnum.FILE, recordId)
+                || hasApplicationPhotoAfterSave(inspectionTaskDto.getCommonFileListAfterDTO(), ApplicationTypeEnum.AFTER_FILE, recordId)
+                || hasApplicationPhotoAfterSave(inspectionTaskDto.getCommonFileListBeforeDTO(), ApplicationTypeEnum.BEFORE_FILE, recordId);
+    }
+
+    private boolean hasApplicationPhotoAfterSave(List<StorageBlobDTO> requestPhotos, ApplicationTypeEnum applicationType, Long recordId) {
+        if (requestPhotos != null) {
+            return !requestPhotos.isEmpty();
+        }
+        if (recordId == null) {
+            return false;
+        }
+        return CollectionUtils.isNotEmpty(fileUtil.getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(applicationType, RecordTypeEnum.INSPECTION_TASK, recordId));
+    }
+
+    private void fillAcceptanceInfo(InspectionTask inspectionTask, InspectionTask oldInspectionTask) {
+        Long acceptanceUserId = inspectionTask.getAcceptanceUserId();
+        if (acceptanceUserId == null && oldInspectionTask != null) {
+            acceptanceUserId = oldInspectionTask.getAcceptanceUserId();
+        }
+        if (acceptanceUserId != null) {
+            inspectionTask.setAcceptanceUserId(acceptanceUserId);
+        }
+
+        String acceptanceName = inspectionTask.getAcceptanceName();
+        if (StringUtils.isBlank(acceptanceName) && acceptanceUserId != null) {
+            SysUser acceptanceUser = sysUserMapper.selectUserById(acceptanceUserId);
+            if (acceptanceUser != null) {
+                acceptanceName = acceptanceUser.getNickName();
+            }
+        }
+        if (StringUtils.isBlank(acceptanceName) && oldInspectionTask != null) {
+            acceptanceName = oldInspectionTask.getAcceptanceName();
+        }
+        inspectionTask.setAcceptanceName(acceptanceName);
+    }
+
+    private Long syncRepairOrderIfAbnormal(InspectionTask inspectionTask, InspectionTask oldInspectionTask) {
+        if (!INSPECTION_RESULT_ABNORMAL.equals(inspectionTask.getInspectionResult())) {
+            return inspectionTask.getDeviceRepairId();
+        }
+        Long linkedRepairId = inspectionTask.getDeviceRepairId();
+        if (linkedRepairId == null && oldInspectionTask != null) {
+            linkedRepairId = oldInspectionTask.getDeviceRepairId();
+        }
+
+        if (linkedRepairId != null) {
+            DeviceRepair updateRepair = new DeviceRepair();
+            updateRepair.setId(linkedRepairId);
+            updateRepair.setRemark(inspectionTask.getAbnormalDescription());
+            deviceRepairMapper.updateById(updateRepair);
+            return linkedRepairId;
+        }
+
+        DeviceRepair deviceRepair = buildDeviceRepair(inspectionTask, oldInspectionTask);
+        deviceRepairMapper.insert(deviceRepair);
+        return deviceRepair.getId();
+    }
+
+    private DeviceRepair buildDeviceRepair(InspectionTask inspectionTask, InspectionTask oldInspectionTask) {
+        DeviceRepair deviceRepair = new DeviceRepair();
+        Long deviceLedgerId = resolveDeviceLedgerId(inspectionTask, oldInspectionTask);
+        DeviceLedger deviceLedger = resolveDeviceLedger(deviceLedgerId);
+        deviceRepair.setDeviceLedgerId(deviceLedgerId);
+        deviceRepair.setDeviceName(resolveDeviceName(inspectionTask, oldInspectionTask, deviceLedger));
+        deviceRepair.setDeviceModel(deviceLedger == null ? null : deviceLedger.getDeviceModel());
+        deviceRepair.setRepairName(resolveRepairReporter(inspectionTask, oldInspectionTask));
+        deviceRepair.setRepairTime(new Date());
+        deviceRepair.setRemark(inspectionTask.getAbnormalDescription());
+        deviceRepair.setMachineryCategory(deviceLedger == null ? null : deviceLedger.getType());
+        deviceRepair.setStatus(REPAIR_STATUS_PENDING);
+        return deviceRepair;
+    }
+
+    private Long resolveDeviceLedgerId(InspectionTask inspectionTask, InspectionTask oldInspectionTask) {
+        Integer taskId = inspectionTask.getTaskId();
+        if (taskId == null && oldInspectionTask != null) {
+            taskId = oldInspectionTask.getTaskId();
+        }
+        if (taskId == null || taskId <= 0) {
+            return null;
+        }
+        return taskId.longValue();
+    }
+
+    private DeviceLedger resolveDeviceLedger(Long deviceLedgerId) {
+        if (deviceLedgerId == null) {
+            return null;
+        }
+        return deviceLedgerMapper.selectById(deviceLedgerId);
+    }
+
+    private String resolveDeviceName(InspectionTask inspectionTask, InspectionTask oldInspectionTask, DeviceLedger deviceLedger) {
+        String taskName = inspectionTask.getTaskName();
+        if (StringUtils.isBlank(taskName) && oldInspectionTask != null) {
+            taskName = oldInspectionTask.getTaskName();
+        }
+        if (StringUtils.isNotBlank(taskName)) {
+            return taskName;
+        }
+        return deviceLedger == null ? null : deviceLedger.getDeviceName();
+    }
+
+    private String resolveRepairReporter(InspectionTask inspectionTask, InspectionTask oldInspectionTask) {
+        String reporter = inspectionTask.getInspector();
+        if (StringUtils.isBlank(reporter) && oldInspectionTask != null) {
+            reporter = oldInspectionTask.getInspector();
+        }
+        if (StringUtils.isNotBlank(reporter)) {
+            return reporter;
+        }
+        String inspectorNameByUserId = resolveInspectorNameByUserId(inspectionTask.getInspectorId());
+        if (StringUtils.isBlank(inspectorNameByUserId) && oldInspectionTask != null) {
+            inspectorNameByUserId = resolveInspectorNameByUserId(oldInspectionTask.getInspectorId());
+        }
+        if (StringUtils.isNotBlank(inspectorNameByUserId)) {
+            return inspectorNameByUserId;
+        }
+        try {
+            return SecurityUtils.getUsername();
+        } catch (Exception ignored) {
+            return "system";
+        }
+    }
+
+    private String resolveInspectorNameByUserId(String inspectorIds) {
+        if (StringUtils.isBlank(inspectorIds)) {
+            return null;
+        }
+        String firstInspectorId = Arrays.stream(inspectorIds.split(","))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .findFirst()
+                .orElse(null);
+        if (!StringUtils.isNumeric(firstInspectorId)) {
+            return null;
+        }
+        SysUser sysUser = sysUserMapper.selectUserById(Long.parseLong(firstInspectorId));
+        return sysUser == null ? null : sysUser.getNickName();
+    }
+
+    private void saveInspectionAttachments(Long inspectionTaskId, InspectionTaskDto inspectionTaskDto) {
+        saveAttachmentIfPresent(inspectionTaskId, ApplicationTypeEnum.FILE, inspectionTaskDto.getCommonFileListDTO());
+        saveAttachmentIfPresent(inspectionTaskId, ApplicationTypeEnum.AFTER_FILE, inspectionTaskDto.getCommonFileListAfterDTO());
+        saveAttachmentIfPresent(inspectionTaskId, ApplicationTypeEnum.BEFORE_FILE, inspectionTaskDto.getCommonFileListBeforeDTO());
+    }
+
+    private void saveAttachmentIfPresent(Long inspectionTaskId, ApplicationTypeEnum applicationTypeEnum, List<StorageBlobDTO> storageBlobDTOS) {
+        if (storageBlobDTOS == null) {
+            return;
+        }
+        fileUtil.saveStorageAttachment(applicationTypeEnum, RecordTypeEnum.INSPECTION_TASK, inspectionTaskId, storageBlobDTOS);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int delByIds(Long[] ids) {
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
index d9c5f69..adc2416 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -3,7 +3,7 @@
 import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
 import com.ruoyi.inspectiontask.pojo.InspectionTask;
 import com.ruoyi.inspectiontask.pojo.TimingTask;
-import lombok.RequiredArgsConstructor;
+import com.ruoyi.common.utils.StringUtils;
 import org.quartz.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -47,6 +47,9 @@
             TimingTask timingTask = tasks.isEmpty() ? null : tasks.get(0);
             if (timingTask == null) {
                 throw new JobExecutionException("鎵句笉鍒板畾鏃朵换鍔�: " + taskId);
+            }
+            if (timingTask.getIsEnabled() != null && timingTask.getIsEnabled() == 0) {
+                return;
             }
 
 //            if (!timingTask.isActive()) {
@@ -100,10 +103,15 @@
 
         // 澶嶅埗鍩烘湰灞炴��
         inspectionTask.setTaskName(timingTask.getTaskName());
+        inspectionTask.setInspectionProject(timingTask.getInspectionProject());
         inspectionTask.setTaskId(timingTask.getTaskId());
         inspectionTask.setInspectorId(timingTask.getInspectorIds());
         inspectionTask.setInspectionLocation(timingTask.getInspectionLocation());
-        inspectionTask.setRemarks("鑷姩鐢熸垚鑷畾鏃朵换鍔D: " + timingTask.getId());
+        String remarks = "鑷姩鐢熸垚鑷畾鏃朵换鍔D: " + timingTask.getId();
+        if (StringUtils.isNotBlank(timingTask.getRemarks())) {
+            remarks = remarks + "锛�" + timingTask.getRemarks();
+        }
+        inspectionTask.setRemarks(remarks);
         inspectionTask.setRegistrantId(timingTask.getRegistrantId());
         inspectionTask.setFrequencyType(timingTask.getFrequencyType());
         inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail());
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
index 8772f48..779dc5f 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -35,6 +35,8 @@
     private final TimingTaskMapper timingTaskMapper;
     private final TimingTaskScheduler timingTaskScheduler;
     private final SysUserMapper sysUserMapper;
+    private static final int ENABLED = 1;
+    private static final int DISABLED = 0;
 
 
     @Override
@@ -44,6 +46,12 @@
         LambdaQueryWrapper<TimingTask> queryWrapper = new LambdaQueryWrapper<>();
         if (StringUtils.isNotBlank(timingTask.getTaskName())) {
             queryWrapper.like(TimingTask::getTaskName, timingTask.getTaskName());
+        }
+        if (StringUtils.isNotBlank(timingTask.getInspectionProject())) {
+            queryWrapper.like(TimingTask::getInspectionProject, timingTask.getInspectionProject());
+        }
+        if (timingTask.getIsEnabled() != null) {
+            queryWrapper.eq(TimingTask::getIsEnabled, timingTask.getIsEnabled());
         }
         IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
 
@@ -115,8 +123,17 @@
     @Override
     @Transactional
     public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
+        TimingTask oldTimingTask = null;
+        if (Objects.nonNull(timingTaskDto.getId())) {
+            oldTimingTask = timingTaskMapper.selectById(timingTaskDto.getId());
+            if (oldTimingTask == null) {
+                throw new IllegalArgumentException("瀹氭椂浠诲姟涓嶅瓨鍦�");
+            }
+        }
         TimingTask timingTask = new TimingTask();
         BeanUtils.copyProperties(timingTaskDto, timingTask);
+        timingTask.setIsEnabled(resolveEnabledValue(timingTask.getIsEnabled(), oldTimingTask));
+        timingTask.setActive(ENABLED == timingTask.getIsEnabled());
         // 1. 瑙f瀽瀛楃涓蹭负 LocalDate锛堝彧鍖呭惈骞存湀鏃ワ級
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate localDate = LocalDate.now();
@@ -132,13 +149,12 @@
         // 璁剧疆鍒涘缓浜轰俊鎭拰榛樿鍊�
         if (Objects.isNull(timingTaskDto.getId())) {
             timingTask.setRegistrationDate(LocalDate.now());
-            timingTask.setActive(true);
 
             // 璁$畻棣栨鎵ц鏃堕棿
             LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask);
             timingTask.setNextExecutionTime(firstExecutionTime);
             int result = timingTaskMapper.insert(timingTask);
-            if (result > 0) {
+            if (result > 0 && isEnabled(timingTask.getIsEnabled(), timingTask.isActive())) {
                 // 鏂板鎴愬姛鍚庢坊鍔犲埌璋冨害鍣�
                 timingTaskScheduler.scheduleTimingTask(timingTask);
             }
@@ -148,8 +164,17 @@
 
             int result = timingTaskMapper.updateById(timingTask);
             if (result > 0) {
-                // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
-                timingTaskScheduler.rescheduleTimingTask(timingTask);
+                boolean oldEnabled = isEnabled(oldTimingTask == null ? null : oldTimingTask.getIsEnabled(), oldTimingTask != null && oldTimingTask.isActive());
+                boolean newEnabled = isEnabled(timingTask.getIsEnabled(), timingTask.isActive());
+                if (!newEnabled) {
+                    timingTaskScheduler.unscheduleTimingTask(timingTask.getId());
+                } else if (oldEnabled) {
+                    // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
+                    timingTaskScheduler.rescheduleTimingTask(timingTask);
+                } else {
+                    // 浠庣鐢ㄦ敼涓哄惎鐢ㄦ椂閲嶆柊鍒涘缓璋冨害浠诲姟
+                    timingTaskScheduler.scheduleTimingTask(timingTask);
+                }
             }
             return result;
         }
@@ -451,6 +476,26 @@
         return days;
     }
 
+    private Integer resolveEnabledValue(Integer requestEnabled, TimingTask oldTimingTask) {
+        if (requestEnabled != null) {
+            return requestEnabled;
+        }
+        if (oldTimingTask != null) {
+            if (oldTimingTask.getIsEnabled() != null) {
+                return oldTimingTask.getIsEnabled();
+            }
+            return oldTimingTask.isActive() ? ENABLED : DISABLED;
+        }
+        return ENABLED;
+    }
+
+    private boolean isEnabled(Integer enabledValue, boolean activeFallback) {
+        if (enabledValue != null) {
+            return ENABLED == enabledValue;
+        }
+        return activeFallback;
+    }
+
 
 
     @Override

--
Gitblit v1.9.3