xw 2 недель назад
Родитель
Сommit
25a671d770

+ 77 - 0
fs-qw-task/src/main/java/com/fs/app/controller/SopTestController.java

@@ -0,0 +1,77 @@
+package com.fs.app.controller;
+
+import com.fs.app.taskService.SopLogsTaskService;
+import com.fs.common.core.domain.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * SOP测试接口
+ * 用于测试指定SOP的待执行记录生成
+ */
+@Api(tags = "SOP测试接口")
+@RestController
+@RequestMapping("/app/sop/test")
+@Slf4j
+public class SopTestController {
+
+    @Autowired
+    private SopLogsTaskService sopLogsTaskService;
+
+    /**
+     * 测试单个或多个SOP
+     * 
+     * @param sopIds SOP ID,多个用逗号分隔,例如:9e8afad5bde019b34006a33105dd2509
+     * @param testTime 测试时间,格式:yyyy-MM-dd HH:mm:ss,不传则使用当前时间(精确到小时)
+     * @return 执行结果
+     */
+    @ApiOperation("测试指定SOP")
+    @GetMapping("/executeSop")
+    public R executeSop(
+            @ApiParam(value = "SOP ID,多个用逗号分隔", required = true, example = "9e8afad5bde019b34006a33105dd2509")
+            @RequestParam String sopIds,
+            @ApiParam(value = "测试时间,格式:yyyy-MM-dd HH:mm:ss,不传则使用当前时间", example = "2025-12-27 10:00:00")
+            @RequestParam(required = false) String testTime) {
+        
+        try {
+            // 解析SOP ID列表
+            List<String> sopIdList = Arrays.asList(sopIds.split(","));
+            
+            // 解析测试时间
+            LocalDateTime executeTime;
+            if (testTime != null && !testTime.trim().isEmpty()) {
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                executeTime = LocalDateTime.parse(testTime, formatter);
+            } else {
+                // 默认使用当前时间,精确到小时
+                executeTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
+            }
+            
+            log.info("========== 开始测试SOP ==========");
+            log.info("SOP ID列表: {}", sopIdList);
+            log.info("测试时间: {}", executeTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            
+            // 执行SOP任务
+            sopLogsTaskService.selectSopUserLogsListByTime(executeTime, sopIdList);
+            
+            log.info("========== SOP测试执行完成 ==========");
+            
+            return R.ok().put("message", "SOP测试执行成功!")
+                        .put("sopIds", sopIds)
+                        .put("executeTime", executeTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            
+        } catch (Exception e) {
+            log.error("SOP测试执行失败", e);
+            return R.error("SOP测试执行失败: " + e.getMessage());
+        }
+    }
+}

+ 34 - 6
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -594,16 +594,44 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                     return;
                 }
             }
-            List<SopParam> paramList = ruleTimeVO.getSkipSopJson() == null ? new ArrayList<>() : JSON.parseArray(ruleTimeVO.getSkipSopJson(), SopParam.class);
-            List<SopParam> dayList = paramList.stream().filter(e -> e.getDayNum() != null && e.getStartDate() == null && e.getEndDate() == null).collect(Collectors.toList());
-            List<SopParam> timeList = paramList.stream().filter(e -> e.getDayNum() != null && e.getStartDate() != null && e.getEndDate() != null).collect(Collectors.toList());
+            List<SopParam> paramList = new ArrayList<>();
+            try {
+                String skipSopJson = ruleTimeVO.getSkipSopJson();
+                if (skipSopJson != null && !skipSopJson.trim().isEmpty() && !"null".equalsIgnoreCase(skipSopJson.trim())) {
+                    paramList = JSON.parseArray(skipSopJson, SopParam.class);
+                    if (paramList == null) {
+                        paramList = new ArrayList<>();
+                    }
+                }
+            } catch (Exception e) {
+                log.error("解析skipSopJson失败,原始值: '{}'", ruleTimeVO.getSkipSopJson(), e);
+                paramList = new ArrayList<>();
+            }
+            
+            List<SopParam> dayList = paramList.stream()
+                    .filter(e -> e.getDayNum() != null && !e.getDayNum().trim().isEmpty() 
+                            && e.getStartDate() == null && e.getEndDate() == null)
+                    .collect(Collectors.toList());
+            List<SopParam> timeList = paramList.stream()
+                    .filter(e -> e.getDayNum() != null && !e.getDayNum().trim().isEmpty() 
+                            && e.getStartDate() != null && e.getEndDate() != null)
+                    .collect(Collectors.toList());
             Map<String, List<SopParam>> timeMap = PubFun.listToMapByGroupList(timeList, e -> e.getDayNum());
+            
             if (CollectionUtils.isNotEmpty(dayList)) {
                 for (SopParam sopParam : dayList) {
                     String dayNum = sopParam.getDayNum();
-                    if (day == Long.valueOf(dayNum)) {
-                        log.info("跳过当前sop任务,任务id:{},qwtask天数{},跳过第:{}天", ruleTimeVO.getId(), day, dayNum);
-                        return;
+                    if (StringUtils.isEmpty(dayNum) || dayNum.trim().isEmpty()) {
+                        continue;
+                    }
+                    try {
+                        if (day == Long.valueOf(dayNum.trim())) {
+                            log.info("跳过当前sop任务,任务id:{},qwtask天数{},跳过第:{}天", ruleTimeVO.getId(), day, dayNum);
+                            return;
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("解析dayNum失败,dayNum: '{}'", dayNum, e);
+                        continue;
                     }
                 }
             }

+ 1 - 1
fs-qw-task/src/main/resources/application.yml

@@ -10,4 +10,4 @@ spring:
 #    active: druid-hcl
 #    active: druid-sxjz
 #    active: druid-hdt
-    active: druid-myhk-test
+    active: druid-bjczwh-test