流程日志代码、流程推进详情页查询中的处理人、处理单位数据结构调整
3个文件已修改
10个文件已添加
746 ■■■■ 已修改文件
business/src/main/java/com/ycl/controller/FlowLogController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/entity/FlowLog.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/json/TaskDelegateData.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/query/FlowLogQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/FlowLogVO.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/FlowLogMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/FlowLogService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/FlowLogMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/FlowLogController.java
New file
@@ -0,0 +1,38 @@
package com.ycl.controller;
import com.ycl.common.base.Result;
import com.ycl.domain.query.FlowLogQuery;
import com.ycl.service.FlowLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 流程日志 前端控制器
 *
 * @author xp
 * @since 2025-01-02
 */
@Validated
@RequiredArgsConstructor
@Api(value = "流程日志", tags = "流程日志管理")
@RestController
@RequestMapping("/flow-log")
public class FlowLogController {
    private final FlowLogService flowLogService;
    @GetMapping("/page")
    @ApiOperation(value = "分页", notes = "分页")
    @PreAuthorize("@ss.hasPermi('flowLog:page')")
    public Result page(FlowLogQuery query) {
        return flowLogService.page(query);
    }
}
business/src/main/java/com/ycl/domain/entity/FlowLog.java
New file
@@ -0,0 +1,46 @@
package com.ycl.domain.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ycl.common.enums.business.FlowLogEventTypeEnum;
import com.ycl.system.domain.base.AbsEntity;
import lombok.Data;
/**
 * 流程日志
 *
 * @author xp
 * @since 2025-01-02
 */
@Data
@TableName("t_flow_log")
public class FlowLog extends AbsEntity {
    private static final long serialVersionUID = 1L;
    @TableField("task_id")
    /** 任务id */
    private String taskId;
    @TableField("event_type")
    /** 事件日志类型 */
    private FlowLogEventTypeEnum eventType;
    @TableField("project_id")
    /** 项目id */
    private Integer projectId;
    @TableField("flow_ins_id")
    /** 流程实例id */
    private String flowInsId;
    @TableField("user_id")
    /** 产生日志的人/或其它 */
    private Integer userId;
    @TableField("event_data_json")
    /** 事件数据,根据不同的事件可存储对应的扩展数据。如转办事件可存储转办前后的处理人信息 */
    private String eventDataJson;
}
business/src/main/java/com/ycl/domain/form/TaskDelegationForm.java
@@ -33,4 +33,10 @@
     */
    @ApiModelProperty("不同用户组对应选择的id, 如:peopleType是角色,这里就对应角色id,多个用英文逗号隔开")
    private String targetId;
    @ApiModelProperty("项目id,用于保存日志")
    private Integer projectId;
    @ApiModelProperty("流程实例id,用于保存日志")
    private String processInsId;
}
business/src/main/java/com/ycl/domain/json/TaskDelegateData.java
New file
@@ -0,0 +1,36 @@
package com.ycl.domain.json;
import com.ycl.common.enums.business.HandlerTypeEnum;
import lombok.Data;
import java.util.List;
/**
 * 任务转办的json日志数据
 *
 * @author:xp
 * @date:2025/1/2 14:39
 */
@Data
public class TaskDelegateData {
    /**
     * 转办前的处理人id
     */
    private List<String> beforeHandlerIds;
    /**
     * 转办前的处理人类型
     */
    private HandlerTypeEnum beforeHandlerType;
    /**
     * 转办后的处理人id
     */
    private List<String> afterHandlerIds;
    /**
     * 转办后的处理人类型
     */
    private HandlerTypeEnum afterHandlerType;
}
business/src/main/java/com/ycl/domain/query/FlowLogQuery.java
New file
@@ -0,0 +1,22 @@
package com.ycl.domain.query;
import com.ycl.system.domain.base.AbsQuery;
import java.util.List;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 流程日志查询
 *
 * @author xp
 * @since 2025-01-02
 */
@Data
@ApiModel(value = "FlowLog查询参数", description = "流程日志查询参数")
public class FlowLogQuery extends AbsQuery {
}
business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * 任务回显内容
@@ -78,22 +79,22 @@
    /**
     * 处理人
     */
    private String handlerName;
    private List<String> handlerName;
    /**
     * 发起人id
     * 处理人id
     */
    private Long handlerId;
    private List<Long> handlerId;
    /**
     * 处理人单位id
     */
    private Long handlerUnitId;
    private List<Long> handlerUnitId;
    /**
     * 处理人单位名称
     */
    private String handlerUnitName;
    private List<String> handlerUnitName;
    /**
     * 办理期限
business/src/main/java/com/ycl/domain/vo/FlowLogVO.java
New file
@@ -0,0 +1,55 @@
package com.ycl.domain.vo;
import com.ycl.system.domain.base.AbsVo;
import com.ycl.domain.entity.FlowLog;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 流程日志展示
 *
 * @author xp
 * @since 2025-01-02
 */
@Data
@ApiModel(value = "流程日志响应数据", description = "流程日志响应数据")
public class FlowLogVO extends AbsVo {
    /** 任务id */
    @ApiModelProperty("任务id")
    private String taskId;
    /** 事件日志类型 */
    @ApiModelProperty("事件日志类型")
    private String eventType;
    /** 项目id */
    @ApiModelProperty("项目id")
    private Integer projectId;
    /** 流程实例id */
    @ApiModelProperty("流程实例id")
    private String flowInsId;
    /** 产生日志的人/或其它 */
    @ApiModelProperty("产生日志的人/或其它")
    private Integer userId;
    /** 事件数据,根据不同的事件可存储对应的扩展数据。如转办事件可存储转办前后的处理人信息 */
    @ApiModelProperty("事件数据,根据不同的事件可存储对应的扩展数据。如转办事件可存储转办前后的处理人信息")
    private String eventDataJson;
    public static FlowLogVO getVoByEntity(@NonNull FlowLog entity, FlowLogVO vo) {
        if(vo == null) {
            vo = new FlowLogVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
business/src/main/java/com/ycl/mapper/FlowLogMapper.java
New file
@@ -0,0 +1,33 @@
package com.ycl.mapper;
import com.ycl.domain.entity.FlowLog;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.domain.vo.FlowLogVO;
import com.ycl.domain.query.FlowLogQuery;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 流程日志 Mapper 接口
 *
 * @author xp
 * @since 2025-01-02
 */
@Mapper
public interface FlowLogMapper extends BaseMapper<FlowLog> {
    /**
     * id查找流程日志
     * @param id
     * @return
     */
    FlowLogVO getById(Integer id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") FlowLogQuery query);
}
business/src/main/java/com/ycl/service/FlowLogService.java
New file
@@ -0,0 +1,61 @@
package com.ycl.service;
import com.ycl.common.enums.business.FlowLogEventTypeEnum;
import com.ycl.domain.entity.FlowLog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.common.base.Result;
import com.ycl.domain.query.FlowLogQuery;
import java.util.List;
/**
 * 流程日志 服务类
 *
 * @author xp
 * @since 2025-01-02
 */
public interface FlowLogService extends IService<FlowLog> {
    /**
     * 添加
     * @param taskId 任务id
     * @param flowInsId 流程实例id
     * @param eventType 事件类型
     * @param projectId 项目id
     * @param eventDataJson json扩展内容
     */
    void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Integer projectId, String eventDataJson);
    /**
     * 批量删除
     * @param ids
     * @return
     */
    Result remove(List<String> ids);
    /**
     * id删除
     * @param id
     * @return
     */
    Result removeById(String id);
    /**
     * 分页查询
     * @param query
     * @return
     */
    Result page(FlowLogQuery query);
    /**
     * 根据id查找
     * @param id
     * @return
     */
    Result detail(Integer id);
    /**
     * 列表
     * @return
     */
    Result all();
}
business/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java
New file
@@ -0,0 +1,110 @@
package com.ycl.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.common.enums.business.FlowLogEventTypeEnum;
import com.ycl.domain.entity.FlowLog;
import com.ycl.mapper.FlowLogMapper;
import com.ycl.service.FlowLogService;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.domain.vo.FlowLogVO;
import com.ycl.domain.query.FlowLogQuery;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import com.ycl.framework.utils.PageUtil;
import org.springframework.util.Assert;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 流程日志 服务实现类
 *
 * @author xp
 * @since 2025-01-02
 */
@Service
@RequiredArgsConstructor
public class FlowLogServiceImpl extends ServiceImpl<FlowLogMapper, FlowLog> implements FlowLogService {
    private final FlowLogMapper flowLogMapper;
    /**
     * 添加日志
     *
     * @param taskId 任务id
     * @param flowInsId 流程实例id
     * @param eventType 事件类型
     * @param projectId 项目id
     * @param eventDataJson json扩展内容
     */
    @Override
    public void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Integer projectId, String eventDataJson) {
        FlowLog log = new FlowLog();
        log.setTaskId(taskId);
        log.setFlowInsId(flowInsId);
        log.setProjectId(projectId);
        log.setEventType(eventType);
        log.setEventDataJson(eventDataJson);
        baseMapper.insert(log);
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
        return Result.ok("删除成功");
    }
    /**
     * id删除
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        return Result.ok("删除成功");
    }
    /**
     * 分页查询
     * @param query
     * @return
     */
    @Override
    public Result page(FlowLogQuery query) {
        IPage<FlowLogVO> page = PageUtil.getPage(query, FlowLogVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     * 根据id查找
     * @param id
     * @return
     */
    @Override
    public Result detail(Integer id) {
        FlowLogVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
    /**
     * 列表
     * @return
     */
    @Override
    public Result all() {
        List<FlowLog> entities = baseMapper.selectList(null);
        List<FlowLogVO> vos = entities.stream()
                .map(entity -> FlowLogVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
}
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -12,19 +12,23 @@
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
import com.ycl.common.enums.business.FlowLogEventTypeEnum;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
import com.ycl.domain.dto.FlowTaskDto;
import com.ycl.domain.entity.FlowLog;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.form.RejectTaskForm;
import com.ycl.domain.form.TaskDelegationForm;
import com.ycl.domain.json.TaskDelegateData;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
import com.ycl.mapper.ProjectInfoMapper;
import com.ycl.mapper.ProjectProcessMapper;
import com.ycl.service.FlowLogService;
import com.ycl.service.ProjectProcessService;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -83,6 +87,7 @@
    private final ISysRoleService sysRoleService;
    private final ISysDeptService sysDeptService;
    private final TaskCommonService taskCommonService;
    private final FlowLogService flowLogService;
    /**
     * 分页查询
@@ -99,6 +104,7 @@
                ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult();
                if (Objects.nonNull(processDefinition)) {
                    vo.setSuspended(processDefinition.isSuspended());
                    vo.setFlowableProcessName(processDefinition.getName());
                }
            }
        }
@@ -286,6 +292,12 @@
            // 流程发起人信息
            this.setPromoterInfo(taskVO);
            // 一个任务可能有多个候选人/组,所以需要使用list
            List<Long> handlerIds = new ArrayList<>(2);
            List<String> handlerNames = new ArrayList<>(2);
            List<Long> handlerUnitIds = new ArrayList<>(2);
            List<String> handlerUnitNames = new ArrayList<>(2);
            // 流程处理人信息
            List<? extends IdentityLinkInfo> identityLinks = task.getIdentityLinks();
            for (IdentityLinkInfo identityLink : identityLinks) {
@@ -294,12 +306,12 @@
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerId(sysUser.getUserId());
                        handlerIds.add(sysUser.getUserId());
                        handlerNames.add(sysUser.getNickName());
                        if (Objects.nonNull(sysUser.getDept())) {
                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
                            handlerUnitIds.add(sysUser.getDept().getDeptId());
                            handlerUnitNames.add(sysUser.getDept().getDeptName());
                        }
                        taskVO.setHandlerName(sysUser.getNickName());
                    }
                    // 绑定的是角色或者部门
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
@@ -310,20 +322,16 @@
                            // 部门
                            SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                            if (Objects.nonNull(dept)) {
                                taskVO.setHandlerUnitId(dept.getDeptId());
                                taskVO.setHandlerUnitName(dept.getDeptName());
                                taskVO.setHandlerName("暂未处理");
                                taskVO.setHandlerId(null);
                                handlerUnitIds.add(dept.getDeptId());
                                handlerUnitNames.add(dept.getDeptName());
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                            taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                            taskVO.setHandlerName("暂未处理");
                            taskVO.setHandlerId(null);
                            handlerUnitIds.add(role.getRoleId());
                            handlerUnitNames.add(role.getRoleName());
                        }
                    }
                }
@@ -368,29 +376,74 @@
        if (Objects.isNull(task)) {
            throw new RuntimeException("未在运行任务中找到该任务,无法执行转办操作");
        }
        // 转办之前的处理人
        List<String> beforeHandlerIds = new ArrayList<>(2);
        // 转办之前的处理人类型
        HandlerTypeEnum beforeHandlerType = null;
        // 需要先移除之前的处理人
        for (IdentityLinkInfo identityLink : task.getIdentityLinks()) {
            if (StringUtils.isNotBlank(identityLink.getUserId())) {
                beforeHandlerIds.add(identityLink.getUserId());
                beforeHandlerType = HandlerTypeEnum.USER;
                taskService.deleteCandidateUser(task.getId(), identityLink.getUserId());
            } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                beforeHandlerIds.add(identityLink.getGroupId());
                if (identityLink.getGroupId().contains("dept")) {
                    beforeHandlerType = HandlerTypeEnum.DEPT;
                } else {
                    beforeHandlerType = HandlerTypeEnum.ROLE;
                }
                // 从候选组中删除这个组,便不能申领执行任务了
                taskService.deleteCandidateGroup(task.getId(), identityLink.getGroupId());
            }
        }
        TaskDelegateData jsonData = new TaskDelegateData();
        jsonData.setBeforeHandlerIds(beforeHandlerIds);
        jsonData.setBeforeHandlerType(beforeHandlerType);
        List<String> afterHandlerIds = new ArrayList<>(2);
        // 再新增处理人
        switch (form.getPeopleType()) {
            case FIX_USER:
                // 指定用户的话,只能选一个用户
                taskService.delegateTask(task.getId(), form.getTargetId());
                taskService.setAssignee(task.getId(), form.getTargetId());
                afterHandlerIds.add(form.getTargetId());
                break;
            case USER:
                // 用户组的话,可以选多个用户,严格来说这里的用户组并不是flowable中的组的概念,只是开源框架有这个定义
                // 用户组的话,可以选多个用户
                String[] userList = form.getTargetId().split(",");
                for (String userId : userList) {
                    taskService.addCandidateUser(task.getId(), userId);
                }
                afterHandlerIds.addAll(List.of(userList));
                break;
            case DEPT:
                taskService.addCandidateGroup(task.getId(), form.getTargetId());
                String[] deptList = form.getTargetId().split(",");
                for (String deptId : deptList) {
                    // 添加候选组,便可以申领执行任务了
                    taskService.addCandidateGroup(task.getId(), deptId);
                }
                List<String> deptIds = Arrays.stream(deptList).map(id -> {
                    // 因为部门的id是加了  dept:前缀的,用于区分部门和角色这两个组的概念
                    String[] split = id.split(":");
                    return split[1];
                }).collect(Collectors.toList());
                afterHandlerIds.addAll(deptIds);
                break;
            case ROLE:
                String[] roleList = form.getTargetId().split(",");
                for (String roleId : roleList) {
                    taskService.addCandidateGroup(task.getId(), roleId);
                }
                afterHandlerIds.addAll(List.of(roleList));
                break;
            default:
                break;
        }
        jsonData.setAfterHandlerIds(afterHandlerIds);
        jsonData.setAfterHandlerType(form.getPeopleType());
        // 添加日志
        flowLogService.add(task.getId(), form.getProcessInsId(), FlowLogEventTypeEnum.DELEGATE, form.getProjectId(), JSON.toJSONString(jsonData));
        return Result.ok("转办成功");
    }
@@ -438,6 +491,12 @@
            // 流程发起人信息
            this.setPromoterInfo(taskVO);
            // 一个任务可能有多个候选人/组,所以需要使用list
            List<Long> handlerIds = new ArrayList<>(2);
            List<String> handlerNames = new ArrayList<>(2);
            List<Long> handlerUnitIds = new ArrayList<>(2);
            List<String> handlerUnitNames = new ArrayList<>(2);
            // 流程处理人信息
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
            for (IdentityLink identityLink : identityLinksForTask) {
@@ -446,12 +505,12 @@
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerId(sysUser.getUserId());
                        handlerIds.add(sysUser.getUserId());
                        handlerNames.add(sysUser.getNickName());
                        if (Objects.nonNull(sysUser.getDept())) {
                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
                            handlerUnitIds.add(sysUser.getDept().getDeptId());
                            handlerUnitNames.add(sysUser.getDept().getDeptName());
                        }
                        taskVO.setHandlerName(sysUser.getNickName());
                    }
                    // 绑定的是角色或者部门
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
@@ -462,23 +521,22 @@
                            // 部门
                            SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                            if (Objects.nonNull(dept)) {
                                taskVO.setHandlerUnitId(dept.getDeptId());
                                taskVO.setHandlerUnitName(dept.getDeptName());
                                taskVO.setHandlerName("暂未处理");
                                taskVO.setHandlerId(null);
                                handlerUnitIds.add(dept.getDeptId());
                                handlerUnitNames.add(dept.getDeptName());
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                            taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                            taskVO.setHandlerName("暂未处理");
                            taskVO.setHandlerId(null);
                            handlerUnitIds.add(Long.parseLong(identityLink.getGroupId()));
                        }
                    }
                }
                taskVO.setHandlerId(handlerIds);
                taskVO.setHandlerName(handlerNames);
                taskVO.setHandlerUnitId(handlerUnitIds);
                taskVO.setHandlerUnitName(handlerUnitNames);
            }
            vos.add(taskVO);
        }
@@ -527,6 +585,13 @@
            vo.setTaskName(userTask.getName());
            vo.setProcessName(process.getProcessDefinitionName());
            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
            // 一个任务可能有多个候选人/组,所以需要使用list
            List<Long> handlerIds = new ArrayList<>(2);
            List<String> handlerNames = new ArrayList<>(2);
            List<Long> handlerUnitIds = new ArrayList<>(2);
            List<String> handlerUnitNames = new ArrayList<>(2);
            if (Objects.isNull(task)) {
                // 如果任务在运行时没找到,那么可能为未开始或者已完成,需要从历史任务中再找一下
                List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
@@ -544,13 +609,16 @@
                        vo.setHandlerType(HandlerTypeEnum.USER);
                        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
                        if (Objects.nonNull(sysUser)) {
                            vo.setHandlerId(sysUser.getUserId());
                            vo.setHandlerName(sysUser.getNickName());
                            vo.setHandlerUnitId(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptId() : null);
                            vo.setHandlerUnitName(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptName() : null);
                            handlerIds.add(sysUser.getUserId());
                            handlerNames.add(sysUser.getNickName());
                            if (Objects.nonNull(sysUser.getDept())) {
                                handlerUnitIds.add(sysUser.getDept().getDeptId());
                                handlerUnitNames.add(sysUser.getDept().getDeptName());
                            }
                        }
                    } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) {
                        String groupId = userTask.getCandidateGroups().get(0);
                        List<String> groupIds = userTask.getCandidateGroups();
                        for (String groupId : groupIds) {
                        if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                            vo.setHandlerType(HandlerTypeEnum.DEPT);
                            String[] split = groupId.split(":");
@@ -558,20 +626,18 @@
                                // 部门
                                SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                                if (Objects.nonNull(dept)) {
                                    vo.setHandlerUnitId(dept.getDeptId());
                                    vo.setHandlerUnitName(dept.getDeptName());
                                    vo.setHandlerName("未开始");
                                    vo.setHandlerId(null);
                                        handlerUnitIds.add(dept.getDeptId());
                                        handlerUnitNames.add(dept.getDeptName());
                                }
                            }
                        } else {
                            vo.setHandlerType(HandlerTypeEnum.ROLE);
                            SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId));
                            if (Objects.nonNull(role)) {
                                vo.setHandlerUnitId(Long.parseLong(groupId));
                                vo.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                                vo.setHandlerName("未开始");
                                vo.setHandlerId(null);
                                    handlerUnitIds.add(role.getRoleId());
                                    handlerUnitNames.add(role.getRoleName());
                                }
                            }
                        }
                    }
@@ -586,8 +652,8 @@
                    long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee());
                    SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                    if (Objects.nonNull(handlerUser)) {
                        vo.setHandlerId(handlerUserId);
                        vo.setHandlerName(handlerUser.getNickName());
                        handlerIds.add(handlerUserId);
                        handlerNames.add(handlerUser.getNickName());
                    }
                    vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey());
                    this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks());
@@ -601,6 +667,10 @@
                this.setPromoterAndHandler(vo, null);
            }
            vo.setHandlerId(handlerIds);
            vo.setHandlerName(handlerNames);
            vo.setHandlerUnitId(handlerUnitIds);
            vo.setHandlerUnitName(handlerUnitNames);
            return vo;
        }).collect(Collectors.toList());
        result.data(vos);
@@ -642,8 +712,9 @@
            long handlerUserId = Long.parseLong(hisTaskList.get(0).getAssignee());
            SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
            if (Objects.nonNull(handlerUser)) {
                vo.setHandlerId(handlerUserId);
                vo.setHandlerName(handlerUser.getNickName());
                vo.setHandlerId(Arrays.asList(handlerUserId));
                vo.setHandlerName(Arrays.asList(handlerUser.getNickName()));
            }
            vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey());
            this.setPromoterAndHandler(vo, hisTaskList.get(0).getIdentityLinks());
@@ -688,6 +759,13 @@
            result.data(vos);
            return vos;
        }
        // 一个任务可能有多个候选人/组,所以需要使用list
        List<Long> handlerIds = new ArrayList<>(2);
        List<String> handlerNames = new ArrayList<>(2);
        List<Long> handlerUnitIds = new ArrayList<>(2);
        List<String> handlerUnitNames = new ArrayList<>(2);
        // 判断任务状态
        List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> {
            CustomerTaskVO vo = new CustomerTaskVO();
@@ -712,13 +790,16 @@
                        vo.setHandlerType(HandlerTypeEnum.USER);
                        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
                        if (Objects.nonNull(sysUser)) {
                            vo.setHandlerId(sysUser.getUserId());
                            vo.setHandlerName(sysUser.getNickName());
                            vo.setHandlerUnitId(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptId() : null);
                            vo.setHandlerUnitName(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptName() : null);
                            handlerIds.add(sysUser.getUserId());
                            handlerNames.add(sysUser.getNickName());
                            if (Objects.nonNull(sysUser.getDept())) {
                                handlerUnitIds.add(sysUser.getDept().getDeptId());
                                handlerUnitNames.add(sysUser.getDept().getDeptName());
                            }
                        }
                    } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) {
                        String groupId = userTask.getCandidateGroups().get(0);
                        List<String> groupIds = userTask.getCandidateGroups();
                        for (String groupId : groupIds) {
                        if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                            vo.setHandlerType(HandlerTypeEnum.DEPT);
                            String[] split = groupId.split(":");
@@ -726,24 +807,26 @@
                                // 部门
                                SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                                if (Objects.nonNull(dept)) {
                                    vo.setHandlerUnitId(dept.getDeptId());
                                    vo.setHandlerUnitName(dept.getDeptName());
                                    vo.setHandlerName("未开始");
                                    vo.setHandlerId(null);
                                        handlerUnitIds.add(dept.getDeptId());
                                        handlerUnitNames.add(dept.getDeptName());
                                }
                            }
                        } else {
                            vo.setHandlerType(HandlerTypeEnum.ROLE);
                            SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId));
                            if (Objects.nonNull(role)) {
                                vo.setHandlerUnitId(Long.parseLong(groupId));
                                vo.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                                vo.setHandlerName("未开始");
                                vo.setHandlerId(null);
                                    handlerUnitIds.add(role.getRoleId());
                                    handlerUnitNames.add(role.getRoleName());
                                }
                            }
                        }
                    }
                    vo.setTaskStatus(TaskStatusEnum.NOT_START);
                    vo.setHandlerId(handlerIds);
                    vo.setHandlerName(handlerNames);
                    vo.setHandlerUnitId(handlerUnitIds);
                    vo.setHandlerUnitName(handlerUnitNames);
                    return vo;
                } else {
                    return null;
@@ -802,6 +885,13 @@
     */
    private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) {
        this.setPromoterInfo(taskVO);
        // 一个任务可能有多个候选人/组,所以需要使用list
        List<Long> handlerIds = new ArrayList<>(2);
        List<String> handlerNames = new ArrayList<>(2);
        List<Long> handlerUnitIds = new ArrayList<>(2);
        List<String> handlerUnitNames = new ArrayList<>(2);
        // 流程处理人信息
        if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) {
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId());
@@ -811,12 +901,12 @@
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerType(HandlerTypeEnum.USER);
                        taskVO.setHandlerId(sysUser.getUserId());
                        handlerIds.add(sysUser.getUserId());
                        handlerNames.add(sysUser.getNickName());
                        if (Objects.nonNull(sysUser.getDept())) {
                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
                            handlerUnitIds.add(sysUser.getDept().getDeptId());
                            handlerUnitNames.add(sysUser.getDept().getDeptName());
                        }
                        taskVO.setHandlerName(sysUser.getNickName());
                    }
                    // 绑定的是角色或者是部门,需要根据id判断
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
@@ -827,20 +917,16 @@
                            // 部门
                            SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                            if (Objects.nonNull(dept)) {
                                taskVO.setHandlerUnitId(dept.getDeptId());
                                taskVO.setHandlerUnitName(dept.getDeptName());
                                taskVO.setHandlerName("暂未处理");
                                taskVO.setHandlerId(null);
                                handlerUnitIds.add(dept.getDeptId());
                                handlerUnitNames.add(dept.getDeptName());
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                            taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                            taskVO.setHandlerName("暂未处理");
                            taskVO.setHandlerId(null);
                            handlerUnitIds.add(role.getRoleId());
                            handlerUnitNames.add(role.getRoleName());
                        }
                    }
                }
@@ -854,8 +940,8 @@
                    if (Objects.nonNull(sysUser)) {
//                        taskVO.setHandlerId(sysUser.getUserId());
                        if (Objects.nonNull(sysUser.getDept())) {
                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
                            handlerUnitIds.add(sysUser.getDept().getDeptId());
                            handlerUnitNames.add(sysUser.getDept().getDeptName());
                        }
//                        taskVO.setHandlerName(sysUser.getNickName());
                    }
@@ -868,24 +954,25 @@
                            // 部门
                            SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                            if (Objects.nonNull(dept)) {
                                taskVO.setHandlerUnitId(dept.getDeptId());
                                taskVO.setHandlerUnitName(dept.getDeptName());
                                handlerUnitIds.add(dept.getDeptId());
                                handlerUnitNames.add(dept.getDeptName());
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                            taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
//                        taskVO.setHandlerName(role.getRoleName());
//                        taskVO.setHandlerId(null);
                            handlerUnitIds.add(role.getRoleId());
                            handlerUnitNames.add(role.getRoleName());
                        }
                    }
                }
            }
        }
        taskVO.setHandlerId(handlerIds);
        taskVO.setHandlerName(handlerNames);
        taskVO.setHandlerUnitId(handlerUnitIds);
        taskVO.setHandlerUnitName(handlerUnitNames);
    }
    /**
business/src/main/resources/mapper/FlowLogMapper.xml
New file
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycl.mapper.FlowLogMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ycl.domain.vo.FlowLogVO">
        <result column="task_id" property="taskId" />
        <result column="event_type" property="eventType" />
        <result column="project_id" property="projectId" />
        <result column="flow_ins_id" property="flowInsId" />
        <result column="user_id" property="userId" />
        <result column="event_data_json" property="eventDataJson" />
    </resultMap>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
            TFL.task_id,
            TFL.event_type,
            TFL.project_id,
            TFL.flow_ins_id,
            TFL.user_id,
            TFL.event_data_json,
            TFL.id
        FROM
            t_flow_log TFL
        WHERE
            TFL.id = #{id} AND TFL.deleted = 0
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT
            TFL.task_id,
            TFL.event_type,
            TFL.project_id,
            TFL.flow_ins_id,
            TFL.user_id,
            TFL.event_data_json,
            TFL.id
        FROM
            t_flow_log TFL
        WHERE
            TFL.deleted = 0
    </select>
</mapper>
common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java
New file
@@ -0,0 +1,33 @@
package com.ycl.common.enums.business;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
/**
 * 流程日志事件类型
 *
 * @author:xp
 * @date:2024/11/29 11:13
 */
@Getter
public enum FlowLogEventTypeEnum {
    DELEGATE("DELEGATE", "转办"),
    FINISHED("FINISHED", "完成"),
    TEAM_WORK("TEAM_WORK", "协同办理"),
    ;
    @EnumValue
    @JsonValue
    private final String value;
    private final String desc;
    FlowLogEventTypeEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}