fuliqi
2025-01-20 9e28453dba6ecf93c6c2234ba38def7c41cf12f0
Merge remote-tracking branch 'origin/master'

# Conflicts:
# flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
24个文件已修改
3个文件已添加
8 文件已重命名
1个文件已删除
733 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/ProjectInfoController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/json/DelegateData.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/event/event/TaskLogEvent.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/event/listener/ProcessLogEventListener.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/PlanMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/ProjectProcessMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProjectInfoService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/PlanServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/PlanMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/ProjectInfoMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/ProjectProcessMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/ProcessLogEventTypeEnum.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/controller/FlowLogController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/controller/FlowTaskController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/entity/ProcessLog.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/query/ProcessLogQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/vo/ProcessLogVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/mapper/FlowLogMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/IFlowTaskService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/ProcessLogService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/resources/mapper/ProcessLogMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
start/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
system/src/main/java/com/ycl/framework/aspectj/DataScopeAspect.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system/src/main/java/com/ycl/framework/config/SecurityConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system/src/main/java/com/ycl/system/domain/base/AbsQuery.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system/src/main/java/com/ycl/system/service/impl/SysDeptServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/ProjectInfoController.java
@@ -114,7 +114,10 @@
        return Result.ok().data(ProjectCodeGenerator.generateProjectCode());
    }
    ;
    @GetMapping("/searchByKey")
    public Result searchByKey(@RequestParam(required = false) String wordKey) {
        return projectInfoService.searchByKey(wordKey);
    }
    @GetMapping("/getManagerFlag/{recordId}")
    public Result getManagerFlag(@PathVariable("recordId") Integer recordId) {
@@ -169,4 +172,7 @@
    public Result editProject(@RequestBody ProjectForm form) {
        return projectInfoService.editProject(form);
    }
}
business/src/main/java/com/ycl/domain/json/DelegateData.java
File was renamed from business/src/main/java/com/ycl/domain/json/TaskDelegateData.java
@@ -12,7 +12,7 @@
 * @date:2025/1/2 14:39
 */
@Data
public class TaskDelegateData {
public class DelegateData {
    /**
     * 转办前的处理人id
business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java
@@ -97,6 +97,16 @@
    private List<String> handlerUnitName;
    /**
     * 实际处理人id
     */
    private String actualHandlerUserId;
    /**
     * 实际处理人姓名
     */
    private String actualHandlerUserName;
    /**
     * 办理期限
     */
    private String timeLimit;
business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java
@@ -25,6 +25,9 @@
    @ApiModelProperty("流程定义id")
    private String processDefId;
    @ApiModelProperty("发布id")
    private String deployId;
    @ApiModelProperty("流程名称")
    private String flowableProcessName;
business/src/main/java/com/ycl/event/event/TaskLogEvent.java
New file
@@ -0,0 +1,62 @@
package com.ycl.event.event;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
/**
 * 转办事件定义
 *
 * @author:xp
 * @date:2025/1/16 15:04
 */
@Getter
@Setter
public class TaskLogEvent extends ApplicationEvent {
    /**
     * 项目id
     */
    private Long projectId;
    /**
     * 流程实例id
     */
    private String processInsId;
    /**
     * 任务id
     */
    private String taskId;
    /**
     * 事件类型
     */
    private ProcessLogEventTypeEnum eventType;
    /**
     * 其它数据
     * @see com.ycl.domain.json
     */
    private Object otherData;
    /**
     * 构造
     *
     * @param source 传this即可
     * @param projectId 项目id
     * @param processInsId 流程实例id
     * @param taskId 任务id
     * @param otherData 其它数据
     */
    public TaskLogEvent(Object source, Long projectId, String processInsId, String taskId, ProcessLogEventTypeEnum eventType, Object otherData) {
        super(source);
        this.projectId = projectId;
        this.processInsId = processInsId;
        this.eventType = eventType;
        this.taskId = taskId;
        this.otherData = otherData;
    }
}
business/src/main/java/com/ycl/event/listener/ProcessLogEventListener.java
New file
@@ -0,0 +1,41 @@
package com.ycl.event.listener;
import com.alibaba.fastjson2.JSON;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.domain.entity.ProcessLog;
import com.ycl.event.event.TaskLogEvent;
import com.ycl.service.ProcessLogService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
 * @author:xp
 * @date:2025/1/16 15:14
 */
@Component
@RequiredArgsConstructor
public class ProcessLogEventListener {
    private final ProcessLogService processLogService;
    /**
     * 监听流程日志事件
     *
     * @param event 转办的事件内容
     */
    @EventListener(classes = {TaskLogEvent.class})
    public void delegate(TaskLogEvent event) {
        ProcessLog log = new ProcessLog();
        log.setEventType(event.getEventType());
        log.setProcessInsId(event.getProcessInsId());
        log.setProjectId(event.getProjectId());
        log.setTaskId(event.getTaskId());
        log.setUserId(SecurityUtils.getUserId());
        log.setEventDataJson(JSON.toJSONString(event.getOtherData()));
        processLogService.save(log);
    }
}
business/src/main/java/com/ycl/mapper/PlanMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.common.annotation.DataScope;
import com.ycl.domain.entity.Plan;
import com.ycl.domain.query.PlanQuery;
import com.ycl.domain.vo.PlanVO;
@@ -27,6 +28,7 @@
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") PlanQuery query);
    @DataScope(deptAlias = "d")
    IPage getPage(@Param("query") PlanQuery query, IPage page);
}
business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.common.annotation.DataScope;
import com.ycl.common.core.domain.BaseEntity;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.excel.ProjectExcelTemplate;
import com.ycl.domain.query.ProjectInfoQuery;
@@ -31,9 +33,11 @@
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") ProjectInfoQuery query);
    @DataScope(deptAlias = "d")
    IPage getPage(@Param("query") ProjectInfoQuery query, IPage page);
    List<ProjectVO> homeCount();
    @DataScope(deptAlias = "d")
    List<ProjectVO> homeCount(BaseEntity params);
    List<ProjectVO> selectProjectDetailByIds(@Param("dataIdList") List<Long> dataIdList);
business/src/main/java/com/ycl/mapper/ProjectProcessMapper.java
@@ -1,5 +1,6 @@
package com.ycl.mapper;
import com.ycl.common.annotation.DataScope;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,7 +31,8 @@
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") ProjectProcessQuery query);
    @DataScope(deptAlias = "d")
    IPage getPage(@Param("query") ProjectProcessQuery query, IPage page);
    /**
     * 通过流程实例id获取项目id、名称
business/src/main/java/com/ycl/service/ProjectInfoService.java
@@ -90,4 +90,6 @@
    void importProject(MultipartFile file);
    Result editProject(ProjectForm form);
    Result searchByKey(String wordKey);
}
business/src/main/java/com/ycl/service/impl/PlanServiceImpl.java
@@ -105,7 +105,7 @@
    @Override
    public Result page(PlanQuery query) {
        IPage<ProjectPlanResponseVO> page = PageUtil.getPage(query, ProjectPlanResponseVO.class);
        baseMapper.getPage(page, query);
        baseMapper.getPage(query, page);
        // 对分页后的属性进行处理
        List<ProjectPlanResponseVO> records = page.getRecords();
        for (ProjectPlanResponseVO record : records) {
business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java
@@ -7,14 +7,17 @@
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.common.annotation.DataScope;
import com.ycl.common.base.Result;
import com.ycl.common.config.SysConfig;
import com.ycl.common.constant.Constants;
import com.ycl.common.core.domain.BaseEntity;
import com.ycl.common.enums.business.FileTypeEnum;
import com.ycl.common.enums.business.ImportanceTypeEnum;
import com.ycl.common.enums.business.ProjectCategoryEnum;
@@ -234,18 +237,18 @@
        Long userId = SecurityUtils.getUserId();
        String ancestors = sysDeptMapper.selectAncestors(userId);
        String[] ancestorArr = ancestors.split(",");
        for (String ancestor : ancestorArr) {
            if ("101".equals(ancestor)) { // 业主
                query.setCreateBy(userId);
                query.setRole(0);
            }else if ("102".equals(ancestor)){ // 审批
                query.setUsedStatus(1);
                query.setRole(1);
            }
        }
//        for (String ancestor : ancestorArr) {
//            if ("101".equals(ancestor)) { // 业主
//                query.setCreateBy(userId);
//                query.setRole(0);
//            } else if ("102".equals(ancestor)) { // 审批
//                query.setUsedStatus(1);
//                query.setRole(1);
//            }
//        }
        IPage<ProjectInfoVO> page = PageUtil.getPage(query, ProjectInfoVO.class);
        baseMapper.getPage(page, query);
        baseMapper.getPage(query, page);
        List<ProjectInfoVO> records = page.getRecords();
        List<ProjectVO> list = new ArrayList<>();
        records.forEach(vo -> {
@@ -316,7 +319,7 @@
        // {"type":"省重点项目","count":0,"amount":"0.00","text":"省"}]}}
        IndexCountVO indexCountVO = new IndexCountVO();
        List<IndexProPhaseCountVO> proPhaseCountVO = new ArrayList<>();
        List<ProjectVO> projectVOS = baseMapper.homeCount();
        List<ProjectVO> projectVOS = baseMapper.homeCount(new BaseEntity());
        List<ProjectVO> reserve = new ArrayList<>();
        List<ProjectVO> previous = new ArrayList<>();
        List<ProjectVO> implement = new ArrayList<>();
@@ -436,7 +439,7 @@
        ProjectInfo projectInfo = baseMapper.selectById(recordId);
        // 判断当前用户id是否在主管列表中
        String competentDepartment = projectInfo.getCompetentDepartment();
        if (StringUtils.isEmpty(competentDepartment)){
        if (StringUtils.isEmpty(competentDepartment)) {
            return Result.ok().data(false);
        }
        List<String> list = Arrays.asList(competentDepartment.split(","));
@@ -586,7 +589,7 @@
        java.io.File tempDir = null;
        try {
            tempZip = java.io.File.createTempFile("temp", ".zip");
            try(InputStream inputStream = file.getInputStream()) {
            try (InputStream inputStream = file.getInputStream()) {
                Files.copy(inputStream, tempZip.toPath(), StandardCopyOption.REPLACE_EXISTING);
            }
@@ -594,9 +597,9 @@
            try {
                ZipUtil.unzip(tempZip, tempDir, CharsetUtil.CHARSET_UTF_8);
            }catch (IORuntimeException e){
                    log.error("解压失败,尝试使用GBK编码解压...");
                    ZipUtil.unzip(tempZip, tempDir, CharsetUtil.CHARSET_GBK);
            } catch (IORuntimeException e) {
                log.error("解压失败,尝试使用GBK编码解压...");
                ZipUtil.unzip(tempZip, tempDir, CharsetUtil.CHARSET_GBK);
            }
            Path path = tempDir.toPath();
@@ -679,11 +682,11 @@
    @Override
    public Result editProject(ProjectForm form) {
        if (ObjectUtil.isNotNull(form.getProjectInfoForm())){
        if (ObjectUtil.isNotNull(form.getProjectInfoForm())) {
            if (ObjectUtil.isNull(form.getProjectInfoForm().getId())) {
                //新增
                add(form.getProjectInfoForm());
            }else {
            } else {
                //更新
                update(form.getProjectInfoForm());
            }
@@ -691,40 +694,50 @@
        if (ObjectUtil.isNotNull(form.getProjectInvestmentInfoForm())) {
            if (ObjectUtil.isNull(form.getProjectInvestmentInfoForm().getId())) {
                projectInvestmentInfoServiceImpl.add(form.getProjectInvestmentInfoForm());
            }else {
            } else {
                projectInvestmentInfoServiceImpl.update(form.getProjectInvestmentInfoForm());
            }
        }
        if (ObjectUtil.isNotNull(form.getProjectInvestmentFundingForm())) {
            if (ObjectUtil.isNull(form.getProjectInvestmentFundingForm().getId())) {
                projectInvestmentFundingServiceImpl.add(form.getProjectInvestmentFundingForm());
            }else {
            } else {
                projectInvestmentFundingServiceImpl.update(form.getProjectInvestmentFundingForm());
            }
        }
        if (ObjectUtil.isNotNull(form.getProjectInvestmentPolicyComplianceForm())) {
            if (ObjectUtil.isNull(form.getProjectInvestmentPolicyComplianceForm().getId())) {
                projectInvestmentPolicyComplianceServiceImpl.add(form.getProjectInvestmentPolicyComplianceForm());
            }else {
            } else {
                projectInvestmentPolicyComplianceServiceImpl.update(form.getProjectInvestmentPolicyComplianceForm());
            }
        }
        if (ObjectUtil.isNotNull(form.getProjectUnitRegistrationInfoForm())) {
            if (ObjectUtil.isNull(form.getProjectUnitRegistrationInfoForm().getId())) {
                projectUnitRegistrationInfoServiceImpl.add(form.getProjectUnitRegistrationInfoForm());
            }else {
            } else {
                projectUnitRegistrationInfoServiceImpl.update(form.getProjectUnitRegistrationInfoForm());
            }
        }
        if (ObjectUtil.isNotNull(form.getDocumentInfoForm())) {
            if (ObjectUtil.isNull(form.getDocumentInfoForm().getProjectId())){
            if (ObjectUtil.isNull(form.getDocumentInfoForm().getProjectId())) {
                return Result.error("请先保存投资管理基本信息");
            }else {
            } else {
                addDoc(form.getDocumentInfoForm());
            }
        }
        return Result.ok("提交成功");
    }
    @Override
    public Result searchByKey(String wordKey) {
        Wrapper wrapper = null;
        if (!StringUtils.isEmpty(wordKey)) {
            wrapper = Wrappers.<ProjectInfo>lambdaQuery().like(ProjectInfo::getProjectName, wordKey).or().like(ProjectInfo::getProjectCode, wordKey);
        }
        List<ProjectInfo> list = baseMapper.selectList(wrapper);
        return Result.ok().data(list);
    }
    private static void deleteDirectoryOrFile(java.io.File file) {
@@ -742,8 +755,10 @@
        }
        file.delete();
    }
    /**
     * 项目名称校验重复
     *
     * @return
     */
    public void checkProjectNameUnique(ProjectInfo projectInfo) {
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,35 +1,28 @@
package com.ycl.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.core.domain.AjaxResult;
import com.ycl.common.core.domain.entity.SysDept;
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.ProcessLogEventTypeEnum;
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.json.DelegateData;
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.FlowLogService;
import com.ycl.service.ProjectProcessService;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -51,17 +44,15 @@
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.identitylink.api.IdentityLinkInfo;
import org.flowable.identitylink.api.IdentityLinkType;
import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.identitylink.service.impl.persistence.entity.IdentityLinkEntityImpl;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import com.ycl.framework.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.*;
@@ -88,7 +79,7 @@
    private final ISysRoleService sysRoleService;
    private final ISysDeptService sysDeptService;
    private final TaskCommonService taskCommonService;
    private final FlowLogService flowLogService;
    private final ApplicationEventPublisher publisher;
    /**
     * 分页查询
@@ -99,13 +90,14 @@
    @Override
    public Result page(ProjectProcessQuery query) {
        IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class);
        baseMapper.getPage(page, query);
        baseMapper.getPage(query, page);
        for (ProjectProcessVO vo : page.getRecords()) {
            if (Objects.nonNull(vo.getProcessDefId())) {
                ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult();
                if (Objects.nonNull(processDefinition)) {
                    vo.setSuspended(processDefinition.isSuspended());
                    vo.setFlowableProcessName(processDefinition.getName() + "(v" + processDefinition.getVersion() + ")");
                    vo.setDeployId(processDefinition.getDeploymentId());
                }
            }
        }
@@ -155,6 +147,7 @@
        entity.setProcessDefId(processDefId);
        entity.setProcessInsId(processInsId);
        baseMapper.insert(entity);
        return Result.ok("流程启动成功");
    }
@@ -166,6 +159,14 @@
     * @return
     */
    private String startPro(Long projectId, String processDefId) {
        ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                .select(ProjectInfo::getCreateBy)
                .eq(ProjectInfo::getId, projectId)
                .one();
        if (Objects.isNull(project)) {
            throw new RuntimeException("项目不存在");
        }
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId)
                .latestVersion().singleResult();
        if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
@@ -176,6 +177,9 @@
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
        identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
        variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
        // 将该项目的申请人(业主方)作为流程中某些环节的处理人
        variables.put(ProcessConstants.DATA_LAUNCH, project.getCreateBy());
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables);
        return processInstance.getId();
    }
@@ -262,11 +266,18 @@
        TaskQuery taskQuery = taskService.createTaskQuery()
                .active()
                .includeProcessVariables()
                .includeIdentityLinks()
                .orderByTaskCreateTime().desc();
        if (StringUtils.isNotBlank(taskName)) {
            taskQuery.processDefinitionNameLike(taskName);
        }
        if (! SecurityUtils.getLoginUser().getUser().isAdmin()) {
            taskQuery
                    .or()
                    .taskCandidateGroupIn(taskCommonService.getCurrentUserGroups())
                    .taskCandidateUser(SecurityUtils.getUserId() + "")
                    .taskAssignee(SecurityUtils.getUserId() + "")
                    .endOr();
        }
        result.total(taskQuery.count());
        List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize);
@@ -306,7 +317,11 @@
            List<String> handlerUnitNames = new ArrayList<>(2);
            // 流程处理人信息
            List<? extends IdentityLinkInfo> identityLinks = task.getIdentityLinks();
            List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId());
//            Boolean aboutMe = taskCommonService.taskAboutMe(identityLinks);
//            if (! aboutMe) {
//                continue;
//            }
            for (IdentityLinkInfo identityLink : identityLinks) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
@@ -467,20 +482,25 @@
    @Override
    public Result taskDelegation(TaskDelegationForm form) {
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).includeIdentityLinks().singleResult();
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult();
        if (Objects.isNull(task)) {
            throw new RuntimeException("未在运行任务中找到该任务,无法执行转办操作");
        }
        List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
        // 转办之前的处理人
        List<String> beforeHandlerIds = new ArrayList<>(2);
        // 转办之前的处理人类型
        HandlerTypeEnum beforeHandlerType = null;
        // 需要先移除之前的处理人
        for (IdentityLinkInfo identityLink : task.getIdentityLinks()) {
        for (IdentityLinkInfo identityLink : identityLinksForTask) {
            if (StringUtils.isNotBlank(identityLink.getUserId())) {
                beforeHandlerIds.add(identityLink.getUserId());
                beforeHandlerType = HandlerTypeEnum.USER;
                taskService.deleteCandidateUser(task.getId(), identityLink.getUserId());
                if (IdentityLinkType.ASSIGNEE.equals(identityLink.getType())) {
                    taskService.deleteUserIdentityLink(task.getId(), identityLink.getUserId(), IdentityLinkType.ASSIGNEE);
                } else {
                    taskService.deleteCandidateUser(task.getId(), identityLink.getUserId());
                }
            } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                beforeHandlerIds.add(identityLink.getGroupId());
                if (identityLink.getGroupId().contains("dept")) {
@@ -492,7 +512,7 @@
                taskService.deleteCandidateGroup(task.getId(), identityLink.getGroupId());
            }
        }
        TaskDelegateData jsonData = new TaskDelegateData();
        DelegateData jsonData = new DelegateData();
        jsonData.setBeforeHandlerIds(beforeHandlerIds);
        jsonData.setBeforeHandlerType(beforeHandlerType);
@@ -537,8 +557,8 @@
        }
        jsonData.setAfterHandlerIds(afterHandlerIds);
        jsonData.setAfterHandlerType(form.getPeopleType());
        // 添加日志
        flowLogService.add(task.getId(), task.getProcessInstanceId(), FlowLogEventTypeEnum.DELEGATE, form.getProjectId(), JSON.toJSONString(jsonData));
        // 发布转办事件
        publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
        return Result.ok("转办成功");
    }
@@ -567,73 +587,7 @@
        List<CustomerTaskVO> vos = new ArrayList<>();
        for (Task task : taskList) {
            CustomerTaskVO taskVO = new CustomerTaskVO();
            // 当前流程信息
            taskVO.setTaskId(task.getId());
            taskVO.setCreateTime(task.getCreateTime());
            taskVO.setProcessDefId(task.getProcessDefinitionId());
            taskVO.setExecutionId(task.getExecutionId());
            taskVO.setTaskName(task.getName());
            taskVO.setTaskStatus(TaskStatusEnum.TODO);
            // 流程定义信息
            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
                    .processDefinitionId(task.getProcessDefinitionId())
                    .singleResult();
            taskVO.setDeployId(pd.getDeploymentId());
            taskVO.setProcessName(pd.getName());
            taskVO.setProcessInsId(task.getProcessInstanceId());
            taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
            // 流程发起人信息
            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) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        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 (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
                            SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                            if (Objects.nonNull(dept)) {
                                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)) {
                            handlerUnitIds.add(Long.parseLong(identityLink.getGroupId()));
                            handlerUnitNames.add(role.getRoleName());
                        }
                    }
                }
                taskVO.setHandlerId(handlerIds);
                taskVO.setHandlerName(handlerNames);
                taskVO.setHandlerUnitId(handlerUnitIds);
                taskVO.setHandlerUnitName(handlerUnitNames);
            }
            this.setRuntimeTaskInfo(task, taskVO);
            vos.add(taskVO);
        }
        result.put("taskList", vos);
@@ -680,7 +634,10 @@
            vo.setDeployId(process.getDeploymentId());
            vo.setTaskName(userTask.getName());
            vo.setProcessName(process.getProcessDefinitionName());
            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
            Task task = taskService.createTaskQuery()
                    .processInstanceId(process.getId())
                    .taskDefinitionKey(userTask.getId())
                    .singleResult();
            // 一个任务可能有多个候选人/组,所以需要使用list
            List<Long> handlerIds = new ArrayList<>(2);
@@ -744,16 +701,23 @@
                    vo.setTaskId(historicTasks.get(0).getId());
                    vo.setExecutionId(historicTasks.get(0).getExecutionId());
                    vo.setCreateTime(historicTasks.get(0).getStartTime());
                    // 查询实际处理人
                    long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee());
                    SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                    if (Objects.nonNull(handlerUser)) {
                        handlerIds.add(handlerUserId);
                        handlerNames.add(handlerUser.getNickName());
                        vo.setActualHandlerUserId(historicTasks.get(0).getAssignee());
                        vo.setActualHandlerUserName(handlerUser.getNickName());
                    }
                    vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey());
                    this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks());
                }
                vo.setHandlerId(handlerIds);
                vo.setHandlerName(handlerNames);
                vo.setHandlerUnitId(handlerUnitIds);
                vo.setHandlerUnitName(handlerUnitNames);
            } else {
                vo.setTaskStatus(TaskStatusEnum.TODO);
                vo.setTaskId(task.getId());
@@ -762,11 +726,9 @@
                vo.setTaskDefinitionKey(task.getTaskDefinitionKey());
                this.setPromoterAndHandler(vo, null);
                this.setRuntimeTaskInfo(task, vo);
            }
            vo.setHandlerId(handlerIds);
            vo.setHandlerName(handlerNames);
            vo.setHandlerUnitId(handlerUnitIds);
            vo.setHandlerUnitName(handlerUnitNames);
            return vo;
        }).collect(Collectors.toList());
        result.data(vos);
@@ -809,8 +771,8 @@
            SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
            if (Objects.nonNull(handlerUser)) {
                vo.setHandlerId(Arrays.asList(handlerUserId));
                vo.setHandlerName(Arrays.asList(handlerUser.getNickName()));
                vo.setActualHandlerUserId(hisTaskList.get(0).getAssignee());
                vo.setActualHandlerUserName(handlerUser.getNickName());
            }
            vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey());
            this.setPromoterAndHandler(vo, hisTaskList.get(0).getIdentityLinks());
@@ -818,6 +780,85 @@
            return vo;
        }).collect(Collectors.toList());
        return vos;
    }
    /**
     * 设置运行时任务的信息
     *
     * @param task 任务
     * @param taskVO 任务vo
     */
    private void setRuntimeTaskInfo(Task task, CustomerTaskVO taskVO) {
        // 当前流程信息
        taskVO.setTaskId(task.getId());
        taskVO.setCreateTime(task.getCreateTime());
        taskVO.setProcessDefId(task.getProcessDefinitionId());
        taskVO.setExecutionId(task.getExecutionId());
        taskVO.setTaskName(task.getName());
        taskVO.setTaskStatus(TaskStatusEnum.TODO);
        // 流程定义信息
        ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
                .processDefinitionId(task.getProcessDefinitionId())
                .singleResult();
        taskVO.setDeployId(pd.getDeploymentId());
        taskVO.setProcessName(pd.getName());
        taskVO.setProcessInsId(task.getProcessInstanceId());
        taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
        // 流程发起人信息
        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 (IdentityLinkInfo identityLink : identityLinksForTask) {
//            if (StringUtils.isBlank(((IdentityLinkEntityImpl)identityLink).getId())) {
//                continue;
//            }
            // 绑定的是用户,查出用户姓名、部门
            if (StringUtils.isNotBlank(identityLink.getUserId())) {
                taskVO.setHandlerType(HandlerTypeEnum.USER);
                SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                if (Objects.nonNull(sysUser)) {
                    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 (StringUtils.isNotBlank(identityLink.getGroupId())) {
                if (identityLink.getGroupId().startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                    taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                    String[] split = identityLink.getGroupId().split(":");
                    if (split.length > 1) {
                        // 部门
                        SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
                        if (Objects.nonNull(dept)) {
                            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)) {
                        handlerUnitIds.add(Long.parseLong(identityLink.getGroupId()));
                        handlerUnitNames.add(role.getRoleName());
                    }
                }
            }
            taskVO.setHandlerId(handlerIds);
            taskVO.setHandlerName(handlerNames);
            taskVO.setHandlerUnitId(handlerUnitIds);
            taskVO.setHandlerUnitName(handlerUnitNames);
        }
    }
    /**
@@ -871,7 +912,10 @@
            vo.setDeployId(process.getDeploymentId());
            vo.setTaskName(userTask.getName());
            vo.setProcessName(process.getProcessDefinitionName());
            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
            Task task = taskService.createTaskQuery()
                    .processInstanceId(process.getId())
                    .taskDefinitionKey(userTask.getId())
                    .singleResult();
            if (Objects.isNull(task)) {
                // 如果任务在运行时没找到,那么可能为未开始或者已完成,只查询未开始的
                List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
@@ -927,6 +971,8 @@
                } else {
                    continue;
                }
            } else {
                this.setRuntimeTaskInfo(task, vo);
            }
            vos.add(vo);
        }
@@ -979,6 +1025,9 @@
        if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) {
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId());
            for (IdentityLink identityLink : identityLinksForTask) {
                if (StringUtils.isBlank(((IdentityLinkEntityImpl)identityLink).getId())) {
                    continue;
                }
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
@@ -1021,12 +1070,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())) {
                            handlerUnitIds.add(sysUser.getDept().getDeptId());
                            handlerUnitNames.add(sysUser.getDept().getDeptName());
                        }
//                        taskVO.setHandlerName(sysUser.getNickName());
                    }
                    // 绑定的是角色,查出角色名称
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
business/src/main/resources/mapper/PlanMapper.xml
@@ -63,6 +63,7 @@
            pi.invest_type
        FROM t_project_info AS pi
        LEFT JOIN t_plan AS p ON p.project_info_id = pi.id
        LEFT JOIN sys_dept d ON d.dept_id = PI.project_owner_unit
        <where>
            pi.deleted = 0
            <if test="query.projectName!= null and query.projectName!= ''">
@@ -83,6 +84,7 @@
            <if test="query.yearStatus!= null">
                AND p.year_status = #{query.yearStatus}
            </if>
            ${query.params.dataScope}
        </where>
    </select>
business/src/main/resources/mapper/ProjectInfoMapper.xml
@@ -103,6 +103,7 @@
        LEFT JOIN t_project_investment_policy_compliance TPIPC ON TPI.id = TPIPC.project_id and TPIPC.deleted = 0
        LEFT JOIN t_project_unit_registration_info TPURI ON TPI.id = TPURI.project_id and TPURI.deleted = 0
        LEFT JOIN t_project_process TPP ON TPI.id = TPP.project_id and TPP.deleted = 0
        LEFT JOIN sys_dept d ON d.dept_id = TPI.project_owner_unit
        <where>
            TPI.deleted = 0
            <if test="query.projectName !=null and query.projectName!=''">
@@ -164,16 +165,22 @@
                    and TPI.used_status = #{query.usedStatus}
                </if>
            </if>
            ${query.params.dataScope}
        </where>
        order by TPI.gmt_create
    </select>
    <select id="homeCount" resultType="com.ycl.domain.vo.ProjectVO">
    <select id="homeCount" parameterType="com.ycl.common.core.domain.BaseEntity" resultType="com.ycl.domain.vo.ProjectVO">
        SELECT TPI.*,TPIF.total_investment,TPP.process_ins_id as processId
        FROM t_project_info TPI
        LEFT JOIN t_project_investment_funding TPIF ON TPI.id = TPIF.project_id and TPIF.deleted = 0
        LEFT JOIN t_project_process TPP ON TPI.id = TPP.project_id and TPP.deleted = 0
        WHERE TPI.deleted = 0
        LEFT JOIN sys_dept d ON TPI.project_owner_unit = d.dept_id
        <where>
            TPI.deleted = 0
            ${params.dataScope}
        </where>
    </select>
    <select id="selectProjectDetailByIds" resultType="com.ycl.domain.vo.ProjectVO">
business/src/main/resources/mapper/ProjectProcessMapper.xml
@@ -65,6 +65,7 @@
        FROM
            t_project_info PI
                LEFT JOIN t_project_process TPP ON TPP.project_id = PI.id AND TPP.deleted = 0 AND PI.deleted = 0
                LEFT JOIN sys_dept d ON d.dept_id = PI.project_owner_unit
        <where>
            <if test="query.projectName != null and query.projectName != ''">
                AND PI.project_name like concat('%', #{query.projectName}, '%')
@@ -72,6 +73,7 @@
            <if test="query.projectCode != null and query.projectCode != ''">
                AND PI.project_code like concat('%', #{query.projectCode}, '%')
            </if>
            ${query.params.dataScope}
        </where>
    </select>
common/src/main/java/com/ycl/common/enums/business/ProcessLogEventTypeEnum.java
File was renamed from common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java
@@ -11,7 +11,7 @@
 * @date:2024/11/29 11:13
 */
@Getter
public enum FlowLogEventTypeEnum {
public enum ProcessLogEventTypeEnum {
    DELEGATE("DELEGATE", "转办"),
    FINISHED("FINISHED", "完成"),
@@ -26,7 +26,7 @@
    private final String desc;
    FlowLogEventTypeEnum(String value, String desc) {
    ProcessLogEventTypeEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
@@ -70,6 +70,10 @@
     */
    public static final String PROCESS_INITIATOR = "INITIATOR";
    /**
     * 提交数据方
     */
    public static final String DATA_LAUNCH = "data_launch";
    /**
     * 流程跳过
flowable/src/main/java/com/ycl/controller/FlowLogController.java
@@ -1,8 +1,8 @@
package com.ycl.controller;
import com.ycl.common.base.Result;
import com.ycl.domain.query.FlowLogQuery;
import com.ycl.service.FlowLogService;
import com.ycl.domain.query.ProcessLogQuery;
import com.ycl.service.ProcessLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -25,14 +25,14 @@
@RequestMapping("/flow-log")
public class FlowLogController {
    private final FlowLogService flowLogService;
    private final ProcessLogService processLogService;
    @GetMapping("/page")
    @ApiOperation(value = "分页", notes = "分页")
    @PreAuthorize("@ss.hasPermi('flowLog:page')")
    public Result page(FlowLogQuery query) {
        return flowLogService.page(query);
    public Result page(ProcessLogQuery query) {
        return processLogService.page(query);
    }
}
flowable/src/main/java/com/ycl/controller/FlowTaskController.java
@@ -75,8 +75,8 @@
    @ApiOperation(value = "流程历史流转记录", response = FlowTaskDto.class)
    @GetMapping(value = "/flowRecord")
    public AjaxResult flowRecord(String procInsId, String deployId) {
        return flowTaskService.flowRecord(procInsId, deployId);
    public AjaxResult flowRecord(String procInsId) {
        return flowTaskService.flowRecord(procInsId);
    }
    @ApiOperation(value = "根据任务ID查询挂载的表单信息")
@@ -258,13 +258,13 @@
    /**
     * 流程节点信息
     *
     * @param procInsId 流程实例id
     * @param processInsId 流程实例id
     * @return
     */
    @GetMapping("/flowXmlAndNode")
    public AjaxResult flowXmlAndNode(@RequestParam(value = "procInsId", required = false) String procInsId,
    public AjaxResult flowXmlAndNode(@RequestParam(value = "processInsId", required = false) String processInsId,
                                     @RequestParam(value = "deployId", required = false) String deployId) {
        return flowTaskService.flowXmlAndNode(procInsId, deployId);
        return flowTaskService.flowXmlAndNode(processInsId, deployId);
    }
    /**
flowable/src/main/java/com/ycl/domain/entity/ProcessLog.java
File was renamed from flowable/src/main/java/com/ycl/domain/entity/FlowLog.java
@@ -2,7 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ycl.common.enums.business.FlowLogEventTypeEnum;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.system.domain.base.AbsEntity;
import lombok.Data;
@@ -13,8 +13,8 @@
 * @since 2025-01-02
 */
@Data
@TableName("t_flow_log")
public class FlowLog extends AbsEntity {
@TableName("t_process_log")
public class ProcessLog extends AbsEntity {
    private static final long serialVersionUID = 1L;
@@ -24,15 +24,15 @@
    @TableField("event_type")
    /** 事件日志类型 */
    private FlowLogEventTypeEnum eventType;
    private ProcessLogEventTypeEnum eventType;
    @TableField("project_id")
    /** 项目id */
    private Long projectId;
    @TableField("flow_ins_id")
    @TableField("process_ins_id")
    /** 流程实例id */
    private String flowInsId;
    private String processInsId;
    @TableField("user_id")
    /** 产生日志的人/或其它 */
flowable/src/main/java/com/ycl/domain/query/ProcessLogQuery.java
File was renamed from flowable/src/main/java/com/ycl/domain/query/FlowLogQuery.java
@@ -17,6 +17,6 @@
 */
@Data
@ApiModel(value = "FlowLog查询参数", description = "流程日志查询参数")
public class FlowLogQuery extends AbsQuery {
public class ProcessLogQuery extends AbsQuery {
}
flowable/src/main/java/com/ycl/domain/vo/ProcessLogVO.java
File was renamed from flowable/src/main/java/com/ycl/domain/vo/FlowLogVO.java
@@ -1,14 +1,12 @@
package com.ycl.domain.vo;
import com.ycl.system.domain.base.AbsVo;
import com.ycl.domain.entity.FlowLog;
import java.util.List;
import com.ycl.domain.entity.ProcessLog;
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;
/**
 * 流程日志展示
@@ -18,7 +16,7 @@
 */
@Data
@ApiModel(value = "流程日志响应数据", description = "流程日志响应数据")
public class FlowLogVO extends AbsVo {
public class ProcessLogVO extends AbsVo {
    /** 任务id */
    @ApiModelProperty("任务id")
@@ -44,9 +42,9 @@
    @ApiModelProperty("事件数据,根据不同的事件可存储对应的扩展数据。如转办事件可存储转办前后的处理人信息")
    private String eventDataJson;
    public static FlowLogVO getVoByEntity(@NonNull FlowLog entity, FlowLogVO vo) {
    public static ProcessLogVO getVoByEntity(@NonNull ProcessLog entity, ProcessLogVO vo) {
        if(vo == null) {
            vo = new FlowLogVO();
            vo = new ProcessLogVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
flowable/src/main/java/com/ycl/mapper/FlowLogMapper.java
File was deleted
flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java
New file
@@ -0,0 +1,32 @@
package com.ycl.mapper;
import com.ycl.domain.entity.ProcessLog;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.domain.vo.ProcessLogVO;
import com.ycl.domain.query.ProcessLogQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 流程日志 Mapper 接口
 *
 * @author xp
 * @since 2025-01-02
 */
@Mapper
public interface ProcessLogMapper extends BaseMapper<ProcessLog> {
    /**
     * id查找流程日志
     * @param id
     * @return
     */
    ProcessLogVO getById(Long id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") ProcessLogQuery query);
}
flowable/src/main/java/com/ycl/service/IFlowTaskService.java
@@ -145,7 +145,7 @@
     * @param procInsId 流程实例Id
     * @return
     */
    AjaxResult flowRecord(String procInsId,String deployId);
    AjaxResult flowRecord(String procInsId);
    /**
     * 根据任务ID查询挂载的表单信息
flowable/src/main/java/com/ycl/service/ProcessLogService.java
File was renamed from flowable/src/main/java/com/ycl/service/FlowLogService.java
@@ -1,10 +1,10 @@
package com.ycl.service;
import com.ycl.common.enums.business.FlowLogEventTypeEnum;
import com.ycl.domain.entity.FlowLog;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.domain.entity.ProcessLog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.common.base.Result;
import com.ycl.domain.query.FlowLogQuery;
import com.ycl.domain.query.ProcessLogQuery;
import java.util.List;
/**
@@ -13,7 +13,7 @@
 * @author xp
 * @since 2025-01-02
 */
public interface FlowLogService extends IService<FlowLog> {
public interface ProcessLogService extends IService<ProcessLog> {
    /**
     * 添加
@@ -23,7 +23,7 @@
     * @param projectId 项目id
     * @param eventDataJson json扩展内容
     */
    void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Long projectId, String eventDataJson);
    void add(String taskId, String flowInsId, ProcessLogEventTypeEnum eventType, Long projectId, String eventDataJson);
    /**
     * 批量删除
@@ -44,7 +44,7 @@
     * @param query
     * @return
     */
    Result page(FlowLogQuery query);
    Result page(ProcessLogQuery query);
    /**
     * 根据id查找
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -5,10 +5,12 @@
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.domain.entity.SysForm;
import com.ycl.domain.vo.FormDetailVO;
import com.ycl.flow.FindNextNodeUtil;
import com.ycl.service.ISysFormService;
import com.ycl.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
@@ -18,6 +20,8 @@
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.identitylink.api.IdentityLinkType;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.stereotype.Service;
@@ -39,6 +43,7 @@
    private final RepositoryService repositoryService;
    private final TaskService taskService;
    private final HistoryService historyService;
    private final ISysUserService sysUserService;
    /**
     * 通过当前节点定义key,获取其上一个节点的信息,如果前面是并行的会返回多个(包含当前节点)
@@ -272,6 +277,7 @@
     * @param taskId             当前任务id
     * @param msg                审核意见
     */
    @Deprecated
    public void reject(String rejectedTaskDefKey, String rejectTaskDefKey, String processInsId, String taskId, String msg) {
        // 驳回的核心api:runtimeService.createChangeActivityStateBuilder().moveXXX 的api,可以设置从当前节点移动到目标节点
        // 驳回的核心:需要找到当前节点、以及要流转到的目标节点。其中比较麻烦的是处理并行等比较复杂的情况
@@ -294,4 +300,21 @@
    }
    /**
     * 获取当前用户的组
     *
     * @return
     */
    public List<String> getCurrentUserGroups() {
        String deptId = "dept:" + SecurityUtils.getLoginUser().getDeptId();
        List<String> roleIds;
        if (CollectionUtils.isEmpty(SecurityUtils.getLoginUser().getUser().getRoles())) {
            roleIds = new ArrayList<>(1);
        } else {
            roleIds = SecurityUtils.getLoginUser().getUser().getRoles().stream().map(role -> role.getRoleId() + "").collect(Collectors.toList());
        }
        roleIds.add(deptId);
        return roleIds;
    }
}
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -29,7 +29,7 @@
import com.ycl.flow.FindNextNodeUtil;
import com.ycl.flow.FlowableUtils;
import com.ycl.mapper.ProcessCodingMapper;
import com.ycl.service.FlowLogService;
import com.ycl.service.ProcessLogService;
import com.ycl.service.IFlowTaskService;
import com.ycl.service.ISysDeployFormService;
import com.ycl.service.ISysFormService;
@@ -64,7 +64,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
@@ -94,7 +93,7 @@
    private final ISysFormService sysFormService;
    private final TaskCommonService taskCommonService;
    private final ProcessCodingMapper processCodingMapper;
    private final FlowLogService flowLogService;
    private final ProcessLogService processLogService;
    /**
     * 完成审核任务
@@ -144,22 +143,20 @@
                newV.put(task.getTaskDefinitionKey() + "&" + key, variables.get(key));
                //字典里有就放入流程变量中
                if (!CollectionUtils.isEmpty(dictList) && dictList.contains(key)) {
                    processVariables.put(key, variables.get(key));
                    processVariables.put(key,variables.get(key));
                }
            }
        }
        //添加流程变量
        if (!processVariables.isEmpty()) taskService.setVariables(taskId, processVariables);
        if(!processVariables.isEmpty()) taskService.setVariables(taskId,processVariables);
        taskService.addComment(taskId, task.getProcessInstanceId(), FlowComment.SUBMIT.getType(), "完成提交");
        // 判断当前任务是不是转办过的
        Boolean delegation = flowLogService.taskDelegation(task.getProcessInstanceId(), task.getId());
        if (delegation) {
        if (DelegationState.PENDING.equals(task.getDelegationState())) {
            taskService.resolveTask(taskId, newV);
        } else {
            // 先让当前用户认领这个任务
            taskService.claim(taskId, SecurityUtils.getUserId() + "");
            taskService.complete(taskId, newV);
        }
        // 先让当前用户认领这个任务
        taskService.claim(taskId, SecurityUtils.getUserId() + "");
        taskService.complete(taskId, newV);
        return AjaxResult.success("提交成功");
    }
@@ -803,7 +800,7 @@
     * @return
     */
    @Override
    public AjaxResult flowRecord(String procInsId, String deployId) {
    public AjaxResult flowRecord(String procInsId) {
        Map<String, Object> map = new HashMap<String, Object>();
        if (StringUtils.isNotBlank(procInsId)) {
            List<HistoricActivityInstance> list = historyService
@@ -1301,12 +1298,16 @@
                List<JSONObject> oldFields = JSON.parseObject(JSON.toJSONString(formJson.get(ProcessConstants.WIDGET_LIST)), new TypeReference<List<JSONObject>>() {
                });
                // 设置已填写的表单为禁用状态
                if (!CollectionUtils.isEmpty(oldFields)) {
                if(CollectionUtils.isNotEmpty(oldFields)) {
                    // 设置已填写的表单为禁用状态
                    for (JSONObject oldField : oldFields) {
                        JSONObject options = oldField.getJSONObject("options");
                        options.put("disabled", true);
                    }
                    formJson.put(ProcessConstants.WIDGET_LIST, oldFields);
                    newP.put(ProcessConstants.TASK_FORM_KEY, formJson);
                    newP.remove(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY);
                    formDetailVO.setFormJsonObj(newP);
                }
                // TODO 暂时只处理用户任务上的表单
//                if (StringUtils.isNotBlank(task.getFormKey())) {
@@ -1326,10 +1327,7 @@
//                    }
//                    oldFields.addAll(newFields);
//                }
                formJson.put(ProcessConstants.WIDGET_LIST, oldFields);
                newP.put(ProcessConstants.TASK_FORM_KEY, formJson);
                newP.remove(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY);
                formDetailVO.setFormJsonObj(newP);
            }
        }
        return beforeNodes;
flowable/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
File was renamed from flowable/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java
@@ -2,14 +2,14 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
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.enums.business.ProcessLogEventTypeEnum;
import com.ycl.domain.entity.ProcessLog;
import com.ycl.mapper.ProcessLogMapper;
import com.ycl.service.ProcessLogService;
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 com.ycl.domain.vo.ProcessLogVO;
import com.ycl.domain.query.ProcessLogQuery;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@@ -27,9 +27,9 @@
 */
@Service
@RequiredArgsConstructor
public class FlowLogServiceImpl extends ServiceImpl<FlowLogMapper, FlowLog> implements FlowLogService {
public class ProcessLogServiceImpl extends ServiceImpl<ProcessLogMapper, ProcessLog> implements ProcessLogService {
    private final FlowLogMapper flowLogMapper;
    private final ProcessLogMapper processLogMapper;
    /**
     * 添加日志
@@ -40,10 +40,10 @@
     * @param eventDataJson json扩展内容
     */
    @Override
    public void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Long projectId, String eventDataJson) {
        FlowLog log = new FlowLog();
    public void add(String taskId, String flowInsId, ProcessLogEventTypeEnum eventType, Long projectId, String eventDataJson) {
        ProcessLog log = new ProcessLog();
        log.setTaskId(taskId);
        log.setFlowInsId(flowInsId);
        log.setProcessInsId(flowInsId);
        log.setProjectId(projectId);
        log.setEventType(eventType);
        log.setEventDataJson(eventDataJson);
@@ -78,8 +78,8 @@
     * @return
     */
    @Override
    public Result page(FlowLogQuery query) {
        IPage<FlowLogVO> page = PageUtil.getPage(query, FlowLogVO.class);
    public Result page(ProcessLogQuery query) {
        IPage<ProcessLogVO> page = PageUtil.getPage(query, ProcessLogVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
@@ -91,7 +91,7 @@
     */
    @Override
    public Result detail(Long id) {
        FlowLogVO vo = baseMapper.getById(id);
        ProcessLogVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
@@ -102,19 +102,19 @@
     */
    @Override
    public Result all() {
        List<FlowLog> entities = baseMapper.selectList(null);
        List<FlowLogVO> vos = entities.stream()
                .map(entity -> FlowLogVO.getVoByEntity(entity, null))
        List<ProcessLog> entities = baseMapper.selectList(null);
        List<ProcessLogVO> vos = entities.stream()
                .map(entity -> ProcessLogVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    @Override
    public Boolean taskDelegation(String processInstanceId, String taskId) {
        List<FlowLog> list = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(FlowLog::getFlowInsId, processInstanceId)
                .eq(FlowLog::getTaskId, taskId)
                .eq(FlowLog::getEventType, FlowLogEventTypeEnum.DELEGATE)
        List<ProcessLog> list = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProcessLog::getProcessInsId, processInstanceId)
                .eq(ProcessLog::getTaskId, taskId)
                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.DELEGATE)
                .list();
        return CollectionUtils.isNotEmpty(list);
    }
flowable/src/main/resources/mapper/ProcessLogMapper.xml
File was renamed from flowable/src/main/resources/mapper/FlowLogMapper.xml
@@ -1,9 +1,9 @@
<?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">
<mapper namespace="com.ycl.mapper.ProcessLogMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ycl.domain.vo.FlowLogVO">
    <resultMap id="BaseResultMap" type="com.ycl.domain.vo.ProcessLogVO">
        <result column="task_id" property="taskId" />
        <result column="event_type" property="eventType" />
        <result column="project_id" property="projectId" />
@@ -28,7 +28,7 @@
            TFL.event_data_json,
            TFL.id
        FROM
            t_flow_log TFL
            t_process_log TFL
        WHERE
            TFL.id = #{id} AND TFL.deleted = 0
    </select>
@@ -44,7 +44,7 @@
            TFL.event_data_json,
            TFL.id
        FROM
            t_flow_log TFL
            t_process_log TFL
        WHERE
            TFL.deleted = 0
    </select>
start/src/main/resources/application-dev.yml
@@ -7,7 +7,7 @@
    # 版权年份
    copyrightYear: 2024
    # 文件路径 示例( Windows配置D:/projectManagement/uploadPath,Linux配置 /home/projectManagement/uploadPath)
    profile: D:/projectManagement/uploadPath
    profile: E:/ycl/file
    # 获取ip地址开关
    addressEnabled: false
    # 验证码类型 math 数字计算 char 字符验证
system/src/main/java/com/ycl/framework/aspectj/DataScopeAspect.java
@@ -2,6 +2,8 @@
import java.util.ArrayList;
import java.util.List;
import com.ycl.system.domain.base.AbsQuery;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@@ -151,10 +153,12 @@
        if (StringUtils.isNotBlank(sqlString.toString()))
        {
            Object params = joinPoint.getArgs()[0];
            if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
            {
            if (StringUtils.isNotNull(params) && params instanceof BaseEntity) {
                BaseEntity baseEntity = (BaseEntity) params;
                baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
            } else if (StringUtils.isNotNull(params) && params instanceof AbsQuery) {
                AbsQuery query = (AbsQuery) params;
                query.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
            }
        }
    }
system/src/main/java/com/ycl/framework/config/SecurityConfig.java
@@ -115,6 +115,7 @@
                // 静态资源,可匿名访问
                .antMatchers(HttpMethod.GET, "/flowable-ui", "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                .antMatchers("/common/upload").permitAll()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated()
                .and()
system/src/main/java/com/ycl/system/domain/base/AbsQuery.java
@@ -3,6 +3,9 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
 * 基础分页查询,默认第一页,每页10条
 *
@@ -18,4 +21,6 @@
    @ApiModelProperty(value = "每页条数", required = true)
    private long pageSize = 10L;
    public Map<String, Object> params = new HashMap<>(2);
}
system/src/main/java/com/ycl/system/service/impl/SysDeptServiceImpl.java
@@ -65,7 +65,7 @@
    @Override
    public List<StringTreeSelect> flowDeptTree(SysDept dept) {
        List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
        List<SysDept> depts = deptMapper.selectDeptList(dept);
        List<StringTreeSelect> list = depts.stream().map(item -> {
            StringTreeSelect d = new StringTreeSelect();
            d.setId("dept:" + item.getDeptId());