Browse Source

Merge remote-tracking branch 'origin/master'

平常心 5 months ago
parent
commit
bdeb72566a
26 changed files with 1409 additions and 66 deletions
  1. 12 0
      yudao-module-as/yudao-module-as-api/src/main/java/cn/iocoder/yudao/module/as/aidingstudentscollegemanage/AidingStudentsCollegeManageApi.java
  2. 58 0
      yudao-module-as/yudao-module-as-api/src/main/java/cn/iocoder/yudao/module/as/aidingstudentscollegemanage/dto/AidingStudentsCollegeManageDTO.java
  3. 18 2
      yudao-module-as/yudao-module-as-biz/pom.xml
  4. 224 0
      yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/controller/admin/task/asProcessInstanceController.java
  5. 349 0
      yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/controller/admin/task/asTaskController.java
  6. 2 1
      yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/dal/mysql/aidingstudentspersonmanage/AidingStudentsPersonManageMapper.java
  7. 5 0
      yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/service/aidingstudentspersonmanage/AidingStudentsPersonManageService.java
  8. 7 0
      yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/service/aidingstudentspersonmanage/AidingStudentsPersonManageServiceImpl.java
  9. 230 0
      yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/task/asTaskConvert.java
  10. 2 2
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java
  11. 12 6
      yudao-module-bpm/yudao-module-bpm-biz/pom.xml
  12. 2 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java
  13. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java
  14. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
  15. 3 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
  16. 3 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java
  17. 7 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUndoReqVO.java
  18. 29 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmForCounselorExpression.java
  19. 192 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAidAssistantExpression.java
  20. 57 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignClassMutualExpression.java
  21. 39 21
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignClassSelfExpression.java
  22. 0 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
  23. 21 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
  24. 82 6
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
  25. 11 11
      yudao-module-system/yudao-module-system-biz/pom.xml
  26. 41 3
      yudao-server/pom.xml

+ 12 - 0
yudao-module-as/yudao-module-as-api/src/main/java/cn/iocoder/yudao/module/as/aidingstudentscollegemanage/AidingStudentsCollegeManageApi.java

@@ -0,0 +1,12 @@
+package cn.iocoder.yudao.module.as.aidingstudentscollegemanage;
+
+import cn.iocoder.yudao.module.as.api.aidingstudentscollegemanage.dto.AidingStudentsCollegeManageDTO;
+
+import java.util.Set;
+
+
+public interface AidingStudentsCollegeManageApi {
+
+    AidingStudentsCollegeManageDTO getManageId(String ProcessInstanceId);
+    Set<Long> getAidingStudentsCollegeAssistant(Long collegeId, Long manageId);
+}

+ 58 - 0
yudao-module-as/yudao-module-as-api/src/main/java/cn/iocoder/yudao/module/as/aidingstudentscollegemanage/dto/AidingStudentsCollegeManageDTO.java

@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.as.aidingstudentscollegemanage.dto;
+
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 综测单项 DO
+ *
+ * @author 海绵宝宝
+ */
+@Data
+
+public class AidingStudentsCollegeManageDTO {
+
+    private Long id;
+    /**
+     * 学生提交时间段时间
+     */
+    private LocalDateTime submitTime;
+    /**
+     * 班级民主评议时间段
+     */
+    private LocalDateTime evaluationTime;
+    /**
+     * 学院审核时间段
+     */
+    private LocalDateTime auditTime;
+    /**
+     * 公示时间段
+     */
+    private LocalDateTime publicityTime;
+    /**
+     * 状态值,待发布0,评审中1,公示中2,,已上报3
+     */
+    private Integer comStatus;
+    /**
+     * 项目管理id
+     */
+    private Long manageId;
+    /**
+     * 学院部门id
+     */
+    private Long collegeId;
+    /**
+     * 学院通知文件
+     */
+    private String collegeNoticeFile;
+    /**
+     * 学院通知文件名称
+     */
+    private String collegeNoticeFileName;
+    /**
+     * 上报时间
+     */
+    private LocalDateTime reportingTime;
+}

+ 18 - 2
yudao-module-as/yudao-module-as-biz/pom.xml

@@ -62,8 +62,24 @@
             <version>2.1.0-jdk8-snapshot</version>
             <scope>compile</scope>
         </dependency>
-
-
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-system-biz</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-bpm-biz</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-bpm-biz</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
 
 
     </dependencies>

+ 224 - 0
yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/controller/admin/task/asProcessInstanceController.java

@@ -0,0 +1,224 @@
+package cn.iocoder.yudao.module.as.controller.admin.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.eveProcessInstanceReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.eveProcessInstanceRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
+import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
+import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
+import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请”
+@RestController
+@RequestMapping("/as/process-instance")
+@Validated
+public class asProcessInstanceController {
+
+    @Resource
+    private BpmProcessInstanceService processInstanceService;
+    @Resource
+    private BpmTaskService taskService;
+    @Resource
+    private BpmProcessDefinitionService processDefinitionService;
+    @Resource
+    private BpmCategoryService categoryService;
+
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private DeptApi deptApi;
+
+
+    @GetMapping("/my-page")
+    @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
+    @PreAuthorize("@ss.hasAnyPermissions('eve:task:query','eve:achievement:query')")
+    public CommonResult<PageResult<eveProcessInstanceRespVO>> getProcessInstancePageByLogin(
+            @Valid eveProcessInstanceReqVO pageReqVO) {
+        List<HistoricProcessInstance> hiListResult = processInstanceService.getProcessInstanceList(
+                getLoginUserId(), pageReqVO);
+        if (CollUtil.isEmpty(hiListResult)) {
+            return success(PageResult.empty());
+        }
+        // 拼接返回
+        Map<String, List<Task>> taskMap = taskService.getTaskMapByProcessInstanceIds(
+                convertList(hiListResult, HistoricProcessInstance::getId));
+        Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
+                convertSet(hiListResult, HistoricProcessInstance::getProcessDefinitionId));
+        // 发起人信息
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(hiListResult, processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())));
+        Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
+                convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
+
+
+        List<AchievementDO> achievementList = achievementService.getAchievementByProcessInstanceIds(
+                convertList(hiListResult, HistoricProcessInstance::getId),pageReqVO.getManageId());
+
+
+        List<HistoricProcessInstance>  hiList = new ArrayList<>();
+        List<eveProcessInstanceRespVO> allResults = new ArrayList<>();
+
+        for (HistoricProcessInstance instance : hiListResult) {
+            for (AchievementDO achievement : achievementList) {
+                if (achievement.getProcessInstanceId().equals(instance.getId())) {
+                    hiList.add(instance);
+                    eveProcessInstanceRespVO evpRespVO = BeanUtils.toBean(instance, eveProcessInstanceRespVO.class);
+                    evpRespVO.setAchievementTest(BeanUtils.toBean(achievement, eveProcessInstanceRespVO.Achievement.class));
+                    allResults.add(evpRespVO);
+                }
+            }
+        }
+
+        // 手动实现分页逻辑
+        int total = allResults.size();
+        int hiTotal = hiList.size();
+        int pageSize = pageReqVO.getPageSize();
+        int pageNo = pageReqVO.getPageNo();
+        int fromIndex = Math.min((pageNo - 1) * pageSize, total);
+        int toIndex = Math.min(pageNo * pageSize, total);
+        List<eveProcessInstanceRespVO> pagedResults = allResults.subList(fromIndex, toIndex);
+        List<HistoricProcessInstance> hiResults = hiList.subList(fromIndex, toIndex);
+
+
+        PageResult<eveProcessInstanceRespVO> resultPage = new PageResult<>(pagedResults,(long)total);
+
+        PageResult<HistoricProcessInstance> hiResultPage = new PageResult<>(hiResults,(long)total);
+
+        return success(BpmProcessInstanceConvert.INSTANCE.getProcessInstancePage(hiResultPage,resultPage,
+                processDefinitionMap, taskMap, null,userMap, deptMap));
+    }
+
+    @GetMapping("todo-page")
+    @Operation(summary = "获取 Todo 待办任务分页")
+    @PreAuthorize("@ss.hasPermission('bpm:task:query')")
+    public CommonResult<PageResult<BpmTaskRespVO>> getTaskTodoPage(@Valid BpmTaskPageReqVO pageVO) {
+        PageResult<Task> pageResult = taskService.getTaskTodoPage(WebFrameworkUtils.getLoginUserId(), pageVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty());
+        }
+
+        // 拼接数据
+        Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
+                convertSet(pageResult.getList(), Task::getProcessInstanceId));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
+        return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap));
+    }
+
+    @GetMapping("/user-list")
+    @Operation(summary = "获取学生审批项目", description = "在【我的流程】菜单中,进行调用")
+    @PreAuthorize("@ss.hasAnyPermissions('eve:comprehensive-college-manage:query','eve:task:query','eve:comprehensive-manage:query')")
+    public CommonResult<List<eveProcessInstanceRespVO>> getProcessInstanceMyPage(
+            @Valid eveProcessInstanceReqVO pageReqVO) {
+        List<HistoricProcessInstance> hiListResult = processInstanceService.getProcessInstanceList(
+                pageReqVO.getStartUserId(), pageReqVO);
+        if (CollUtil.isEmpty(hiListResult)) {
+            return success(null);
+        }
+
+        // 拼接返回
+        Map<String, List<Task>> taskMap = taskService.getTaskMapByProcessInstanceIds(
+                convertList(hiListResult, HistoricProcessInstance::getId));
+
+        // 拼接返回
+        Map<String, List<Task>> taskMapUser = taskService.getTaskMapByProcessInstanceIdsAndUser(
+                convertList(hiListResult, HistoricProcessInstance::getId),WebFrameworkUtils.getLoginUserId());
+
+        Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
+                convertSet(hiListResult, HistoricProcessInstance::getProcessDefinitionId));
+
+        // 发起人信息
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(hiListResult, processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())));
+        Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
+                convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
+
+
+        List<HistoricProcessInstance> ListResult = new ArrayList<>();
+
+        List<AchievementDO> achievementList = achievementService.getAchievementByProcessInstanceIds(
+                convertList(hiListResult, HistoricProcessInstance::getId),pageReqVO.getManageId());
+
+        List<eveProcessInstanceRespVO> vpPageResult = new ArrayList<>();
+
+        for (HistoricProcessInstance respVO : hiListResult) {
+            for(AchievementDO achievement : achievementList){
+                if(achievement.getProcessInstanceId().equals(respVO.getId())){
+                    ListResult.add(respVO);
+                    eveProcessInstanceRespVO eveRespVO = BeanUtils.toBean(respVO, eveProcessInstanceRespVO.class);
+                    eveRespVO.setAchievementTest(BeanUtils.toBean(achievement, eveProcessInstanceRespVO.Achievement.class));
+                    vpPageResult.add(eveRespVO);
+                }
+            }
+        }
+        return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceList(ListResult,vpPageResult,
+                processDefinitionMap, taskMap,taskMapUser, userMap, deptMap));
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得指定流程实例", description = "在【流程详细】界面中,进行调用")
+    @Parameter(name = "id", description = "流程实例的编号", required = true)
+    @PreAuthorize("@ss.hasAnyPermissions('eve:task:query','eve:achievement:query')  || @ss.hasAnyRoles('xgcxueshengguanli')")
+    public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
+        HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
+        if (processInstance == null) {
+            return success(null);
+        }
+        // 拼接返回
+        ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(
+                processInstance.getProcessDefinitionId());
+        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
+                processInstance.getProcessDefinitionId());
+        String bpmnXml = BpmnModelUtils.getBpmnXml(
+                processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));
+        AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
+        DeptRespDTO dept = null;
+        if (startUser != null) {
+            dept = deptApi.getDept(startUser.getDeptId());
+        }
+        return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
+                processDefinition, processDefinitionInfo, bpmnXml, startUser, dept));
+    }
+
+
+
+}

+ 349 - 0
yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/controller/admin/task/asTaskController.java

@@ -0,0 +1,349 @@
+package cn.iocoder.yudao.module.as.controller.admin.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.as.controller.admin.aidingstudentspersonmanage.vo.AidingStudentsPersonManageClassPageReqVO;
+import cn.iocoder.yudao.module.as.controller.admin.aidingstudentspersonmanage.vo.AidingStudentsPersonManageUploadRespVO;
+import cn.iocoder.yudao.module.as.dal.dataobject.aidingstudentspersonmanage.AidingStudentsPersonManageDO;
+import cn.iocoder.yudao.module.as.service.aidingstudentspersonmanage.AidingStudentsPersonManageService;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
+import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
+import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import cn.iocoder.yudao.module.as.convert.task.asTaskConvert;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.task.api.Task;
+import org.flowable.task.api.history.HistoricTaskInstance;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
+import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 流程任务实例")
+@RestController
+@RequestMapping("/as/task")
+@Validated
+public class asTaskController {
+
+    @Resource
+    private BpmTaskService taskService;
+    @Resource
+    private BpmProcessInstanceService processInstanceService;
+    @Resource
+    private BpmFormService formService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private DeptApi deptApi;
+    @Resource
+    private AidingStudentsPersonManageService aidingStudentsPersonManageService;
+    @GetMapping("/todo-page-aiding")
+    @Operation(summary = "获取 Todo 综测审批待办任务分页")
+    @PreAuthorize("@ss.hasPermission('eve:task:query')")
+    public CommonResult<List<AidingStudentsPersonManageUploadRespVO>> getTaskTodoPageAiding(@Valid BpmTaskPageReqVO pageVO) {
+        //获取班级id
+        Long deptId = adminUserApi.getUser(getLoginUserId()).getDeptId();
+        //获取所属学院id
+        Long collegeId = deptApi.getCollegeId(deptId);
+
+        //获取我的任务中家困任务的列表
+        List<Task> pageResult = taskService.getTaskTodoPageAidingList(getLoginUserId(), pageVO);
+
+        if (CollUtil.isEmpty(pageResult)) {
+            return success(null);
+        }
+
+        //根据当前任务的idList获取 ,返回关于项目与班级分组的学生材料
+        List<AidingStudentsPersonManageDO> aidingStudentsPersonList =
+                aidingStudentsPersonManageService.getAidingStudentsPersonManageClassPage(
+                        convertList(pageResult,Task::getProcessInstanceId),pageVO
+                );
+
+
+//        //获取任务列表中的家庭经济认定实例,aidingStudentsPersonList
+//        List<AidingStudentsPersonManageUploadRespVO> aidingStudentsPersonList =
+//                aidingStudentsPersonManageService.getAidingStudentsPersonManageClassPage();
+
+
+        Map<Long, ComprehensiveManageDO> comprehensiveManage =
+                comprehensiveManageService.getManagetMap(convertSet(achievementList, AchievementDO::getManageId));
+
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(achievementList, AchievementDO::getUserId));
+        Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
+                convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
+
+        return success(eveTaskConvert.INSTANCE.buildTodoTaskPageComprehensive(
+                userMap,deptMap,comprehensiveManage,achievementList,deptId));
+    }
+
+
+    @GetMapping("/list-by-process-instance-id")
+    @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的")
+    @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
+    @PreAuthorize("@ss.hasAnyPermissions('eve:task:query','eve:achievement:query') || @ss.hasAnyRoles('xgcxueshengguanli')" )
+    public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId(
+            @RequestParam("processInstanceId") String processInstanceId) {
+        List<HistoricTaskInstance> taskList = taskService.getTaskListByProcessInstanceId(processInstanceId);
+        if (CollUtil.isEmpty(taskList)) {
+            return success(Collections.emptyList());
+        }
+
+        // 拼接数据
+        HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
+        // 获得 User 和 Dept Map
+        Set<Long> userIds = convertSetByFlatMap(taskList, task ->
+                Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner())));
+        userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
+        Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
+                convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
+        // 获得 Form Map
+        Map<Long, BpmFormDO> formMap = formService.getFormMap(
+                convertSet(taskList, task -> NumberUtils.parseLong(task.getFormKey())));
+        return success(BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, processInstance,
+                formMap, userMap, deptMap));
+    }
+
+
+    @GetMapping("/done-page-comprehensive")
+    @Operation(summary = "获取 Done 综测审批已办任务分页")
+    @PreAuthorize("@ss.hasPermission('eve:task:query')")
+    public CommonResult<List<AchievementRespVO>> getTaskDonePageComprehensive(@Valid BpmTaskPageReqVO pageVO) {
+        List<HistoricTaskInstance> pageResult = taskService.getTaskDonePageComprehensive(getLoginUserId(), pageVO);
+        if (CollUtil.isEmpty(pageResult)) {
+            return success(null);
+        }
+        List<AchievementDO> achievementList = achievementService.selectByProcessInstanceIdsGroupByUser(
+                convertList(pageResult,HistoricTaskInstance::getProcessInstanceId),pageVO);
+
+        // 移除当前元素
+        achievementList.removeIf(achievementDO -> achievementDO.getUserId().equals(getLoginUserId()));
+
+        Map<Long, ComprehensiveManageDO> comprehensiveManage =
+                comprehensiveManageService.getManagetMap(convertSet(achievementList, AchievementDO::getManageId));
+
+
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(achievementList, AchievementDO::getUserId));
+        Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
+                convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
+        return success(asTaskConvert.INSTANCE.buildTaskComprehensive(achievementList, userMap, deptMap,comprehensiveManage));
+    }
+
+    @GetMapping("done-user-list")
+    @Operation(summary = "获取 Done 综测审批已办任务个人")
+    @PreAuthorize("@ss.hasPermission('eve:task:query')")
+    public CommonResult<List<eveTaskRespVO>>  getTaskDoneByPeople(@Valid  BpmTaskPageReqVO pageVO) {
+
+        Long startUserId = pageVO.getUserId();
+        List<AchievementDO> achievementList
+                = achievementService.getAchievementByPeopleAndManageId(startUserId,pageVO.getManageId());
+
+        Map<String, AchievementDO> achievementDOMap = convertMap(achievementList,AchievementDO::getProcessInstanceId);
+        Collection<String> processInstanceIds = convertSet(achievementList,AchievementDO::getProcessInstanceId);
+
+        List<HistoricTaskInstance> pageResult
+                = taskService.getTaskDoneByPeopleAndProcessInstanceIds(getLoginUserId(), pageVO , processInstanceIds);
+
+        // 使用 Stream API 来处理
+        Map<String, HistoricTaskInstance> latestTasks = pageResult.stream()
+                .collect(Collectors.toMap(
+                        HistoricTaskInstance::getProcessInstanceId,
+                        task -> task,
+                        (existingTask, newTask) -> newTask.getEndTime().after(existingTask.getEndTime()) ? newTask : existingTask
+                ));
+
+        pageResult.removeIf(task -> !latestTasks.get(task.getProcessInstanceId()).equals(task));
+
+
+        if (CollUtil.isEmpty(pageResult)) {
+            return success(null);
+        }
+
+        Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
+                convertSet(pageResult, HistoricTaskInstance::getProcessInstanceId));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
+
+        return success(eveTaskConvert.INSTANCE.buildTaskDoneByPeople(pageResult, processInstanceMap, userMap,achievementDOMap));
+    }
+
+    @PutMapping("/approve")
+    @Operation(summary = "通过单项综测审批")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        taskService.approveTaskAchievement(getLoginUserId(), reqVO);
+        return success(true);
+    }
+
+    @PutMapping("/approve-edit")
+    @Operation(summary = "单项审批修改")
+    @PreAuthorize("@ss.hasPermission('eve:achievement:update')")
+    public CommonResult<Boolean> approveTaskEdit(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        taskService.approveTaskAchievement(getLoginUserId(), reqVO);
+        return success(true);
+    }
+
+    @PutMapping("/approve-people")
+    @Operation(summary = "整体通过综测审批")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> approveTaskByPeople(@Valid @RequestBody List<BpmTaskApproveReqVO> reqVOList) {
+        taskService.approveTaskAchievementByPeople(getLoginUserId(), reqVOList);
+
+        return success(true);
+    }
+
+    @PostMapping("/approve-college-rank")
+    @Operation(summary = "学院针对当前完成互评状态的条目进行审核并发起公示和排名")
+    @PreAuthorize("@ss.hasPermission('eve:comprehensive-college-manage:update')")
+    @Transactional
+    public CommonResult<Boolean> approveTaskAndRankByCollege(@Valid @RequestBody BpmTaskPageReqVO pageVO) {
+        Long deptId = adminUserApi.getUser(getLoginUserId()).getDeptId();
+        Long collegeId =  deptApi.getCollegeId(deptId);
+        DeptRespDTO dept = deptApi.getDept(collegeId);
+        ComprehensiveCollegeManageDO comprehensiveCollegeManage
+                =  comprehensiveCollegeManageService.getComprehensiveCollegeManage(pageVO.getManageId(), collegeId);
+
+        if(comprehensiveCollegeManage.getComStatus() != 1){
+            throw exception(ALREADY_PUBLICIZED);
+        }
+        comprehensiveCollegeManage.setComStatus(2);
+        comprehensiveCollegeManageService.updateComprehensiveCollegeManage(
+                BeanUtils.toBean(comprehensiveCollegeManage, ComprehensiveCollegeManageSaveReqVO.class)
+        );
+        List<Task> pageResult = taskService.getTaskTodoPageComprehensive(getLoginUserId(), pageVO);
+
+        if (CollUtil.isEmpty(pageResult)) {
+            return success(null);
+        }
+
+        List<AchievementDO> achievementList = achievementService.getAchievementByProcessInstanceIds(
+                convertList(pageResult,Task::getProcessInstanceId),pageVO.getManageId());
+
+        List<BpmTaskApproveReqVO> vpPageResult = new ArrayList<>();
+
+        for (Task respVO : pageResult) {
+            for(AchievementDO achievement : achievementList){
+                if(achievement.getProcessInstanceId().equals(respVO.getProcessInstanceId())){
+                    BpmTaskApproveReqVO eveRespVO = BeanUtils.toBean(respVO, BpmTaskApproveReqVO.class);
+                    vpPageResult.add(eveRespVO);
+                }
+            }
+        }
+
+        taskService.approveTaskAchievementByPeople(getLoginUserId(), vpPageResult);
+
+        comprehensiveService.comprehensiveCalculateByCollegeID(
+                collegeId,pageVO.getManageId(),1 , "学院公示"
+        );
+
+        comprehensiveService.comprehensiveRanking(collegeId,dept.getBs(),pageVO.getManageId());
+
+        return success(true);
+    }
+
+    @GetMapping("/approve-college")
+    @Operation(summary = "学院确认(即批量通过当前状态为学院公示的审批)")
+    @PreAuthorize("@ss.hasPermission('eve:comprehensive-college-manage:update')")
+    @Transactional
+    public CommonResult<Boolean> approveTaskByCollege(@Valid BpmTaskPageReqVO pageVO) {
+        List<Task> pageResult = taskService.getTaskTodoPageComprehensive(getLoginUserId(), pageVO);
+        if (CollUtil.isEmpty(pageResult)) {
+            return success(null);
+        }
+        Long deptId = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getDeptId();
+        Long collegeId =  deptApi.getCollegeId(deptId);
+        ComprehensiveCollegeManageDO comprehensiveCollegeManage
+                =  comprehensiveCollegeManageService.getComprehensiveCollegeManage(pageVO.getManageId(), collegeId);
+        if(comprehensiveCollegeManage.getComStatus() != 2){
+            throw exception(PLEASE_START_PUBLICIZED);
+        }
+        comprehensiveCollegeManageService.updateComprehensiveCollegeManage(
+                BeanUtils.toBean(comprehensiveCollegeManage.setComStatus(3), ComprehensiveCollegeManageSaveReqVO.class)
+        );
+        List<AchievementDO> achievementList = achievementService.getAchievementByProcessInstanceIds(
+                convertList(pageResult,Task::getProcessInstanceId),pageVO.getManageId());
+
+        List<BpmTaskApproveReqVO> vpPageResult = new ArrayList<>();
+
+        for (Task respVO : pageResult) {
+            for(AchievementDO achievement : achievementList){
+                if(achievement.getProcessInstanceId().equals(respVO.getProcessInstanceId())){
+                    BpmTaskApproveReqVO eveRespVO = BeanUtils.toBean(respVO, BpmTaskApproveReqVO.class);
+                    vpPageResult.add(eveRespVO);
+                }
+            }
+        }
+        taskService.approveTaskAchievementByPeople(getLoginUserId(), vpPageResult);
+        return success(true);
+    }
+
+    @PutMapping("/reject-update")
+    @Operation(summary = "不通过任务:驳回到审批人处")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> rejectAchievementTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
+        taskService.rejectAchievementTask(getLoginUserId(), reqVO);
+
+        return success(true);
+    }
+
+    @PutMapping("/reject-people-update")
+    @Operation(summary = "整体不通过任务:驳回到审批人处")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> rejectAchievementTaskByPeople(@Valid @RequestBody List<BpmTaskApproveReqVO> reqVOList) {
+        taskService.rejectAchievementTaskByPeople(getLoginUserId(), reqVOList);
+        return success(true);
+    }
+
+    @PutMapping("/reject")
+    @Operation(summary = "不通过任务:直接结束流程")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) {
+        taskService.rejectTask(getLoginUserId(), reqVO);
+        return success(true);
+    }
+
+    @PutMapping("/reject-people")
+    @Operation(summary = "整体不通过综测审批:直接结束流程")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> rejectTaskByPeople(@Valid @RequestBody List<BpmTaskRejectReqVO> reqVOList) {
+        taskService.rejectTaskByPeople(getLoginUserId(), reqVOList);
+        return success(true);
+    }
+
+    @PutMapping("/reject-undo")
+    @Operation(summary = "在下一个人审批前退回审批")
+    @PreAuthorize("@ss.hasPermission('eve:task:update')")
+    public CommonResult<Boolean> rejectUndoTask(@Valid @RequestBody BpmTaskUndoReqVO reqVO) {
+        taskService.UndoTask(getLoginUserId(), reqVO);
+//        taskService.rejectTaskByPeople(getLoginUserId(), reqVOList);
+
+//        return error(400,"改流程不能修改!");
+
+        return success(true);
+    }
+
+}

+ 2 - 1
yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/dal/mysql/aidingstudentspersonmanage/AidingStudentsPersonManageMapper.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.module.as.controller.admin.aidingstudentspersonmanage.vo.AidingStudentPersonManageInfoPageReqVO;
 import cn.iocoder.yudao.module.as.dal.dataobject.aidingstudentspersonmanage.AidingStudentsPersonManageDO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Mapper;
@@ -43,7 +44,7 @@ public interface AidingStudentsPersonManageMapper extends BaseMapperX<AidingStud
      * 查询学院各个班的数量跟申请人数
      * @return
      */
-    List<Map<String, Object>> countByClassName(AidingStudentPersonManageInfoPageReqVO pageReqVO);
+    List<Map<String, Object>> countByClassName(AidingStudentPersonManagerCollegePageReqVO pageReqVO);
 
 
     /**

+ 5 - 0
yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/service/aidingstudentspersonmanage/AidingStudentsPersonManageService.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.as.service.aidingstudentspersonmanage;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.as.controller.admin.aidingstudentspersonmanage.vo.*;
 import cn.iocoder.yudao.module.as.dal.dataobject.aidingstudentspersonmanage.AidingStudentsPersonManageDO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO;
 
 import java.util.List;
 
@@ -32,6 +33,10 @@ public interface AidingStudentsPersonManageService  {
     PageResult<AidingStudentsPersonManageDO> getAidingStudentsPersonManageClassPage(AidingStudentPersonManageInfoPageReqVO pageReqVO);*/
 
 
+    List<AidingStudentsPersonManageDO>  getAidingStudentsPersonManageClassPage(
+            List<String> ids,BpmTaskPageReqVO pageVO
+    );
+
     /**
      * 班主任上传线下讨论结果信息
      * @param classuploadVO

+ 7 - 0
yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/service/aidingstudentspersonmanage/AidingStudentsPersonManageServiceImpl.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.as.dal.dataobject.aidingstudentspersonmanage.Aidi
 import cn.iocoder.yudao.module.as.dal.dataobject.aidingstudentspersonmanage.AidingStudentsPersonManageDO;
 import cn.iocoder.yudao.module.as.dal.mysql.aidingstudentspersonmanage.AidingStudentPersonManageEvaluationResultMapper;
 import cn.iocoder.yudao.module.as.dal.mysql.aidingstudentspersonmanage.AidingStudentsPersonManageMapper;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskPageReqVO;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -219,6 +220,12 @@ public class AidingStudentsPersonManageServiceImpl extends ServiceImpl<AidingStu
         return aidingStudentsPersonManageMapper.selectPage(pageReqVO);
     }*/
 
+    @Override
+    public List<AidingStudentsPersonManageDO>  getAidingStudentsPersonManageClassPage(List<String> ids,
+                                                                               BpmTaskPageReqVO pageVO){
+        return aidingStudentsPersonManageMapper.selectListByProcessInstanceId(ids,pageReqVO);
+    };
+
     /**
      * 定序与建议等级
      * @param ids

+ 230 - 0
yudao-module-as/yudao-module-as-biz/src/main/java/cn/iocoder/yudao/module/as/task/asTaskConvert.java

@@ -0,0 +1,230 @@
+package cn.iocoder.yudao.module.as.task;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
+import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.flowable.task.api.history.HistoricTaskInstance;
+import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
+import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
+
+/**
+ * Bpm 任务 Convert
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface asTaskConvert {
+
+    asTaskConvert INSTANCE = Mappers.getMapper(asTaskConvert.class);
+
+    default PageResult<eveTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult,
+                                                        Map<String, ProcessInstance> processInstanceMap,
+                                                        Map<Long, AdminUserRespDTO> userMap) {
+        return BeanUtils.toBean(pageResult, eveTaskRespVO.class, taskVO -> {
+            ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
+            if (processInstance == null) {
+                return;
+            }
+            taskVO.setProcessInstance(BeanUtils.toBean(processInstance, eveTaskRespVO.ProcessInstance.class));
+            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
+            taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
+        });
+    }
+
+    default List<AchievementRespVO> buildTodoTaskPageComprehensive(Map<Long, AdminUserRespDTO> userMap,
+                                                                   Map<Long, DeptRespDTO> deptMap,
+                                                                   Map<Long, ComprehensiveManageDO> comprehensiveManageDOMap ,
+                                                               List<AchievementDO> achievementList,
+                                                                   Long deptId) {
+
+
+        for (AchievementDO achievement : achievementList) {
+            AdminUserRespDTO startUser = userMap.get(achievement.getUserId());
+            achievement.setStartUser(BeanUtils.toBean(startUser, AchievementDO.User.class));
+            if (startUser != null) {
+                MapUtils.findAndThen(deptMap, startUser.getDeptId(),
+                        dept -> achievement.getStartUser().setDeptName(dept.getName())
+                );
+                MapUtils.findAndThen(deptMap, startUser.getDeptId(),
+                        dept -> achievement.setReviewType(
+                                Objects.equals(deptId, dept.getId()) ? "班级自评" : "班级互评"
+                        )
+                );
+                achievement.getStartUser().setNickname(startUser.getNickname());
+                achievement.setStudentId(startUser.getStudentId());
+            }
+
+            MapUtils.findAndThen(comprehensiveManageDOMap, achievement.getManageId(),
+                    ComprehensiveManage -> achievement.setComprehensiveManage(
+                            BeanUtils.toBean(ComprehensiveManage,AchievementDO.ComprehensiveManage.class))
+            );
+        }
+        return BeanUtils.toBean(achievementList, AchievementRespVO.class);
+    }
+
+
+    default List<AchievementRespVO> buildTaskComprehensive(List<AchievementDO> achievementList,
+                                                    Map<Long, AdminUserRespDTO> userMap,
+                                                    Map<Long, DeptRespDTO> deptMap,
+                                                    Map<Long, ComprehensiveManageDO> comprehensiveManageMap
+                                                    ) {
+
+
+        for (AchievementDO achievement : achievementList) {
+            AdminUserRespDTO startUser = userMap.get(achievement.getUserId());
+            achievement.setStartUser(BeanUtils.toBean(startUser, AchievementDO.User.class));
+            MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> achievement.getStartUser().setDeptName(dept.getName()));
+            achievement.getStartUser().setNickname(startUser.getNickname());
+            achievement.setStudentId(startUser.getStudentId());
+            MapUtils.findAndThen(comprehensiveManageMap, achievement.getManageId(),
+                    ComprehensiveManage -> achievement.setComprehensiveManage(
+                            BeanUtils.toBean(ComprehensiveManage,AchievementDO.ComprehensiveManage.class))
+            );
+        }
+        return BeanUtils.toBean(achievementList, AchievementRespVO.class);
+    }
+
+    default List<eveTaskRespVO> buildTaskDoneByPeople(List<HistoricTaskInstance> pageResult,
+                                                          Map<String, HistoricProcessInstance> processInstanceMap,
+                                                          Map<Long, AdminUserRespDTO> userMap,
+                                                          Map<String, AchievementDO> achievementDOMap
+
+    ) {
+
+        return CollectionUtils.convertList(pageResult, task -> {
+            eveTaskRespVO taskVO = BeanUtils.toBean(task, eveTaskRespVO.class);
+            taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
+            // 流程实例
+            HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
+            if (processInstance != null) {
+                AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
+                taskVO.setProcessInstance(BeanUtils.toBean(processInstance, eveTaskRespVO.ProcessInstance.class));
+                taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
+                AchievementDO achievement = achievementDOMap.get(processInstance.getId());
+                taskVO.setAchievement(BeanUtils.toBean(achievement, AchievementRespVO.class));
+            }
+            return taskVO;
+        });
+    }
+
+    default List<BpmTaskRespVO> buildTaskListByProcessInstanceId(List<HistoricTaskInstance> taskList,
+                                                                 HistoricProcessInstance processInstance,
+                                                                 Map<Long, BpmFormDO> formMap,
+                                                                 Map<Long, AdminUserRespDTO> userMap,
+                                                                 Map<Long, DeptRespDTO> deptMap) {
+        List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(taskList, task -> {
+            BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
+            taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
+            // 流程实例
+            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
+            taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
+            taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
+            // 表单信息
+            BpmFormDO form = MapUtil.get(formMap, NumberUtils.parseLong(task.getFormKey()), BpmFormDO.class);
+            if (form != null) {
+                taskVO.setFormId(form.getId()).setFormName(form.getName()).setFormConf(form.getConf())
+                        .setFormFields(form.getFields()).setFormVariables(FlowableUtils.getTaskFormVariable(task));
+            }
+            // 用户信息
+            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
+            if (assignUser != null) {
+                taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
+                findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName()));
+            }
+            AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner()));
+            if (ownerUser != null) {
+                taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
+                findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName()));
+            }
+            return taskVO;
+        });
+
+        // 拼接父子关系
+        Map<String, List<BpmTaskRespVO>> childrenTaskMap = convertMultiMap(
+                filterList(taskVOList, r -> StrUtil.isNotEmpty(r.getParentTaskId())),
+                BpmTaskRespVO::getParentTaskId);
+        for (BpmTaskRespVO taskVO : taskVOList) {
+            taskVO.setChildren(childrenTaskMap.get(taskVO.getId()));
+        }
+        return filterList(taskVOList, r -> StrUtil.isEmpty(r.getParentTaskId()));
+    }
+
+    default List<BpmTaskRespVO> buildTaskListByParentTaskId(List<Task> taskList,
+                                                            Map<Long, AdminUserRespDTO> userMap,
+                                                            Map<Long, DeptRespDTO> deptMap) {
+        return convertList(taskList, task -> BeanUtils.toBean(task, BpmTaskRespVO.class, taskVO -> {
+            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
+            if (assignUser != null) {
+                taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
+                DeptRespDTO dept = deptMap.get(assignUser.getDeptId());
+                if (dept != null) {
+                    taskVO.getAssigneeUser().setDeptName(dept.getName());
+                }
+            }
+            AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner()));
+            if (ownerUser != null) {
+                taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
+                findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName()));
+            }
+        }));
+    }
+
+    default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser,
+                                                        Task task) {
+        BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO();
+        reqDTO.setProcessInstanceId(processInstance.getProcessInstanceId())
+                .setProcessInstanceName(processInstance.getName()).setStartUserId(startUser.getId())
+                .setStartUserNickname(startUser.getNickname()).setTaskId(task.getId()).setTaskName(task.getName())
+                .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee()));
+        return reqDTO;
+    }
+
+    /**
+     * 将父任务的属性,拷贝到子任务(加签任务)
+     *
+     * 为什么不使用 mapstruct 映射?因为 TaskEntityImpl 还有很多其他属性,这里我们只设置我们需要的。
+     * 使用 mapstruct 会将里面嵌套的各个属性值都设置进去,会出现意想不到的问题。
+     *
+     * @param parentTask 父任务
+     * @param childTask 加签任务
+     */
+    default void copyTo(TaskEntityImpl parentTask, TaskEntityImpl childTask) {
+        childTask.setName(parentTask.getName());
+        childTask.setDescription(parentTask.getDescription());
+        childTask.setCategory(parentTask.getCategory());
+        childTask.setParentTaskId(parentTask.getId());
+        childTask.setProcessDefinitionId(parentTask.getProcessDefinitionId());
+        childTask.setProcessInstanceId(parentTask.getProcessInstanceId());
+//        childTask.setExecutionId(parentTask.getExecutionId()); // TODO 芋艿:新加的,不太确定;尴尬,不加时,子任务不通过会失败(报错);加了,子任务审批通过会失败(报错)
+        childTask.setTaskDefinitionKey(parentTask.getTaskDefinitionKey());
+        childTask.setTaskDefinitionId(parentTask.getTaskDefinitionId());
+        childTask.setPriority(parentTask.getPriority());
+        childTask.setCreateTime(new Date());
+        childTask.setTenantId(parentTask.getTenantId());
+    }
+
+}

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java

@@ -22,8 +22,8 @@ public enum BpmCommentTypeEnum {
     TRANSFER("7", "转派", "[{}]将任务转派给[{}],转派理由为:{}"),
     ADD_SIGN("8", "加签", "[{}]{}给了[{}],理由为:{}"),
     SUB_SIGN("9", "减签", "[{}]操作了【减签】,审批人[{}]的任务被取消"),
-    MODIFICATION("10", "驳回修改", "[{}]操作了【驳回修改】,审批人[{}]的任务被取消")
-    ;
+    MODIFICATION("10", "驳回修改", "[{}]操作了【驳回修改】,审批人[{}]的任务被取消"),
+    UNDO("11", "被撤回", "执行人[{}]的任务【被撤回】") ;
 
     /**
      * 操作类型

+ 12 - 6
yudao-module-bpm/yudao-module-bpm-biz/pom.xml

@@ -80,11 +80,17 @@
             <groupId>org.flowable</groupId>
             <artifactId>flowable-spring-boot-starter-actuator</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-eve-api</artifactId>-->
-<!--            <version>2.1.0-jdk8-snapshot</version>-->
-<!--            <scope>compile</scope>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-eve-api</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-as-api</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java

@@ -96,7 +96,8 @@ public class BpmProcessDefinitionController {
     @Operation(summary = "获得流程定义")
     @Parameter(name = "id", description = "流程编号", required = true, example = "1024")
     @Parameter(name = "key", description = "流程定义标识", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
+    @PreAuthorize("@ss.hasAnyPermissions('bpm:process-definition:query'," +
+            "'eve:task:query','eve:achievement:query','eve:appeal:approval') || @ss.hasAnyRoles('xgcxueshengguanli')")
     public CommonResult<BpmProcessDefinitionRespVO> getProcessDefinition(
             @RequestParam(value = "id", required = false) String id,
             @RequestParam(value = "key", required = false) String key) {

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmActivityController.java

@@ -31,8 +31,8 @@ public class BpmActivityController {
     @Operation(summary = "生成指定流程实例的高亮流程图",
             description = "只高亮进行中的任务。不过要注意,该接口暂时没用,通过前端的 ProcessViewer.vue 界面的 highlightDiagram 方法生成")
     @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:task:query')")
-    public CommonResult<List<BpmActivityRespVO>> getActivityList(
+    @PreAuthorize("@ss.hasAnyPermissions('bpm:task:query','eve:appeal:approval')")
+     public CommonResult<List<BpmActivityRespVO>> getActivityList(
             @RequestParam("processInstanceId") String processInstanceId) {
         return success(activityService.getActivityListByProcessInstanceId(processInstanceId));
     }

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java

@@ -119,7 +119,7 @@ public class BpmProcessInstanceController {
     @GetMapping("/get")
     @Operation(summary = "获得指定流程实例", description = "在【流程详细】界面中,进行调用")
     @Parameter(name = "id", description = "流程实例的编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
+    @PreAuthorize("@ss.hasAnyPermissions('bpm:process-instance:query','eve:task:query','eve:achievement:query','eve:appeal:approval')")
     public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
         HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
         if (processInstance == null) {

+ 3 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java

@@ -157,7 +157,7 @@ public class BpmTaskController {
     @GetMapping("/list-by-process-instance-id")
     @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的")
     @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:task:query')")
+    @PreAuthorize("@ss.hasAnyPermissions('bpm:task:query','eve:appeal:approval')")
     public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId(
             @RequestParam("processInstanceId") String processInstanceId) {
         List<HistoricTaskInstance> taskList = taskService.getTaskListByProcessInstanceId(processInstanceId);
@@ -183,7 +183,7 @@ public class BpmTaskController {
 
     @PutMapping("/approve")
     @Operation(summary = "通过任务")
-    @PreAuthorize("@ss.hasPermission('bpm:task:update')")
+    @PreAuthorize("@ss.hasAnyPermissions('bpm:task:update','eve:appeal:approval')")
     public CommonResult<Boolean> approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
         taskService.approveTask(getLoginUserId(), reqVO);
         return success(true);
@@ -191,7 +191,7 @@ public class BpmTaskController {
 
     @PutMapping("/reject")
     @Operation(summary = "不通过任务")
-    @PreAuthorize("@ss.hasPermission('bpm:task:update')")
+    @PreAuthorize("@ss.hasAnyPermissions('bpm:task:update','eve:appeal:approval')")
     public CommonResult<Boolean> rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) {
         taskService.rejectTask(getLoginUserId(), reqVO);
         return success(true);

+ 3 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java

@@ -32,6 +32,9 @@ public class BpmTaskPageReqVO extends PageParam {
     @Schema(description = "学院ID", example = "123")
     private Long collegeId;
 
+    @Schema(description = "学院ID", example = "123")
+    private Long classId;
+
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;

+ 7 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUndoReqVO.java

@@ -9,16 +9,17 @@ import javax.validation.constraints.NotEmpty;
 @Data
 public class BpmTaskUndoReqVO {
 
-    @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotEmpty(message = "任务编号不能为空")
+
+    private String processInstanceId;
+
     private String id;
 
-    @Schema(description = "撤销到的任务 Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotEmpty(message = "撤销的任务 Key 不能为空")
+
+    private Long userId;
+
+
     private String targetTaskDefinitionKey;
 
-    @Schema(description = "撤销原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回")
-    @NotEmpty(message = "撤销意见不能为空")
     private String reason;
 
 }

+ 29 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmForCounselorExpression.java

@@ -72,6 +72,35 @@ public class BpmForCounselorExpression {
 
         List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
 
+
+        Set<Long> RoleIdSet = getRoleByUserLists(userRespDTOList);
+
+        return RoleIdSet.isEmpty() ? emptySet() : RoleIdSet;
+    }
+
+    //学工管理员
+    public Set<Long> calculateUsersBySchoolAdmin(DelegateExecution execution) {
+
+        // 获得发起人
+        ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
+        Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
+
+        //获得发起人所在的部门
+        DeptRespDTO dept = getStartUserDept(startUserId);
+        if (dept == null) {
+            // 找不到发起人的部门,所以无法使用该规则
+            return emptySet();
+        }
+        //获取所在学院id
+        Long collegeId = deptApi.getCollegeId(dept.getId());
+
+        List<DeptRespDTO> collegeList = deptApi.getChildDeptList(collegeId);
+
+        //根据部门id获取部门内的成员
+        Collection<Long> deptIds = convertSet(collegeList, DeptRespDTO::getId);
+
+        List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
+
         //获取“评审成员”
         Set<Long> RoleIdSet = getRoleByUserLists(userRespDTOList);
 

+ 192 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAidAssistantExpression.java

@@ -0,0 +1,192 @@
+package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.expression;
+
+import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.module.as.api.aidingstudentscollegemanage.AidingStudentsCollegeManageApi;
+import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import cn.iocoder.yudao.module.eve.api.achievement.AchievementApi;
+import cn.iocoder.yudao.module.eve.api.classreviewer.ClassReviewerApi;
+import cn.iocoder.yudao.module.eve.api.classreviewer.DTO.ClassReviewerDTO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import cn.iocoder.yudao.module.system.service.permission.PermissionService;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static java.util.Collections.emptySet;
+
+/**
+ *
+ * 尝试通过部门和岗位获取当前班级的自评小组信息并分配为审批人
+ * @author yzx
+ */
+@Component
+public class BpmTaskAidAssistantExpression {
+
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private DeptApi deptApi;
+
+    @Resource
+    private ClassReviewerApi classReviewerApi;
+
+    @Resource
+    private PermissionService permissionService;
+
+    @Resource
+    private BpmProcessInstanceService processInstanceService;
+
+    @Resource
+    private AchievementApi achievementApi;
+
+    @Resource
+    private AidingStudentsCollegeManageApi aidingStudentsCollegeManageApi;
+    /**
+     * 资助助理
+     * @param execution 流程执行实体
+     * @return 学院资助助理
+     */
+    public Set<Long> calculateUsers(DelegateExecution execution) {
+
+        // 获得发起人
+        ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
+
+        Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
+        Long deptId = adminUserApi.getUser(startUserId).getDeptId();
+        Long collegeId =  deptApi.getCollegeId(deptId);
+        Map<String, Object> variablesMap = processInstance.getProcessVariables();
+        Long manageId = (long)variablesMap.get("manageId");
+        Set<Long> aidAssistant = aidingStudentsCollegeManageApi.getAidingStudentsCollegeAssistant(collegeId,manageId);
+        if(aidAssistant == null){
+            return emptySet();
+        }else{
+            return aidAssistant;
+        }
+    }
+    /**
+     * 资助助理+ 辅导员
+     * @param execution 流程执行实体
+     * @return 学院资助助理 + 辅导员
+     */
+    public Set<Long> calculateUsersForCounselor(DelegateExecution execution) {
+
+        // 获得发起人
+        ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
+
+        Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
+
+        Map<String, Object> variablesMap = processInstance.getProcessVariables();
+        Long manageId = (long)variablesMap.get("manageId");
+
+        //获得发起人所在的部门
+        DeptRespDTO dept = getStartUserDept(startUserId);
+        if (dept == null) {
+            // 找不到发起人的部门,所以无法使用该规则
+            return emptySet();
+        }
+
+        //获取所在学院id
+        Long collegeId = deptApi.getCollegeId(dept.getId());
+
+        List<DeptRespDTO> collegeList = deptApi.getChildDeptList(collegeId);
+
+        //根据部门id获取部门内的成员
+        Collection<Long> deptIds = convertSet(collegeList, DeptRespDTO::getId);
+
+        List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
+
+        //获取“评审成员”
+        Set<Long> RoleIdSet = getRoleByUserLists(userRespDTOList);
+
+        Set<Long> aidAssistant = aidingStudentsCollegeManageApi.getAidingStudentsCollegeAssistant(collegeId,manageId);
+
+        Set<Long> result = new HashSet<>();
+
+        result.addAll(RoleIdSet);
+        result.addAll(aidAssistant);
+
+        if(result.isEmpty()){
+            return emptySet();
+        }else{
+            return result;
+        }
+    }
+
+    /**
+     * 班主任
+     * @param execution 流程执行实体
+     * @return 班主任
+     */
+    public Set<Long> calculateTeacher(DelegateExecution execution) {
+
+        // 获得发起人
+        ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
+
+        Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
+
+        Long deptId = adminUserApi.getUser(startUserId).getDeptId();
+
+        //根据部门id获取部门内的成员
+        Collection<Long> deptIds = new HashSet<>();
+        deptIds.add(deptId);
+        List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
+
+        //获取“班主任”
+        Set<Long> RoleIdSet = getTeacherByUserLists(userRespDTOList);
+
+        if(RoleIdSet.isEmpty()){
+
+            return emptySet();
+
+        }else{
+
+            return RoleIdSet;
+
+        }
+    }
+
+
+    private DeptRespDTO getStartUserDept(Long startUserId) {
+        AdminUserRespDTO startUser = adminUserApi.getUser(startUserId);
+        if (startUser.getDeptId() == null) { // 找不到部门,所以无法使用该规则
+            return null;
+        }
+        return deptApi.getDept(startUser.getDeptId());
+    }
+
+    // 在当前用户列表中筛选出具有“fudaoyuan”角色的用户
+    private  Set<Long> getRoleByUserLists(List<AdminUserRespDTO> userRespDTOList) {
+        Set<Long> RoleIdSet = new HashSet<>();
+        for (AdminUserRespDTO userRespDTO : userRespDTOList) {
+            Long userRespDTOId = userRespDTO.getId();
+            Set<Long> theUserIdList =  permissionService.getUserRoleIdListByUserId(userRespDTOId);
+            boolean contains154 = theUserIdList.contains(156L);
+            if(contains154){
+                RoleIdSet.add(userRespDTO.getId());
+            }
+        }
+        return RoleIdSet;
+    }
+
+    // 在当前用户列表中筛选出具有“fudaoyuan”角色的用户
+    private  Set<Long> getTeacherByUserLists(List<AdminUserRespDTO> userRespDTOList) {
+        Set<Long> RoleIdSet = new HashSet<>();
+        for (AdminUserRespDTO userRespDTO : userRespDTOList) {
+            Long userRespDTOId = userRespDTO.getId();
+            Set<Long> theUserIdList =  permissionService.getUserRoleIdListByUserId(userRespDTOId);
+            boolean contains154 = theUserIdList.contains(156L);
+            if(contains154){
+                RoleIdSet.add(userRespDTO.getId());
+            }
+        }
+        return RoleIdSet;
+    }
+}

+ 57 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignClassMutualExpression.java

@@ -3,7 +3,13 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.expression
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 
+import cn.iocoder.yudao.module.eve.api.achievement.AchievementApi;
+import cn.iocoder.yudao.module.eve.api.achievement.dto.AchievementDTO;
+import cn.iocoder.yudao.module.eve.api.classmutual.ClassMutualApi;
+import cn.iocoder.yudao.module.eve.api.classmutual.dto.ClassMutualDTO;
 
+import cn.iocoder.yudao.module.eve.api.classreviewer.ClassReviewerApi;
+import cn.iocoder.yudao.module.eve.api.classreviewer.DTO.ClassReviewerDTO;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.PostApi;
 import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
@@ -47,9 +53,60 @@ public class BpmTaskAssignClassMutualExpression {
     @Resource
     private BpmProcessInstanceService processInstanceService;
 
+    @Resource
+    private ClassMutualApi classMutualApi;
 
+    @Resource
+    private AchievementApi achievementApi;
 
+    @Resource
+    private ClassReviewerApi classReviewerApi;
+    /**
+     * 计算审批的候选人
+     * @param execution 流程执行实体
+     * @return 班级互评审批人
+     */
+    public Set<Long> calculateUsers(DelegateExecution execution) {
+
+        // 获得发起人
+        ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
+        Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
+        String processInstanceId = processInstance.getProcessInstanceId();
+        Long manageId = achievementApi.getManageId(processInstanceId).getManageId();
+
+        //获得发起人所在的部门
+        DeptRespDTO dept = null;
+        dept = getStartUserDept(startUserId);
+        if (dept == null) {
+            // 找不到发起人的部门,所以无法使用该规则
+            return emptySet();
+        }
+        //获取对应班级
+        ClassMutualDTO reviewClass = classMutualApi.getClassMutualByReviewed(dept.getId(),manageId);
+
+        List<ClassReviewerDTO> ClassReviewerList =
+                classReviewerApi.getClassReviewerByClass(manageId,reviewClass.getReviewClass());
+
+        Long result = ClassReviewerList.stream()
+                .filter(dto -> dto.getClassMutualReviewed().contains(startUserId))
+                .findFirst()
+                .map(ClassReviewerDTO::getUserId)
+                .orElse(null);
+        if(result == null){
+            return emptySet();
+        }
 
+//        //根据部门id获取部门内所有的成员
+//        Collection<Long> deptIds = new ArrayList<>();
+//        deptIds.add(reviewClass.getReviewClass());
+//        List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
+//
+//        //筛选出“评审成员”
+//        Set<Long> RoleIdSet = getRoleByUserLists(userRespDTOList);
+        Set<Long> RoleIdSet = new HashSet<>();
+        RoleIdSet.add(result);
+        return RoleIdSet;
+    }
 
     private DeptRespDTO getStartUserDept(Long startUserId) {
         AdminUserRespDTO startUser = adminUserApi.getUser(startUserId);

+ 39 - 21
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignClassSelfExpression.java

@@ -1,7 +1,9 @@
 package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.expression;
 
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import cn.iocoder.yudao.module.eve.api.achievement.AchievementApi;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.PostApi;
 import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
@@ -15,10 +17,12 @@ import org.flowable.engine.runtime.ProcessInstance;
 import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.util.*;
-
+import cn.iocoder.yudao.module.eve.api.classreviewer.ClassReviewerApi;
 import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static java.util.Collections.emptySet;
-
+import cn.iocoder.yudao.module.eve.api.classreviewer.ClassReviewerApi ;
+import cn.iocoder.yudao.module.eve.api.classreviewer.DTO.ClassReviewerDTO;
 /**
  *
  * 尝试通过部门和岗位获取当前班级的自评小组信息并分配为审批人
@@ -33,10 +37,7 @@ public class BpmTaskAssignClassSelfExpression {
     private DeptApi deptApi;
 
     @Resource
-    private PostApi postApi;
-
-    @Resource
-    private PermissionApi permissionApi;
+    private ClassReviewerApi classReviewerApi;
 
     @Resource
     private PermissionService permissionService;
@@ -44,6 +45,8 @@ public class BpmTaskAssignClassSelfExpression {
     @Resource
     private BpmProcessInstanceService processInstanceService;
 
+    @Resource
+    private AchievementApi achievementApi;
     /**
      * 计算审批的候选人
      * @param execution 流程执行实体
@@ -53,25 +56,40 @@ public class BpmTaskAssignClassSelfExpression {
 
         // 获得发起人
         ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
+
         Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
 
-        //获得发起人所在的部门
-        DeptRespDTO dept = null;
-        dept = getStartUserDept(startUserId);
-        if (dept == null) {
-            // 找不到发起人的部门,所以无法使用该规则
+        Map<String, Object> variablesMap = processInstance.getProcessVariables();
+        Long manageId = (long)variablesMap.get("manageId");
+        List<ClassReviewerDTO> ClassReviewerList = classReviewerApi.getClassReviewer(manageId);
+
+        Long result = ClassReviewerList.stream()
+                .filter(dto -> dto.getReviewed().contains(startUserId))
+                .findFirst()
+                .map(ClassReviewerDTO::getUserId)
+                .orElse(null);
+        if(result == null){
             return emptySet();
         }
+//        //获得发起人所在的部门
+//        DeptRespDTO dept = null;
+//        dept = getStartUserDept(startUserId);
+//        if (dept == null) {
+//            // 找不到发起人的部门,所以无法使用该规则
+//            return emptySet();
+//        }
+//
+//        //根据部门id获取部门内的成员
+//        Collection<Long> deptIds = new ArrayList<Long>();
+//        deptIds.add(dept.getId());
+//        List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
+//
+//        //获取“评审成员”
+//        Set<Long> RoleIdSet = getRoleByUserLists(userRespDTOList);
 
-        //根据部门id获取部门内的成员
-        Collection<Long> deptIds = new ArrayList<Long>();
-        deptIds.add(dept.getId());
-        List<AdminUserRespDTO> userRespDTOList =  adminUserApi.getUserListByDeptIds(deptIds);
-
-        //获取“评审成员”
-        Set<Long> RoleIdSet = getRoleByUserLists(userRespDTOList);
-
-        return RoleIdSet.isEmpty() ? emptySet() : RoleIdSet;
+        Set<Long> RoleIdSet = new HashSet<>();
+        RoleIdSet.add(result);
+        return RoleIdSet;
     }
 
     private DeptRespDTO getStartUserDept(Long startUserId) {
@@ -90,7 +108,7 @@ public class BpmTaskAssignClassSelfExpression {
             Long userRespDTOId = userRespDTO.getId();
             Set<Long> theUserIdList =  permissionService.getUserRoleIdListByUserId(userRespDTOId);
             boolean contains154 = theUserIdList.contains(154L);
-            if(contains154){
+            if(contains154 && !Objects.equals(userRespDTO.getId(), getLoginUserId())){
                 RoleIdSet.add(userRespDTO.getId());
             }
         }

File diff suppressed because it is too large
+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


+ 21 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java

@@ -41,6 +41,16 @@ public interface BpmTaskService {
      */
     List<Task> getTaskTodoPageComprehensive(Long userId, BpmTaskPageReqVO pageReqVO);
 
+
+    /**
+     * 获得待办综测审批的流程任务分页
+     *
+     * @param userId    用户编号
+     * @param pageReqVO 分页请求
+     * @return 流程任务分页
+     */
+    List<Task> getTaskTodoPageAidingList(Long userId, BpmTaskPageReqVO pageReqVO);
+
     /**
      * 获得待办综测审批的流程任务分页
      *
@@ -78,6 +88,15 @@ public interface BpmTaskService {
      */
     List<HistoricTaskInstance> getTaskDoneByPeople(Long userId, BpmTaskPageReqVO pageReqVO);
 
+    /**
+     * 获得已办的流程任务分页根据发起人
+     *
+     * @param userId    用户编号
+     * @param pageReqVO 分页请求
+     * @return 流程任务分页
+     */
+    List<HistoricTaskInstance> getTaskDoneByPeopleAndProcessInstanceIds(Long userId, BpmTaskPageReqVO pageReqVO,Collection<String> processInstanceIds);
+
     /**
      * 获得全部的流程任务分页
      *
@@ -287,7 +306,8 @@ public interface BpmTaskService {
      * @param userId 用户编号
      * @param reqVO  回退的任务key和当前所在的任务ID
      */
-    void UndoTask(Long userId, BpmTaskReturnReqVO reqVO);
+    void UndoTask(Long userId, BpmTaskUndoReqVO reqVO);
+
     /**
      * 获取指定任务的子任务列表
      *

+ 82 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java

@@ -125,6 +125,25 @@ public class BpmTaskServiceImpl implements BpmTaskService {
         }
         return taskQuery.list();
     }
+
+    @Override
+    public List<Task> getTaskTodoPageAidingList(Long userId, BpmTaskPageReqVO pageVO) {
+        TaskQuery taskQuery = taskService.createTaskQuery()
+                .taskAssignee(String.valueOf(userId)) // 分配给自己
+                .processDefinitionKey("familyDifficulties") //流程定义
+                .active()
+                .includeProcessVariables()
+                .orderByTaskCreateTime().desc(); // 创建时间倒序
+        if (StrUtil.isNotBlank(pageVO.getName())) {
+            taskQuery.taskNameLike("%" + pageVO.getName() + "%");
+        }
+        if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
+            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
+            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1]));
+        }
+        return taskQuery.list();
+    }
+
     @Override
     public List<Task> getTaskTodoPageComprehensiveByPeople(Long userId, eveProcessInstanceReqVO pageVO) {
         TaskQuery taskQuery = taskService.createTaskQuery()
@@ -203,7 +222,24 @@ public class BpmTaskServiceImpl implements BpmTaskService {
         }
         return taskQuery.list();
     }
-
+    @Override
+    public List<HistoricTaskInstance> getTaskDoneByPeopleAndProcessInstanceIds(Long userId, BpmTaskPageReqVO pageVO,Collection<String> processInstanceIds) {
+        HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery()
+                .finished() // 已完成
+                .taskAssignee(String.valueOf(userId)) // 分配给自己
+                .processDefinitionKey("comprehensive")
+                .includeTaskLocalVariables()
+                .processInstanceIdIn(processInstanceIds)
+                .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
+        if (StrUtil.isNotBlank(pageVO.getName())) {
+            taskQuery.taskNameLike("%" + pageVO.getName() + "%");
+        }
+        if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
+            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
+            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1]));
+        }
+        return taskQuery.list();
+    }
 
     @Override
     public PageResult<HistoricTaskInstance> getTaskPage(Long userId, BpmTaskPageReqVO pageVO) {
@@ -765,7 +801,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
                 }
                 ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
                 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId()));
-                messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task));
+//                messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task));
             }
 
         });
@@ -865,7 +901,47 @@ public class BpmTaskServiceImpl implements BpmTaskService {
         List<String> runTaskKeyList = convertList(taskList, Task::getTaskDefinitionKey);
         // 1.2 通过 targetElement 的出口连线,计算在 runTaskKeyList 有哪些 key 需要被撤回
         // 为什么不直接使用 runTaskKeyList 呢?因为可能存在多个审批分支,例如说:A -> B -> C 和 D -> F,而只要 C 撤回到 A,需要排除掉 F
-        List<UserTask> returnUserTaskList = BpmnModelUtils.iteratorFindChildUserTasks(targetElement, runTaskKeyList, null, null);
+        List<UserTask> returnUserTaskList = BpmnModelUtils.iteratorFindChildUserTasks(targetElement, runTaskKeyList,
+                null, null);
+        List<String> returnTaskKeyList = convertList(returnUserTaskList, UserTask::getId);
+
+        // 2. 给当前要被回退的 task 数组,设置回退意见
+        taskList.forEach(task -> {
+            // 需要排除掉,不需要设置回退意见的任务
+            if (!returnTaskKeyList.contains(task.getTaskDefinitionKey())) {
+                return;
+            }
+            // 2.1 添加评论
+            taskService.addComment(task.getId(), currentTask.getProcessInstanceId(), BpmCommentTypeEnum.RETURN.getType(),
+                    BpmCommentTypeEnum.RETURN.formatComment(reqVO.getReason()));
+            // 2.2 更新 task 状态 + 原因
+            updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.RETURN.getStatus(), reqVO.getReason());
+        });
+
+        // 3. 执行驳回
+        runtimeService.createChangeActivityStateBuilder()
+                .processInstanceId(currentTask.getProcessInstanceId())
+                .moveActivityIdsToSingleActivityId(returnTaskKeyList, // 当前要跳转的节点列表( 1 或多)
+                        reqVO.getTargetTaskDefinitionKey()) // targetKey 跳转到的节点(1)
+                .changeState();
+    }
+
+    /**
+     * 执行回退逻辑
+     *
+     * @param currentTask   当前回退的任务
+     * @param targetElement 需要回退到的目标任务
+     * @param reqVO         前端参数封装
+     */
+    public void returnTask(Task currentTask, FlowElement targetElement, BpmTaskUndoReqVO reqVO) {
+        // 1. 获得所有需要回撤的任务 taskDefinitionKey,用于稍后的 moveActivityIdsToSingleActivityId 回撤
+        // 1.1 获取所有正常进行的任务节点 Key
+        List<Task> taskList = taskService.createTaskQuery().processInstanceId(currentTask.getProcessInstanceId()).list();
+        List<String> runTaskKeyList = convertList(taskList, Task::getTaskDefinitionKey);
+        // 1.2 通过 targetElement 的出口连线,计算在 runTaskKeyList 有哪些 key 需要被撤回
+        // 为什么不直接使用 runTaskKeyList 呢?因为可能存在多个审批分支,例如说:A -> B -> C 和 D -> F,而只要 C 撤回到 A,需要排除掉 F
+        List<UserTask> returnUserTaskList = BpmnModelUtils.iteratorFindChildUserTasks(targetElement, runTaskKeyList,
+                null, null);
         List<String> returnTaskKeyList = convertList(returnUserTaskList, UserTask::getId);
 
         // 2. 给当前要被回退的 task 数组,设置回退意见
@@ -1096,9 +1172,9 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void UndoTask(Long userId, BpmTaskReturnReqVO reqVO) {
+    public void UndoTask(Long userId, BpmTaskUndoReqVO reqVO) {
         // 1.1 当前任务 task
-        Task task = validateTask(userId, reqVO.getId());
+        Task task = validateTask(reqVO.getUserId(), reqVO.getId());
         if (task.isSuspended()) {
             throw exception(TASK_IS_PENDING);
         }
@@ -1108,7 +1184,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 
         // 2. 调用 Flowable 框架的回退逻辑
         returnTask(task, targetElement, reqVO);
-     }
+    }
 
 
     /**

+ 11 - 11
yudao-module-system/yudao-module-system-biz/pom.xml

@@ -23,11 +23,11 @@
             <artifactId>yudao-module-system-api</artifactId>
             <version>${revision}</version>
         </dependency>
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-module-system-biz</artifactId>
-            <version>${revision}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>cn.iocoder.boot</groupId>-->
+<!--            <artifactId>yudao-module-system-biz</artifactId>-->
+<!--            <version>${revision}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-infra-api</artifactId>
@@ -132,12 +132,12 @@
             <groupId>com.xingyuv</groupId>
             <artifactId>spring-boot-starter-captcha-plus</artifactId> <!-- 验证码,一般用于登录使用 -->
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-eve-api</artifactId>-->
-<!--            <version>2.1.0-jdk8-snapshot</version>-->
-<!--            <scope>compile</scope>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-eve-api</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 41 - 3
yudao-server/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>fdy-server</artifactId>
+    <artifactId>yudao-server</artifactId>
     <packaging>jar</packaging>
 
     <name>${project.artifactId}</name>
@@ -32,19 +32,57 @@
             <version>${revision}</version>
         </dependency>
 
+         <!-- 会员中心。默认注释,保证编译速度 -->
+<!--        <dependency>-->
+<!--            <groupId>cn.iocoder.boot</groupId>-->
+<!--            <artifactId>yudao-module-member-biz</artifactId>-->
+<!--            <version>${revision}</version>-->
+<!--        </dependency>-->
+
+
+        <!-- 数据报表。默认注释,保证编译速度 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-report-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
         <!-- 工作流。默认注释,保证编译速度 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-bpm-biz</artifactId>
             <version>${revision}</version>
         </dependency>
-        <!-- 助学模块。默认注释,保证编译速度 -->
+        <!-- 支付服务。默认注释,保证编译速度 -->
+<!--        <dependency>-->
+<!--            <groupId>cn.iocoder.boot</groupId>-->
+<!--            <artifactId>yudao-module-pay-biz</artifactId>-->
+<!--            <version>${revision}</version>-->
+<!--        </dependency>-->
+
+        <!-- 微信公众号模块。默认注释,保证编译速度 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-module-as-biz</artifactId>
+            <artifactId>yudao-module-mp-biz</artifactId>
             <version>${revision}</version>
         </dependency>
 
+        <!-- 数据报表分析模块。默认注释,保证编译速度 -->
+
+
+        <!-- 综测模块。默认注释,保证编译速度 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-eve-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
+<!--        &lt;!&ndash; 助学模块。默认注释,保证编译速度 &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>cn.iocoder.boot</groupId>-->
+<!--            <artifactId>yudao-module-as-biz</artifactId>-->
+<!--            <version>${revision}</version>-->
+<!--        </dependency>-->
+
 
 
         <!-- spring boot 配置所需依赖 -->

Some files were not shown because too many files changed in this diff