business/src/main/java/com/ycl/controller/FlowLogController.java
@@ -40,6 +40,6 @@ // @PreAuthorize("@ss.hasPermi('flowLog:page')") public Result projectProcessLogPage(ProcessLogQuery query) { query.setDeleted(null); return processLogService.projectProcessLogPage(query); return processLogService.projectProcessLogList(query); } } business/src/main/java/com/ycl/controller/IndexController.java
@@ -1,5 +1,6 @@ package com.ycl.controller; import com.ycl.common.base.Result; import com.ycl.common.core.controller.BaseController; import com.ycl.common.core.domain.R; import com.ycl.common.core.page.TableDataInfo; @@ -7,6 +8,8 @@ import com.ycl.domain.vo.*; import com.ycl.service.AuditHistoryService; import com.ycl.service.ProjectInfoService; import com.ycl.service.ProjectProcessService; import com.ycl.system.domain.base.AbsQuery; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,12 +26,9 @@ public class IndexController extends BaseController { @Autowired private ProjectInfoService projectInfoService; @Autowired private AuditHistoryService auditHistoryService; private final ProjectInfoService projectInfoService; private final AuditHistoryService auditHistoryService; private final ProjectProcessService projectProcessService; /** * 项目数量统计 @@ -74,10 +74,8 @@ * 消息条数 */ @GetMapping("/message-count") public R<IndexMsgCountVO> messageCount() { IndexMsgCountVO vo = new IndexMsgCountVO(); vo.setAuditCount(0L); return R.ok(vo); public Result messageCount(AbsQuery query) { return projectProcessService.getProcessMsg(query); } /** business/src/main/java/com/ycl/domain/vo/TaskOrderVO.java
New file @@ -0,0 +1,23 @@ package com.ycl.domain.vo; import lombok.Data; /** * @author:xp * @date:2025/3/23 10:48 */ @Data public class TaskOrderVO { private String taskId; /** * 排序值 */ private Long num; /** * 剩余时间 */ private String remaingTime; } business/src/main/java/com/ycl/service/ProcessLogService.java
@@ -111,5 +111,7 @@ * @param query * @return */ Result projectProcessLogList(ProcessLogQuery query); Result projectProcessLogPage(ProcessLogQuery query); } business/src/main/java/com/ycl/service/ProjectProcessService.java
@@ -1,5 +1,6 @@ package com.ycl.service; import com.ycl.common.core.domain.R; import com.ycl.domain.entity.ProjectProcess; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.common.base.Result; @@ -7,6 +8,8 @@ import com.ycl.domain.query.ProjectProcessQuery; import com.ycl.domain.query.TaskQuery; import com.ycl.domain.vo.CustomerTaskVO; import com.ycl.domain.vo.IndexMsgCountVO; import com.ycl.system.domain.base.AbsQuery; import java.util.List; @@ -142,4 +145,6 @@ * @return */ Result taskTeamwork(TaskTeamWorkForm form); Result getProcessMsg(AbsQuery query); } business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -73,7 +73,6 @@ import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -1478,7 +1477,7 @@ ProcessLogQuery query = new ProcessLogQuery(); query.setTaskId(node.getTaskId()); query.setProcessInsId(finalProcessInsId); Result result = processLogService.projectProcessLogPage(query); Result result = processLogService.projectProcessLogList(query); List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data"); DoFormDetailVO vo = new DoFormDetailVO(); BeanUtils.copyProperties(node, vo); @@ -1557,7 +1556,7 @@ ProcessLogQuery query = new ProcessLogQuery(); query.setTaskId(node.getTaskId()); query.setProcessInsId(hisTask.getProcessInstanceId()); Result result = processLogService.projectProcessLogPage(query); Result result = processLogService.projectProcessLogList(query); List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data"); DoFormDetailVO vo = new DoFormDetailVO(); BeanUtils.copyProperties(node, vo); @@ -1628,7 +1627,7 @@ ProcessLogQuery query = new ProcessLogQuery(); query.setTaskId(node.getTaskId()); query.setProcessInsId(processInsId); Result result = processLogService.projectProcessLogPage(query); Result result = processLogService.projectProcessLogList(query); List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data"); DoFormDetailVO vo = new DoFormDetailVO(); BeanUtils.copyProperties(node, vo); business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
@@ -180,8 +180,8 @@ } @Override public Result projectProcessLogPage(ProcessLogQuery query) { List<ProcessLogVO> list = baseMapper.projectProcessLogPage(query); public Result projectProcessLogList(ProcessLogQuery query) { List<ProcessLogVO> list = baseMapper.projectProcessLogList(query); // json反序列化 list.stream().forEach(log -> { if (StringUtils.isNotBlank(log.getEventDataJson())) { @@ -217,6 +217,13 @@ return Result.ok().data(list); } @Override public Result projectProcessLogPage(ProcessLogQuery query) { IPage<ProcessLogVO> page = PageUtil.getPage(query, ProcessLogVO.class); baseMapper.projectProcessLogPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } /** * 解析流程日志中的数据-名称 * business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -18,6 +18,7 @@ import com.ycl.domain.entity.*; import com.ycl.domain.form.*; import com.ycl.domain.json.*; import com.ycl.domain.query.ProcessLogQuery; import com.ycl.domain.vo.*; import com.ycl.event.event.TaskLogEvent; import com.ycl.mapper.ProjectEngineeringMapper; @@ -28,6 +29,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.domain.query.ProjectProcessQuery; import com.ycl.service.common.TaskCommonService; import com.ycl.system.domain.base.AbsQuery; import com.ycl.system.service.ISysDeptService; import com.ycl.system.service.ISysDictTypeService; import com.ycl.system.service.ISysRoleService; @@ -378,7 +380,50 @@ .endOr(); } result.total(taskQuery.count()); List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); List<Task> allTodoList = taskQuery.list(); List<TaskOrderVO> orderList = new ArrayList<>(); allTodoList.stream().forEach(task -> { TaskOrderVO order = new TaskOrderVO(); order.setTaskId(task.getId()); // 计算办理时间,超时的排前面,没超时的由低到高排序,没超时时间的排最后 ProcessCoding processCoding = processCodingService.getByTaskId(task.getId(), task.getProcessInstanceId()); if (Objects.nonNull(processCoding)) { if (StringUtils.isNotBlank(processCoding.getRedTime())) { Long overtime = getTime(processCoding.getRedTime()); long durationTime = 0l; if (Objects.nonNull(processCoding.getStartTaskTime())) { durationTime = ((new Date()).getTime() - processCoding.getStartTaskTime().getTime()) / 1000; } if (overtime > durationTime) { order.setNum((overtime - durationTime) / 3600); } else { order.setNum(-2000000L); } } else { order.setNum(2000000L); } } else { order.setNum(2000000L); } orderList.add(order); }); // 升序排列 Collections.sort(orderList, Comparator.comparingLong(TaskOrderVO::getNum)); int startNum = pageSize * (pageNum - 1); int endNum = startNum + pageSize; if (startNum >= orderList.size()) { result.data(new ArrayList<>()).total(0L); return; } int end = Math.min(endNum, orderList.size()); List<String> targetTaskIds = orderList.subList(startNum, end).stream().map(TaskOrderVO::getTaskId).collect(Collectors.toList()); List<Task> taskList = targetTaskIds.stream().map(taskId -> { List<Task> list = allTodoList.stream().filter(task -> task.getId().equals(taskId)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(list)) { return null; } return list.get(0); }).filter(Objects::nonNull).collect(Collectors.toList()); List<IndexCustomerTaskVO> vos = new ArrayList<>(); for (Task task : taskList) { IndexCustomerTaskVO taskVO = new IndexCustomerTaskVO(); @@ -923,6 +968,37 @@ return Result.ok("操作成功"); } @Override public Result getProcessMsg(AbsQuery q) { // 查自己的日志 ProcessLogQuery query = new ProcessLogQuery(); if (! SecurityUtils.isAdmin(SecurityUtils.getUserId())) { query.setUserId(SecurityUtils.getUserId()); } query.setEventTypeList(Arrays.asList(ProcessLogEventTypeEnum.DELEGATE.getValue(), ProcessLogEventTypeEnum.REJECT.getValue(), ProcessLogEventTypeEnum.JUMP.getValue(), ProcessLogEventTypeEnum.FINISHED.getValue(), ProcessLogEventTypeEnum.WAIT.getValue())); query.setCurrentPage(q.getCurrentPage()); query.setPageSize(q.getPageSize()); Result result = processLogService.projectProcessLogPage(query); List<ProcessLogVO> logs = (List<ProcessLogVO>) result.get("data"); logs.stream().forEach(log -> { if (ProcessLogEventTypeEnum.FINISHED.equals(log.getEventType())) { log.setContent("您完成了任务:" + log.getTaskName()); } else if (ProcessLogEventTypeEnum.REJECT.equals(log.getEventType())) { log.setContent("您驳回了任务:" + log.getTaskName()); } else if (ProcessLogEventTypeEnum.WAIT.equals(log.getEventType())) { log.setContent("您容缺了任务:" + log.getTaskName()); } else if (ProcessLogEventTypeEnum.JUMP.equals(log.getEventType())) { log.setContent("您跳过了任务:" + log.getTaskName()); } }); return Result.ok().data(logs).total((Long) result.get("total")); } /** * 查询待办任务 * flowable/src/main/java/com/ycl/domain/query/ProcessLogQuery.java
@@ -43,5 +43,15 @@ * 逻辑删除 */ private Integer deleted = 0; /** * 查谁的 */ private Long userId; /** * 查哪种类型的日志 */ private List<String> eventTypeList; } flowable/src/main/java/com/ycl/domain/vo/ProcessLogVO.java
@@ -52,6 +52,9 @@ @ApiModelProperty("json转换后的对象") private Object eventDataObj; @ApiModelProperty("内容") private String content; public static ProcessLogVO getVoByEntity(@NonNull ProcessLog entity, ProcessLogVO vo) { if(vo == null) { vo = new ProcessLogVO(); flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java
@@ -37,7 +37,10 @@ * @param query * @return */ List<ProcessLogVO> projectProcessLogPage(@Param("query") ProcessLogQuery query); List<ProcessLogVO> projectProcessLogList(@Param("query") ProcessLogQuery query); IPage projectProcessLogPage(IPage page, @Param("query") ProcessLogQuery query); List<String> getAllHangup(); flowable/src/main/resources/mapper/ProcessLogMapper.xml
@@ -55,8 +55,38 @@ TFL.deleted = 0 </select> <select id="projectProcessLogPage" resultMap="BaseResultMap"> SELECT TFL.task_id, TFL.task_name, TFL.event_type, TFL.project_id, TFL.process_ins_id, TFL.user_id, CONCAT(SU.nick_name, '(',COALESCE(SD.dept_name, '无部门'), ')') as nick_name, TFL.event_data_json, TFL.gmt_create, TFL.id FROM t_process_log TFL LEFT JOIN sys_user SU ON SU.user_id = TFL.user_id LEFT JOIN sys_dept SD ON SU.dept_id = SD.dept_id <where> <if test="query.deleted != null">AND TFL.deleted = #{query.deleted}</if> <if test="query.userId != null">AND TFL.user_id = #{query.userId}</if> <if test="query.processInsId != null and query.processInsId != ''">AND TFL.process_ins_id = #{query.processInsId}</if> <if test="query.taskId != null and query.taskId != ''">AND TFL.task_id = #{query.taskId}</if> <if test="query.projectId != null and query.projectId != ''">AND TFL.project_id = #{query.projectId}</if> <if test="query.taskDefKey != null and query.taskDefKey != ''">AND TFL.task_def_key = #{query.taskDefKey}</if> <if test="query.eventTypeList != null and query.eventTypeList.size > 0"> AND TFL.event_type IN <foreach collection="query.eventTypeList" open="(" separator="," close=")" item="eventType">#{eventType}</foreach> </if> </where> ORDER BY TFL.gmt_create DESC </select> <select id="projectProcessLogList" resultMap="BaseResultMap"> SELECT TFL.task_id, TFL.task_name, @@ -73,11 +103,15 @@ LEFT JOIN sys_user SU ON SU.user_id = TFL.user_id LEFT JOIN sys_dept SD ON SU.dept_id = SD.dept_id <where> <if test="query.deleted != null">TFL.deleted = #{query.deleted}</if> AND TFL.process_ins_id = #{query.processInsId} <if test="query.deleted != null">AND TFL.deleted = #{query.deleted}</if> <if test="query.userId != null">AND TFL.user_id = #{query.userId}</if> <if test="query.processInsId != null and query.processInsId != ''">AND TFL.process_ins_id = #{query.processInsId}</if> <if test="query.taskId != null and query.taskId != ''">AND TFL.task_id = #{query.taskId}</if> <if test="query.projectId != null and query.projectId != ''">AND TFL.project_id = #{query.projectId}</if> <if test="query.taskDefKey != null and query.taskDefKey != ''">AND TFL.task_def_key = #{query.taskDefKey}</if> <if test="query.eventTypeList != null and query.eventTypeList.size > 0"> AND TFL.event_type IN <foreach collection="query.eventTypeList" open="(" separator="," close=")" item="eventType">#{eventType}</foreach> </if> </where> ORDER BY TFL.gmt_create DESC