zxl
2025-03-24 f8ce7aa161ef2ef316357ead8208bc60de938ead
Merge remote-tracking branch 'origin/master'
11个文件已修改
1个文件已添加
204 ■■■■ 已修改文件
business/src/main/java/com/ycl/controller/FlowLogController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/IndexController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/TaskOrderVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProcessLogService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProjectProcessService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/query/ProcessLogQuery.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/vo/ProcessLogVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/resources/mapper/ProcessLogMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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