xiangpei
2025-02-18 91dc0135a3e89e3a54866d184743e305ee54ce26
发起协同办理
6个文件已修改
3个文件已添加
252 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/ProjectProcessController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/json/TeamWorkData.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProcessLogService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProjectProcessService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/ProjectProcessController.java
@@ -120,6 +120,13 @@
        return projectProcessService.taskSupervise(form);
    }
    @PostMapping("/detail/task/teamwork")
    @ApiOperation(value = "发起协同办理", notes = "发起协同办理")
//    @PreAuthorize("@ss.hasPermi('projectProcess:detail')")
    public Result taskTeamwork(@Validated @RequestBody TaskTeamWorkForm form) {
        return projectProcessService.taskTeamwork(form);
    }
    @PostMapping("/detail/task/hangup")
    @ApiOperation(value = "挂起任务", notes = "挂起任务")
//    @PreAuthorize("@ss.hasPermi('projectProcess:detail')")
business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java
New file
@@ -0,0 +1,54 @@
package com.ycl.domain.form;
import com.ycl.common.enums.business.HandlerTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
 * @author:xp
 * @date:2024/12/13 13:51
 */
@Data
@ApiModel("任务协同办理表单")
public class TaskTeamWorkForm {
    /**
     * 当前任务id
     *
     */
    @ApiModelProperty("任务id")
    private String taskId;
    @ApiModelProperty("项目id")
    private Long projectId;
    /**
     * 流程实例id
     *
     */
    @ApiModelProperty("流程实例id")
    private String processInsId;
    /**
     * 协同人类型
     */
    @ApiModelProperty("协同人类型")
    private HandlerTypeEnum handlerType;
    /**
     * 协同人id
     */
    @ApiModelProperty("协同人id")
    private List<Long> handlerIds;
    /**
     * 表单信息
     */
    @ApiModelProperty("表单信息")
    private Map<String, Object> variables;
}
business/src/main/java/com/ycl/domain/json/TeamWorkData.java
New file
@@ -0,0 +1,38 @@
package com.ycl.domain.json;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.TeamWorkStatusEnum;
import lombok.Data;
import java.util.List;
/**
 * 协同办理数据
 *
 * @author:xp
 * @date:2025/2/18 14:55
 */
@Data
public class TeamWorkData {
    /**
     * 协同人类型
     */
    private HandlerTypeEnum handlerType;
    /**
     * 协同人id
     */
    private List<Long> handlerIds;
    /**
     * 状态
     */
    private TeamWorkStatusEnum status;
    public TeamWorkData(HandlerTypeEnum handlerType, List<Long> handlerIds, TeamWorkStatusEnum status) {
        this.handlerType = handlerType;
        this.handlerIds = handlerIds;
        this.status = status;
    }
}
business/src/main/java/com/ycl/service/ProcessLogService.java
@@ -79,6 +79,15 @@
    Boolean taskIsHangup(String taskId, String processInsId);
    /**
     * 检查任务是否协同办理了
     *
     * @param taskId 任务id
     * @param processInsId 流程实例id
     * @return   true 协同办理了   false没协同办理
     */
    Boolean taskIsTeamwork(String taskId, String processInsId);
    /**
     * 流程推进日志
     *
     * @param query
business/src/main/java/com/ycl/service/ProjectProcessService.java
@@ -128,4 +128,12 @@
     * @return
     */
    Result cancelTaskHangup(TaskHangupForm form);
    /**
     * 任务发起协同办理
     *
     * @param form
     * @return
     */
    Result taskTeamwork(TaskTeamWorkForm form);
}
business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
@@ -148,6 +148,21 @@
    }
    @Override
    public Boolean taskIsTeamwork(String taskId, String processInsId) {
        ProcessLog log = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProcessLog::getProcessInsId, processInsId)
                .eq(ProcessLog::getTaskId, taskId)
                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.TEAM_WORK)
                .one();
        if (Objects.isNull(log)) {
            return Boolean.FALSE;
        } else {
            // 判断协同人是否全部完成了协同。TODO
        }
        return null;
    }
    @Override
    public Result projectProcessLogPage(ProcessLogQuery query) {
        List<ProcessLogVO> list = baseMapper.projectProcessLogPage(query);
        // json反序列化
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,7 +1,6 @@
package com.ycl.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -11,20 +10,15 @@
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.constant.ProcessOverTimeConstants;
import com.ycl.common.core.domain.entity.SysDept;
import com.ycl.common.core.domain.entity.SysDictData;
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.common.enums.business.SuperviseTypeEnum;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.enums.business.*;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
import com.ycl.domain.entity.*;
import com.ycl.domain.form.*;
import com.ycl.domain.json.DelegateData;
import com.ycl.domain.json.HangupData;
import com.ycl.domain.json.JumpData;
import com.ycl.domain.json.SuperviseData;
import com.ycl.domain.json.*;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.IndexCustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
@@ -38,6 +32,7 @@
import com.ycl.domain.query.ProjectProcessQuery;
import com.ycl.service.common.TaskCommonService;
import com.ycl.system.service.ISysDeptService;
import com.ycl.system.service.ISysDictTypeService;
import com.ycl.system.service.ISysRoleService;
import com.ycl.system.service.ISysUserService;
import lombok.Synchronized;
@@ -93,6 +88,7 @@
    private final ApplicationEventPublisher publisher;
    private final ISysDeptService deptService;
    private final ProcessLogService processLogService;
    private final ISysDictTypeService dictTypeService;
    /**
     * 分页查询
@@ -167,10 +163,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result startProcess(Long projectId, String processDefId) {
        ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                .select(ProjectInfo::getCreateBy)
                .eq(ProjectInfo::getId, projectId)
                .one();
        ProjectInfo project = projectInfoMapper.selectById(projectId);
        if (Objects.isNull(project)) {
            throw new RuntimeException("项目不存在");
        }
@@ -731,6 +724,51 @@
        return Result.ok("操作成功");
    }
    @Override
    public Result taskTeamwork(TaskTeamWorkForm form) {
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult();
        if (Objects.isNull(task)) {
            return Result.error("任务不存在");
        }
        ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper)
                .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId())
                .eq(ProjectProcess::getProcessDefId, task.getProcessDefinitionId())
                .one();
        if (Objects.isNull(projectProcess)) {
            return Result.error("项目流程未绑定");
        }
        // 1. 保存发起人填写的表单数据,但不直接完成该任务。提交后任务处理人必须等到协同人处理完之后才能完成任务
        Map<String, Object> processVariables = new HashMap<>();
        //查出字典中需要注入的字段信息
        List<String> dictList = dictTypeService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList());
        Map<String, Object> newV = new HashMap<>(2);
        if (!org.springframework.util.CollectionUtils.isEmpty(form.getVariables())) {
            for (String key : form.getVariables().keySet()) {
                newV.put(task.getTaskDefinitionKey() + "&" + key, form.getVariables().get(key));
                //字典里有就放入流程变量中
                if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(dictList) && dictList.contains(key)) {
                    processVariables.put(key,form.getVariables().get(key));
                }
            }
        }
        if( !processVariables.isEmpty() ) {
            taskService.setVariables(form.getTaskId(), processVariables);
        }
        // 2. 保存日志
        publisher.publishEvent(new TaskLogEvent(this,
                null,
                SecurityUtils.getUserId(),
                form.getProjectId(),
                form.getProcessInsId(),
                form.getTaskId(),
                task.getName(),
                ProcessLogEventTypeEnum.TEAM_WORK,
                new TeamWorkData(form.getHandlerType(), form.getHandlerIds(), TeamWorkStatusEnum.NOT_FINISHED)
        ));
        return Result.ok("操作成功");
    }
    /**
     * 查询待办任务
     *
common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java
New file
@@ -0,0 +1,29 @@
package com.ycl.common.enums.business;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
/**
 * 协同办理状态
 *
 * @author:xp
 * @date:2024/11/29 11:13
 */
@Getter
public enum TeamWorkStatusEnum {
    NOT_FINISHED("NOT_FINISHED", "未开始"),
    FINISHED("FINISHED", "已完成"),
    ;
    private final String value;
    @JsonValue
    private final String desc;
    TeamWorkStatusEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.core.domain.entity.SysDictData;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
import com.ycl.common.enums.business.TaskStatusEnum;
@@ -10,6 +11,8 @@
import com.ycl.domain.vo.FormDetailVO;
import com.ycl.flow.FindNextNodeUtil;
import com.ycl.service.ISysFormService;
import com.ycl.system.service.ISysDictDataService;
import com.ycl.system.service.ISysDictTypeService;
import com.ycl.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.flowable.bpmn.model.*;
@@ -44,6 +47,7 @@
    private final TaskService taskService;
    private final HistoryService historyService;
    private final ISysUserService sysUserService;
    private final ISysDictTypeService sysDictDService;
    /**
     * 通过当前节点定义key,获取其上一个节点的信息,如果前面是并行的会返回多个(包含当前节点)
@@ -324,4 +328,28 @@
        return roleIds;
    }
    /**
     * 处理流程中的变量
     *
     * @param variables
     * @param taskDefKey
     * @return
     */
    public Map<String, Object> handleVar(Map<String, Object> variables, String taskDefKey) {
        Map<String, Object> processVariables = new HashMap<>();
        //查出字典中需要注入的字段信息
        List<String> dictList = sysDictDService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList());
        Map<String, Object> newV = new HashMap<>(2);
        if (!org.springframework.util.CollectionUtils.isEmpty(variables)) {
            for (String key : variables.keySet()) {
                newV.put(taskDefKey + "&" + key, variables.get(key));
                //字典里有就放入流程变量中
                if (!org.apache.commons.collections4.CollectionUtils.isEmpty(dictList) && dictList.contains(key)) {
                    processVariables.put(key,variables.get(key));
                }
            }
        }
        return processVariables;
    }
}