xiangpei
2025-02-12 1a983833a7af79d5ab224fedc627b737e955e9d7
Merge remote-tracking branch 'origin/master'

# Conflicts:
# business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
6个文件已修改
3个文件已添加
240 ■■■■ 已修改文件
business/src/main/java/com/ycl/controller/ProjectProcessController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/form/TaskSuperviseForm.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/json/SuperviseData.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/event/event/TaskLogEvent.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/event/listener/ProcessLogEventListener.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProjectProcessService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/ProcessLogEventTypeEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/SuperviseTypeEnum.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/ProjectProcessController.java
@@ -2,9 +2,7 @@
import com.ycl.common.group.Update;
import com.ycl.common.group.Add;
import com.ycl.domain.form.RejectTaskForm;
import com.ycl.domain.form.TaskDelegationForm;
import com.ycl.domain.form.TaskJumpForm;
import com.ycl.domain.form.*;
import com.ycl.domain.query.TaskQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -20,7 +18,6 @@
import io.swagger.annotations.ApiOperation;
import com.ycl.service.ProjectProcessService;
import com.ycl.common.base.Result;
import com.ycl.domain.form.ProjectProcessForm;
import com.ycl.domain.query.ProjectProcessQuery;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -116,4 +113,10 @@
    }
    @PostMapping("/detail/task/supervise")
    @ApiOperation(value = "督办", notes = "督办")
//    @PreAuthorize("@ss.hasPermi('projectProcess:detail')")
    public Result taskSupervise(@Validated @RequestBody TaskSuperviseForm form) {
        return projectProcessService.taskSupervise(form);
    }
}
business/src/main/java/com/ycl/domain/form/TaskSuperviseForm.java
New file
@@ -0,0 +1,47 @@
package com.ycl.domain.form;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.SuperviseTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
 * 督办表单
 *
 * @author:xp
 * @date:2024/12/13 13:51
 */
@Data
@ApiModel("督办表单")
public class TaskSuperviseForm {
    /**
     * 当前任务id
     *
     */
    @NotBlank(message = "任务id不能为空")
    private String taskId;
    @ApiModelProperty("项目id,用于保存日志")
    private Long projectId;
    @ApiModelProperty("流程实例id,用于保存日志")
    private String processInsId;
    @ApiModelProperty("接收人")
    private List<String> receiverIds;
    @ApiModelProperty("接收人类型")
    private HandlerTypeEnum receiverType;
    @ApiModelProperty("消息类型")
    private SuperviseTypeEnum superviseType;
    @ApiModelProperty("内容")
    @NotBlank(message = "督办内容不能为空")
    private String content;
}
business/src/main/java/com/ycl/domain/json/SuperviseData.java
New file
@@ -0,0 +1,52 @@
package com.ycl.domain.json;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.SuperviseTypeEnum;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * 任务督办的json日志数据
 *
 * @author:xp
 * @date:2025/1/2 14:39
 */
@Data
public class SuperviseData {
    /**
     * 发送人
     */
    private String senderId;
    /**
     * 发送人类型
     */
    private HandlerTypeEnum senderType;
    /**
     * 接收人
     */
    private List<String> receiverIds;
    /**
     * 接收人类型
     */
    private HandlerTypeEnum  receiverType;
    /**
     * 消息类型是 督办 or 回复
     */
    private SuperviseTypeEnum superviseType;
    /**
     * 消息内容
     */
    private String content;
    /**
     * 创建时间
     */
    private Date createTime;
}
business/src/main/java/com/ycl/event/event/TaskLogEvent.java
@@ -15,7 +15,14 @@
@Getter
@Setter
public class TaskLogEvent extends ApplicationEvent {
    /**
     * id
     */
    private Long id;
    /**
     * 用户id
     */
    private Long userId;
    /**
     * 项目id
     */
@@ -51,8 +58,10 @@
     * @param taskId 任务id
     * @param otherData 其它数据
     */
    public TaskLogEvent(Object source, Long projectId, String processInsId, String taskId, ProcessLogEventTypeEnum eventType, Object otherData) {
    public TaskLogEvent(Object source,Long id,Long userId, Long projectId, String processInsId, String taskId, ProcessLogEventTypeEnum eventType, Object otherData) {
        super(source);
        this.id = id;
        this.userId = userId;
        this.projectId = projectId;
        this.processInsId = processInsId;
        this.eventType = eventType;
business/src/main/java/com/ycl/event/listener/ProcessLogEventListener.java
@@ -30,6 +30,7 @@
    @EventListener(classes = {TaskLogEvent.class})
    public void delegate(TaskLogEvent event) {
        ProcessLog log = new ProcessLog();
        if(event.getId()!=null) log.setId(event.getId());
        log.setEventType(event.getEventType());
        log.setProcessInsId(event.getProcessInsId());
        log.setProjectId(event.getProjectId());
@@ -38,7 +39,7 @@
        if (Objects.nonNull(event.getOtherData())) {
            log.setEventDataJson(JSON.toJSONString(event.getOtherData()));
        }
        processLogService.save(log);
        processLogService.saveOrUpdate(log);
    }
business/src/main/java/com/ycl/service/ProjectProcessService.java
@@ -3,10 +3,7 @@
import com.ycl.domain.entity.ProjectProcess;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.common.base.Result;
import com.ycl.domain.form.ProjectProcessForm;
import com.ycl.domain.form.RejectTaskForm;
import com.ycl.domain.form.TaskDelegationForm;
import com.ycl.domain.form.TaskJumpForm;
import com.ycl.domain.form.*;
import com.ycl.domain.query.ProjectProcessQuery;
import com.ycl.domain.query.TaskQuery;
import com.ycl.domain.vo.CustomerTaskVO;
@@ -107,4 +104,6 @@
     * @return
     */
    Result taskJump(TaskJumpForm form);
    Result taskSupervise(TaskSuperviseForm form);
}
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,7 +1,10 @@
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;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
@@ -12,27 +15,24 @@
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.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
import com.ycl.domain.entity.ProcessCoding;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.entity.SysForm;
import com.ycl.domain.entity.*;
import com.ycl.domain.form.TaskDelegationForm;
import com.ycl.domain.form.TaskJumpForm;
import com.ycl.domain.form.TaskSuperviseForm;
import com.ycl.domain.json.DelegateData;
import com.ycl.domain.json.JumpData;
import com.ycl.domain.json.SuperviseData;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.IndexCustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
import com.ycl.event.event.TaskLogEvent;
import com.ycl.mapper.ProjectInfoMapper;
import com.ycl.mapper.ProjectProcessMapper;
import com.ycl.service.IFlowTaskService;
import com.ycl.service.ISysFormService;
import com.ycl.service.ProcessCodingService;
import com.ycl.service.ProjectProcessService;
import com.ycl.service.*;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.domain.form.ProjectProcessForm;
@@ -93,6 +93,7 @@
    private final ProcessCodingService processCodingService;
    private final ApplicationEventPublisher publisher;
    private final ISysDeptService deptService;
    private final ProcessLogService processLogService;
    /**
     * 分页查询
@@ -610,7 +611,7 @@
        jsonData.setAfterHandlerIds(afterHandlerIds);
        jsonData.setAfterHandlerType(form.getPeopleType());
        // 发布转办事件
        publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
        publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
        return Result.ok("转办成功");
    }
@@ -621,7 +622,7 @@
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).processInstanceId(form.getProcessInsId()).singleResult();
        if (Objects.nonNull(task)) {
            // 添加跳过日志
            publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), form.getTaskId(), ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc())));
            publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc())));
            // 查出该任务绑定的表单
            Map<String, Object> data = new HashMap<>(1);
@@ -634,6 +635,37 @@
            // 完成任务
            flowTaskService.completeSubmitForm(form.getTaskId(), data);
        }
        return Result.ok("操作成功");
    }
    @Override
    public Result taskSupervise(TaskSuperviseForm form) {
        SuperviseData jsonData = new SuperviseData();
        jsonData.setCreateTime(new Date());
        jsonData.setContent(form.getContent());
        jsonData.setSenderId(SecurityUtils.getUserId() + "");
        jsonData.setSenderType(HandlerTypeEnum.USER);
        jsonData.setReceiverIds(form.getReceiverIds());
        jsonData.setReceiverType(form.getReceiverType());
        jsonData.setSuperviseType(form.getSuperviseType());
        QueryWrapper<ProcessLog> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("task_id", form.getTaskId());
        queryWrapper.eq("event_type", ProcessLogEventTypeEnum.SUPERVISE);
        queryWrapper.eq("process_ins_id", form.getProcessInsId());
        //查询督办日志
        ProcessLog processLog = processLogService.getOne(queryWrapper);
        List<SuperviseData> dataList;
        if (processLog != null) {
            String eventDataJson = processLog.getEventDataJson();
            dataList = JSONArray.parseArray(eventDataJson, SuperviseData.class);
        } else {
            processLog = new ProcessLog();
            processLog.setUserId(SecurityUtils.getUserId());
            dataList = new ArrayList<>();
        }
        dataList.add(jsonData);
        //添加督办日志
        publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), ProcessLogEventTypeEnum.SUPERVISE, dataList));
        return Result.ok("操作成功");
    }
@@ -758,8 +790,7 @@
                            if (groupId.contains(ProcessConstants.DATA_LAUNCH)) {
                                vo.setHandlerType(HandlerTypeEnum.DEPT);
                                this.varYzReview(vo, projectId, processInsId, HandlerTypeEnum.DEPT);
                            }
                            else if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                            } else if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                                vo.setHandlerType(HandlerTypeEnum.DEPT);
                                String[] split = groupId.split(":");
                                if (split.length > 1) {
@@ -1424,7 +1455,6 @@
        List<UserTask> userTasks = allUserTaskElement.subList(startNum, end);
        // 判断任务状态,构建vo
        List<CustomerTaskVO> vos = new ArrayList<>(48);
        for (UserTask userTask : userTasks) {
@@ -1464,8 +1494,7 @@
                    if (groupId.contains(ProcessConstants.DATA_LAUNCH)) {
                        vo.setHandlerType(HandlerTypeEnum.DEPT);
                        this.varYzReview(vo, projectId, processInsId, HandlerTypeEnum.DEPT);
                    }
                    else if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                    } else if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                        vo.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = groupId.split(":");
                        if (split.length > 1) {
@@ -1698,10 +1727,18 @@
            taskVO.setPromoterName("暂无");
            taskVO.setPromoterUnitName("暂无");
        } else {
            taskVO.setPromoterId(userList.stream().map(user -> { return user.getUserId() + ""; }).collect(Collectors.joining("、")));
            taskVO.setPromoterName(userList.stream().map(user -> { return user.getNickName(); }).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptId() + "";}).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptName() + "";}).collect(Collectors.joining("、")));
            taskVO.setPromoterId(userList.stream().map(user -> {
                return user.getUserId() + "";
            }).collect(Collectors.joining("、")));
            taskVO.setPromoterName(userList.stream().map(user -> {
                return user.getNickName();
            }).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> {
                return user.getDept().getDeptId() + "";
            }).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> {
                return user.getDept().getDeptName() + "";
            }).collect(Collectors.joining("、")));
        }
    }
common/src/main/java/com/ycl/common/enums/business/ProcessLogEventTypeEnum.java
@@ -17,6 +17,7 @@
    FINISHED("FINISHED", "完成"),
    TEAM_WORK("TEAM_WORK", "协同办理"),
    JUMP("JUMP", "跳过"),
    SUPERVISE("SUPERVISE", "督办"),
    ;
common/src/main/java/com/ycl/common/enums/business/SuperviseTypeEnum.java
New file
@@ -0,0 +1,31 @@
package com.ycl.common.enums.business;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
/**
 * 督办类型 督办 or 回复
 *
 * @author:xp
 * @date:2024/11/29 11:13
 */
@Getter
public enum SuperviseTypeEnum {
    SUPERVISE("SUPERVISE", "督办"),
    REPLY("REPLY", "回复"),
    ;
    @EnumValue
    @JsonValue
    private final String value;
    private final String desc;
    SuperviseTypeEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}