Quellcode durchsuchen

任务执行日志改为分页查询

zyy vor 1 Woche
Ursprung
Commit
ee89fe6d08

+ 16 - 3
fs-company/src/main/java/com/fs/company/controller/company/CompanyVoiceRoboticController.java

@@ -272,13 +272,26 @@ public class CompanyVoiceRoboticController extends BaseController
      * 查询任务执行记录
      * 获取每个人的工作流执行状态和节点日志
      */
+//    @GetMapping("/execRecords")
+//    public R getExecRecords(Long roboticId) {
+//        if (roboticId == null) {
+//            return R.error("任务ID不能为空");
+//        }
+//        List<WorkflowExecRecordVo> records = companyVoiceRoboticService.getExecRecords(roboticId);
+//        return R.ok().put("data", records);
+//    }
+
     @GetMapping("/execRecords")
-    public R getExecRecords(Long roboticId) {
+    public R getExecRecords(@RequestParam Long roboticId,
+                            @RequestParam(defaultValue = "1") Integer pageNum,
+                            @RequestParam(defaultValue = "10") Integer pageSize,
+                            @RequestParam(required = false) String customerName,
+                            @RequestParam(required = false) String customerPhone) {
         if (roboticId == null) {
             return R.error("任务ID不能为空");
         }
-        List<WorkflowExecRecordVo> records = companyVoiceRoboticService.getExecRecords(roboticId);
-        return R.ok().put("data", records);
+        return R.ok(companyVoiceRoboticService.getExecRecords(roboticId, pageNum, pageSize, customerName,
+                 customerPhone));
     }
 
     @GetMapping("/getCurrentCompanyId")

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyAiWorkflowExecLogMapper.java

@@ -68,4 +68,6 @@ public interface CompanyAiWorkflowExecLogMapper extends BaseMapper<CompanyAiWork
     List<CompanyAiWorkflowExecLog> selectByWorkflowInstanceId(@Param("workflowInstanceId") String workflowInstanceId);
 
     void batchInsert(@Param("list") List<CompanyAiWorkflowExecLog> logList);
+
+    List<CompanyAiWorkflowExecLog> selectByInstanceIds(List<String> instanceIds);
 }

+ 6 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyAiWorkflowExecMapper.java

@@ -104,4 +104,10 @@ public interface CompanyAiWorkflowExecMapper extends BaseMapper<CompanyAiWorkflo
      * @return int
      * **/
     int insertBatchInfo(@Param("list") List<CompanyAiWorkflowExec> list);
+//    List<WorkflowExecRecordVo> selectExecRecordsByRoboticId(@Param("roboticId") Long roboticId);
+    List<WorkflowExecRecordVo> selectExecRecordsByRoboticId(
+            @Param("roboticId") Long roboticId,
+            @Param("customerName") String customerName,
+            @Param("customerPhone") String customerPhone
+    );
 }

+ 2 - 1
fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticService.java

@@ -8,6 +8,7 @@ import com.fs.company.param.ExecutionContext;
 import com.fs.company.vo.*;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -91,7 +92,7 @@ public interface ICompanyVoiceRoboticService extends IService<CompanyVoiceRoboti
      * @param roboticId 任务ID
      * @return 执行记录列表
      */
-    List<WorkflowExecRecordVo> getExecRecords(Long roboticId);
+    Map<String, Object> getExecRecords(Long roboticId, Integer pageNum, Integer pageSize,String customerName,String customerPhone);
 
     void finishAddWxByCallees(Set<Long> roboticIds);
 }

+ 76 - 14
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java

@@ -40,6 +40,8 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.mapper.SysDictDataMapper;
 import com.fs.system.service.ISysConfigService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import lombok.RequiredArgsConstructor;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
@@ -1280,31 +1282,91 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
      * @param roboticId 任务ID
      * @return 执行记录列表
      */
+//    @Override
+//    public List<WorkflowExecRecordVo> getExecRecords(Long roboticId) {
+//        // 查询基础执行记录
+//        List<WorkflowExecRecordVo> records = companyAiWorkflowExecMapper.selectExecRecordsByRoboticId(roboticId);
+//
+//        // 补充状态名称和节点日志
+//        for (WorkflowExecRecordVo record : records) {
+//            // 设置工作流状态名称
+//            if (record.getWorkflowStatus() != null) {
+//                record.setWorkflowStatusName(getStatusName(record.getWorkflowStatus()));
+//            }
+//            // 设置节点类型名称
+//            if (record.getCurrentNodeType() != null) {
+//                record.setCurrentNodeTypeName(getNodeTypeName(record.getCurrentNodeType()));
+//            }
+//            // 查询节点执行日志
+//            if (record.getWorkflowInstanceId() != null) {
+//                List<CompanyAiWorkflowExecLog> logs = companyAiWorkflowExecLogMapper.selectByWorkflowInstanceId(record.getWorkflowInstanceId());
+//                record.setNodeLogs(convertToNodeLogVos(logs));
+//            }
+//        }
+//
+//        return records;
+//    }
+
     @Override
-    public List<WorkflowExecRecordVo> getExecRecords(Long roboticId) {
-        // 查询基础执行记录
-        List<WorkflowExecRecordVo> records = companyAiWorkflowExecMapper.selectExecRecordsByRoboticId(roboticId);
+    public Map<String, Object> getExecRecords(Long roboticId,
+                                              Integer pageNum,
+                                              Integer pageSize,
+                                              String customerName,
+                                              String customerPhone) {
+        //分页查询主数据
+        PageHelper.startPage(pageNum, pageSize);
+
+        List<WorkflowExecRecordVo> records =companyAiWorkflowExecMapper.selectExecRecordsByRoboticId(roboticId,customerName,customerPhone);
+
+        PageInfo<WorkflowExecRecordVo> pageInfo = new PageInfo<>(records);
 
-        // 补充状态名称和节点日志
-        for (WorkflowExecRecordVo record : records) {
-            // 设置工作流状态名称
+        if (records.isEmpty()) {
+            return buildResult(pageInfo, records);
+        }
+        //批量查询日志(避免 N+1)
+        List<String> instanceIds = records.stream()
+                .map(WorkflowExecRecordVo::getWorkflowInstanceId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (!instanceIds.isEmpty()) {
+            List<CompanyAiWorkflowExecLog> allLogs = companyAiWorkflowExecLogMapper.selectByInstanceIds(instanceIds);
+
+            // 按 instanceId 分组
+            Map<String, List<CompanyAiWorkflowExecLog>> logMap = allLogs.stream().collect(
+                    Collectors.groupingBy(CompanyAiWorkflowExecLog::getWorkflowInstanceId));
+            // 填充日志
+            for (WorkflowExecRecordVo record : records) {
+                List<CompanyAiWorkflowExecLog> logs =
+                        logMap.get(record.getWorkflowInstanceId());
+
+                if (logs != null) {
+                    record.setNodeLogs(convertToNodeLogVos(logs));
+                }
+            }
+        }
+        //补充状态名称
+        records.forEach(record -> {
             if (record.getWorkflowStatus() != null) {
                 ExecutionStatusEnum executionStatusEnum = ExecutionStatusEnum.fromValue(record.getWorkflowStatus());
                 record.setWorkflowStatusName( executionStatusEnum.getDescription());
             }
-            // 设置节点类型名称
             if (record.getCurrentNodeType() != null) {
                 NodeTypeEnum nodeTypeEnum = NodeTypeEnum.fromValue(record.getCurrentNodeType());
                 record.setCurrentNodeTypeName(nodeTypeEnum.getDescription());
             }
-            // 查询节点执行日志
-            if (record.getWorkflowInstanceId() != null) {
-                List<CompanyAiWorkflowExecLog> logs = companyAiWorkflowExecLogMapper.selectByWorkflowInstanceId(record.getWorkflowInstanceId());
-                record.setNodeLogs(convertToNodeLogVos(logs));
-            }
-        }
+        });
 
-        return records;
+        return buildResult(pageInfo, records);
+    }
+
+    private Map<String, Object> buildResult(PageInfo<?> pageInfo, List<?> records) {
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("rows", records);
+        result.put("total", pageInfo.getTotal());
+
+        return result;
     }
 
     /**

+ 10 - 0
fs-service/src/main/resources/mapper/company/CompanyAiWorkflowExecLogMapper.xml

@@ -151,4 +151,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             )
         </foreach>
     </insert>
+
+    <select id="selectByInstanceIds" resultType="CompanyAiWorkflowExecLog">
+        SELECT *
+        FROM company_ai_workflow_exec_log
+        WHERE workflow_instance_id IN
+        <foreach collection="list" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        ORDER BY start_time ASC
+    </select>
 </mapper>

+ 51 - 18
fs-service/src/main/resources/mapper/company/CompanyAiWorkflowExecMapper.xml

@@ -149,29 +149,62 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <!-- 根据任务ID查询执行记录列表 -->
-    <select id="selectExecRecordsByRoboticId" resultType="com.fs.company.vo.WorkflowExecRecordVo">
+<!--    <select id="selectExecRecordsByRoboticId" resultType="com.fs.company.vo.WorkflowExecRecordVo">-->
+<!--        SELECT-->
+<!--            b.id AS businessId,-->
+<!--            b.robotic_id AS roboticId,-->
+<!--            b.callee_id AS calleeId,-->
+<!--            c.user_id AS customerId,-->
+<!--            c.user_name AS customerName,-->
+<!--            c.phone AS customerPhone,-->
+<!--            b.wx_client_id AS wxClientId,-->
+<!--            e.workflow_instance_id AS workflowInstanceId,-->
+<!--            e.status AS workflowStatus,-->
+<!--            e.current_node_key AS currentNodeKey,-->
+<!--            e.current_node_name AS currentNodeName,-->
+<!--            e.current_node_type AS currentNodeType,-->
+<!--            e.start_time AS startTime,-->
+<!--            e.last_update_time AS lastUpdateTime,-->
+<!--            b.add_wx_done AS addWxDone,-->
+<!--            b.call_phone_done AS callPhoneDone,-->
+<!--            b.send_msg_done AS sendMsgDone-->
+<!--        FROM company_voice_robotic_business b-->
+<!--        LEFT JOIN company_ai_workflow_exec e ON b.id = e.business_key-->
+<!--        LEFT JOIN company_voice_robotic_callees c ON b.callee_id = c.id-->
+<!--        WHERE b.robotic_id = #{roboticId}-->
+<!--        ORDER BY e.start_time DESC-->
+<!--    </select>-->
+    <select id="selectExecRecordsByRoboticId"
+            resultType="com.fs.company.vo.WorkflowExecRecordVo">
+
         SELECT
-            b.id AS businessId,
-            b.robotic_id AS roboticId,
-            b.callee_id AS calleeId,
-            c.user_id AS customerId,
-            c.user_name AS customerName,
-            c.phone AS customerPhone,
-            b.wx_client_id AS wxClientId,
-            e.workflow_instance_id AS workflowInstanceId,
-            e.status AS workflowStatus,
-            e.current_node_key AS currentNodeKey,
-            e.current_node_name AS currentNodeName,
-            e.current_node_type AS currentNodeType,
-            e.start_time AS startTime,
-            e.last_update_time AS lastUpdateTime,
-            b.add_wx_done AS addWxDone,
-            b.call_phone_done AS callPhoneDone,
-            b.send_msg_done AS sendMsgDone
+        b.id AS businessId,
+        b.robotic_id AS roboticId,
+        b.callee_id AS calleeId,
+        c.user_id AS customerId,
+        c.user_name AS customerName,
+        c.phone AS customerPhone,
+        b.wx_client_id AS wxClientId,
+        e.workflow_instance_id AS workflowInstanceId,
+        e.status AS workflowStatus,
+        e.current_node_key AS currentNodeKey,
+        e.current_node_name AS currentNodeName,
+        e.current_node_type AS currentNodeType,
+        e.start_time AS startTime,
+        e.last_update_time AS lastUpdateTime,
+        b.add_wx_done AS addWxDone,
+        b.call_phone_done AS callPhoneDone,
+        b.send_msg_done AS sendMsgDone
         FROM company_voice_robotic_business b
         LEFT JOIN company_ai_workflow_exec e ON b.id = e.business_key
         LEFT JOIN company_voice_robotic_callees c ON b.callee_id = c.id
         WHERE b.robotic_id = #{roboticId}
+        <if test="customerName != null and customerName != ''">
+            AND c.user_name LIKE CONCAT('%', #{customerName}, '%')
+        </if>
+        <if test="customerPhone != null and customerPhone != ''">
+            AND c.phone LIKE CONCAT('%', #{customerPhone}, '%')
+        </if>
         ORDER BY e.start_time DESC
     </select>