Browse Source

getMyProcessPage

fanxp 1 year ago
parent
commit
a81da1585a

+ 39 - 0
src/main/java/com/xjrsoft/common/enums/GenderEnum.java

@@ -0,0 +1,39 @@
+package com.xjrsoft.common.enums;
+
+public enum GenderEnum {
+    /**
+     * 男
+     */
+    MALE(1, "男"),
+    /**
+     * 女
+     */
+    FEMALE(2, "女");
+
+    final int code;
+    final String value;
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    public static String getValue(int code) {
+        for (GenderEnum item : values()) {
+            if (item.getCode() == code) {
+                return  item.getValue();
+            }
+        }
+        return null;
+    }
+
+    GenderEnum(final int code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+
+
+}

+ 44 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfScholarshipNode.java

@@ -0,0 +1,44 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.oa.service.IFileReceiveService;
+import com.xjrsoft.module.oa.utils.SendMessageUtil;
+import com.xjrsoft.module.student.service.IBaseStudentScholarshipApplicantService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+
+/**
+ * 申请奖学金流程数据赋值
+ */
+@Component("wf_scholarship_node")
+public class WfScholarshipNode extends NodeComponent {
+    @Autowired
+    private IBaseStudentScholarshipApplicantService scholarshipApplicantService;
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Map<String,Object> form = util.getFormData(params);
+        assert form != null;
+        form.put("class_name","123123123123");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            CompletableFuture.runAsync(() -> {
+                try {
+                    Thread.sleep(1000*30); // 暂停1分钟
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+                scholarshipApplicantService.processDataHandler(formId);
+                System.out.println("执行完成");
+            });
+        }
+    }
+}

+ 2 - 2
src/main/java/com/xjrsoft/module/student/entity/BaseStudentScholarshipApplicant.java

@@ -94,9 +94,9 @@ public class BaseStudentScholarshipApplicant implements Serializable {
     @ApiModelProperty("学期Id")
     private String baseSemesterId;
     /**
-    * 入学名称
+    * 年级名称
     */
-    @ApiModelProperty("入学名称")
+    @ApiModelProperty("年级名称")
     private String gradeName;
     /**
     * 班级名称

+ 7 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentMapper.java

@@ -2,6 +2,8 @@ package com.xjrsoft.module.student.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.student.entity.BaseStudent;
+import com.xjrsoft.module.student.vo.BaseStudentAssessmentInspectionMobileVo;
+import com.xjrsoft.module.student.vo.StudentInfoVo;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -12,4 +14,9 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface BaseStudentMapper extends MPJBaseMapper<BaseStudent> {
+    /**
+     * 根据用户编号查询学生信息
+     * @return
+     */
+    StudentInfoVo getStudentInfo(Long userId);
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/student/service/IBaseStudentScholarshipApplicantService.java

@@ -14,4 +14,11 @@ import java.util.List;
 */
 
 public interface IBaseStudentScholarshipApplicantService extends MPJBaseService<BaseStudentScholarshipApplicant> {
+
+    /**
+     * 流程数据处理
+     *
+     * @return
+     */
+    Boolean processDataHandler(Long dataId);
 }

+ 43 - 5
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentScholarshipApplicantServiceImpl.java

@@ -2,24 +2,62 @@ package com.xjrsoft.module.student.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.xjrsoft.common.enums.GenderEnum;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.erpModel.caseErpMaterial.entity.CaseErpMaterial;
+import com.xjrsoft.module.erpModel.caseErpMaterial.entity.CaseErpMaterialClasses;
+import com.xjrsoft.module.erpModel.caseErpMaterial.entity.CaseErpMaterialProperty;
+import com.xjrsoft.module.erpModel.caseErpMaterial.vo.CaseErpMaterialInfoVo;
+import com.xjrsoft.module.erpModel.caseErpUnit.entity.CaseErpUnit;
+import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentScholarshipApplicant;
+import com.xjrsoft.module.student.entity.BaseStudentUser;
+import com.xjrsoft.module.student.mapper.BaseStudentMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentScholarshipApplicantMapper;
 import com.xjrsoft.module.student.service.IBaseStudentScholarshipApplicantService;
+import com.xjrsoft.module.student.vo.StudentInfoVo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
+
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 
 /**
-* @title: 奖学金申请
-* @Author dzx
-* @Date: 2023-11-23
-* @Version 1.0
-*/
+ * @title: 奖学金申请
+ * @Author dzx
+ * @Date: 2023-11-23
+ * @Version 1.0
+ */
 @Service
 @AllArgsConstructor
 public class BaseStudentScholarshipApplicantServiceImpl extends MPJBaseServiceImpl<BaseStudentScholarshipApplicantMapper, BaseStudentScholarshipApplicant> implements IBaseStudentScholarshipApplicantService {
+
+    private final BaseStudentScholarshipApplicantMapper scholarshipApplicantMapper;
+
+    private final BaseStudentMapper studentMapper;
+
+    @Override
+    public Boolean processDataHandler(Long dataId) {
+        if (dataId == null) {
+            return false;
+        }
+        // 原始数据
+        BaseStudentScholarshipApplicant scholarshipApplicant = scholarshipApplicantMapper.selectById(dataId);
+        // 获取学生信息
+        StudentInfoVo studentInfo = studentMapper.getStudentInfo(scholarshipApplicant.getApplicantUserId());
+        scholarshipApplicant.setGradeName(studentInfo.getGradeName());
+        scholarshipApplicant.setClassName(studentInfo.getClassName());
+        scholarshipApplicant.setName(studentInfo.getStudentName());
+        scholarshipApplicant.setStudentId(studentInfo.getStudentId());
+        scholarshipApplicant.setGenderName(GenderEnum.getValue(studentInfo.getGender()));
+        scholarshipApplicant.setEnrollTypeCn(studentInfo.getEnrollmentType());
+        scholarshipApplicant.setMajorName(studentInfo.getMajorName());
+
+        return updateById(scholarshipApplicant);
+    }
 }

+ 41 - 0
src/main/java/com/xjrsoft/module/student/vo/StudentInfoVo.java

@@ -0,0 +1,41 @@
+package com.xjrsoft.module.student.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class StudentInfoVo {
+
+    @ApiModelProperty("用户ID(xjr_user)")
+    private Long userId;
+
+    @ApiModelProperty("学号")
+    private String studentId;
+
+    @ApiModelProperty("年级ID")
+    private Long gradeId;
+
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+
+    @ApiModelProperty("班级ID")
+    private Long classId;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    @ApiModelProperty("学生名称")
+    private String studentName;
+
+    @ApiModelProperty("性别 1=男 2=女")
+    private Integer gender;
+
+    @ApiModelProperty("招生类型名称")
+    private String enrollmentType;
+
+    @ApiModelProperty("专业ID")
+    private Long majorId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+}

+ 13 - 0
src/main/java/com/xjrsoft/module/workflow/dto/MyProcessPageDto.java

@@ -1,10 +1,12 @@
 package com.xjrsoft.module.workflow.dto;
 
 import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 /**
@@ -31,6 +33,11 @@ public class MyProcessPageDto extends PageInput {
      */
     private String name;
 
+    /**
+     * 模板id
+     */
+    private String schemaId;
+
 
     /**
      * 发起人
@@ -41,4 +48,10 @@ public class MyProcessPageDto extends PageInput {
      * 流水号
      */
     private String serialNumber;
+
+    /**
+     * 1完成 2未完成
+     */
+    @ApiModelProperty("类型 1完成 2未完成 ")
+    private Integer type;
 }

+ 61 - 51
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -235,7 +235,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             List<ProcessParamConfig> processParamConfigs = workflowSchemaConfig.getProcessConfig().getProcessParamConfigs();
 
             long count = historyService.createHistoricProcessInstanceQuery().count();
-            Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1,null);
+            Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1, null);
 
             Map<String, Map<String, Object>> formAssignmentData = new HashMap<>();
 
@@ -1106,7 +1106,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         long count = historyService.createHistoricProcessInstanceQuery().count();
 
-        Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1,null);
+        Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1, null);
 
         //表单赋值
 //        initFormAssignment(dto.getFormData(), workflowSchema, workflowSchemaConfig, processParam);
@@ -1263,7 +1263,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         long count = historyService.createHistoricProcessInstanceQuery().count();
 
-        Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1,null);
+        Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1, null);
 
         //表单赋值
 //        initFormAssignment(dto.getFormData(), workflowSchema, workflowSchemaConfig, processParam);
@@ -1494,7 +1494,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 result.add(vo);
             }
         }
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())){//流水号不为数字类型,直接对结果集置空
+        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())) {//流水号不为数字类型,直接对结果集置空
             result.clear();
         }
         PageOutput<PendingTaskVo> output = new PageOutput<>();
@@ -1611,7 +1611,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 Map<String, Object> param = new HashMap<>();
                 param.put("language", buttonConfig.getScriptLanguage());
                 param.put("content", buttonConfig.getScriptContent());
-                redisUtil.set(WorkflowConstant.BUTTON_EVENT_CACHE_PRE + task.getId(), param,10);
+                redisUtil.set(WorkflowConstant.BUTTON_EVENT_CACHE_PRE + task.getId(), param, 10);
             }
 
 
@@ -1799,7 +1799,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             Object resultName = new Object();
             //获取会签流程的结果,防止会签节点后面直接跟结束节点,导致拿不到流程数据
-            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()){
+            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
                 resultName = runtimeService.getVariable(task.getProcessInstanceId(), resultVarName);
             }
 
@@ -1831,7 +1831,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 invokeAutoAgree(task.getProcessInstanceId(), workflowSchema.getId(), workflowSchemaConfig, list);
 
                 //新增工作流程信息数据
-                addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, oldTaskName, buttonConfig.getButtonName(), dto.getApprovedContent(), task,resultName);
+                addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, oldTaskName, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
 
             }
 
@@ -2145,7 +2145,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 Object resultName = new Object();
                 //获取会签流程的结果,防止会签节点后面直接跟结束节点,导致拿不到流程数据
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()){
+                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
                     resultName = runtimeService.getVariable(task.getProcessInstanceId(), resultVarName);
                 }
 
@@ -2179,7 +2179,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     approveMultiVo.setCurrentNodeName(task.getName());
                     if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
                         //新增工作流程信息数据
-                        addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "同意", dto.getApprovedContent(), task,resultName);
+                        addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "同意", dto.getApprovedContent(), task, resultName);
 
                         if (nextTaskNameList.size() == 0) {
                             String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
@@ -2201,7 +2201,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     }
                     if (dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode()) {
                         //新增工作流程信息数据
-                        addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "拒绝", dto.getApprovedContent(), task,resultName);
+                        addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "拒绝", dto.getApprovedContent(), task, resultName);
                         if (nextTaskNameList.size() == 0) {
                             String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
                             approveMultiVo.setApproveDetail(message);
@@ -2889,7 +2889,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 modelElementById = bpmnModelInstance.getModelElementById(replace);
             }
             Collection<SequenceFlow> outgoing = ((FlowNodeImpl) modelElementById).getOutgoing();
-            if (outgoing !=null && outgoing.size()>0){
+            if (outgoing != null && outgoing.size() > 0) {
                 for (SequenceFlow sequenceFlow : outgoing) {
                     outgoingList.add(sequenceFlow.getId());
                 }
@@ -2907,16 +2907,16 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             Collection<SequenceFlow> incoming = ((FlowNodeImpl) modelElementById).getIncoming();
 
             if (incoming != null && incoming.size() > 0) {
-                if (incoming.size() > 1){
+                if (incoming.size() > 1) {
                     //查询已经走过的节点的outgoing数据
-                    if (CollectionUtil.isNotEmpty(outgoingList)){
+                    if (CollectionUtil.isNotEmpty(outgoingList)) {
                         for (SequenceFlow sequenceFlow : incoming) {
-                            if (outgoingList.contains(sequenceFlow.getId())){
+                            if (outgoingList.contains(sequenceFlow.getId())) {
                                 finishedActivity.add(sequenceFlow.getId());
                             }
                         }
                     }
-                }else {
+                } else {
                     for (SequenceFlow sequenceFlow : incoming) {
                         finishedActivity.add(sequenceFlow.getId());
                     }
@@ -3010,7 +3010,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                         .orderByDesc(WorkflowCirculated::getId)
                         .like(StrUtil.isNotBlank(dto.getTaskName()), WorkflowCirculated::getTaskName, dto.getTaskName())
                         .like(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .like(StrUtil.isNotBlank(dto.getKeyword()),WorkflowSchema::getName,dto.getKeyword())
+                        .like(StrUtil.isNotBlank(dto.getKeyword()), WorkflowSchema::getName, dto.getKeyword())
                         .eq(StrUtil.isNotBlank(dto.getOriginator()), User::getId, dto.getOriginator())
                         .eq(StrUtil.isNotBlank(dto.getSerialNumber()), WorkflowCirculated::getSerialNumber, dto.getSerialNumber())
                         .between(ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime()), WorkflowCirculated::getCreateTime, dto.getStartTime(), dto.getEndTime())
@@ -3070,7 +3070,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                         .orderByDesc(WorkflowApproveRecord::getId)
                         .like(StrUtil.isNotBlank(dto.getTaskName()), WorkflowCirculated::getTaskName, dto.getTaskName())
                         .like(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .like(StrUtil.isNotBlank(dto.getKeyword()),WorkflowSchema::getName,dto.getKeyword())
+                        .like(StrUtil.isNotBlank(dto.getKeyword()), WorkflowSchema::getName, dto.getKeyword())
                         .eq(StrUtil.isNotBlank(dto.getOriginator()), WorkflowExtra::getStartUserId, dto.getOriginator())
                         .eq(StrUtil.isNotBlank(dto.getSerialNumber()), WorkflowCirculated::getSerialNumber, dto.getSerialNumber())
                         .between(ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime()), WorkflowExtra::getLaunchTime, dto.getStartTime(), dto.getEndTime())
@@ -3112,7 +3112,10 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         if (StrUtil.isNotBlank(dto.getName())) {
             historicProcessInstanceQuery.variableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getName() + StringPool.PERCENT);
         }
-        if (StrUtil.isNotBlank(dto.getKeyword())){
+        if (StrUtil.isNotBlank(dto.getSchemaId())) {
+            historicProcessInstanceQuery.variableValueEquals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Convert.toLong(dto.getSchemaId()));
+        }
+        if (StrUtil.isNotBlank(dto.getKeyword())) {
             historicProcessInstanceQuery.variableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT);
         }
         if (StrUtil.isNotBlank(dto.getOriginator())) {
@@ -3122,6 +3125,13 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     .endOr();
         }
 
+        if (!ObjectUtil.isNull(dto.getType()) && dto.getType() == 1) {
+            historicProcessInstanceQuery.finished();
+        }
+        if (!ObjectUtil.isNull(dto.getType()) && dto.getType() == 2) {
+            historicProcessInstanceQuery.unfinished();
+        }
+
 
         long count = historicProcessInstanceQuery.count();
         List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.orderByProcessInstanceStartTime().desc().listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
@@ -3173,7 +3183,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             }
         }
 
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())){//非数字类型置空
+        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())) {//非数字类型置空
             result.clear();
         }
         PageOutput<MyProcessPageVo> output = new PageOutput<>();
@@ -3488,7 +3498,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         List<Long> ids = new ArrayList<>();
         //发起人分割数组
-        if (StrUtil.isNotBlank(dto.getOriginator())){
+        if (StrUtil.isNotBlank(dto.getOriginator())) {
             String allUserIdStr = StrUtil.join(StringPool.COMMA, dto.getOriginator());
             ids = Arrays.stream(allUserIdStr.split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
         }
@@ -3498,7 +3508,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 MPJWrappers.<WorkflowDraft>lambdaJoin()
                         .disableSubLogicDel()
                         .eq(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .in(CollectionUtil.isNotEmpty(ids),WorkflowDraft::getCreateUserId,ids)
+                        .in(CollectionUtil.isNotEmpty(ids), WorkflowDraft::getCreateUserId, ids)
                         .between(ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime()), WorkflowDraft::getCreateDate, dto.getStartTime(), dto.getEndTime())
                         .orderByDesc(WorkflowDraft::getCreateDate)
                         .select(WorkflowDraft::getId)
@@ -4747,7 +4757,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
      * @param oldTaskName      前一个节点的名称
      * @param buttonName       按钮名称
      */
-    private void addWorkflowRecord(UserTaskConfig userTaskConfig, List<String> nextTaskNameList, User user, WorkflowRecord record, String oldTaskName, String buttonName, String approvedContent, Task task,Object resultName) {
+    private void addWorkflowRecord(UserTaskConfig userTaskConfig, List<String> nextTaskNameList, User user, WorkflowRecord record, String oldTaskName, String buttonName, String approvedContent, Task task, Object resultName) {
         //单实例
         if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
             //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
@@ -4873,7 +4883,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
     }
 
     @Override
-    public Boolean dealTimeoutTask(Integer handleType,String taskId) {
+    public Boolean dealTimeoutTask(Integer handleType, String taskId) {
         //根据taskid  获取任务信息
         Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
 
@@ -4901,7 +4911,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         List<LaunchAndApproveVo> result = new ArrayList<>();
 
-        if (handleType == 1){//自动驳回
+        if (handleType == 1) {//自动驳回
             //获取到当前活动的实例
             ActivityInstance activityInstance = runtimeService.getActivityInstance(task.getProcessInstanceId());
 
@@ -4915,19 +4925,19 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     .asc()
                     .list();
 
-            if(null == resultList || resultList.size() == 0){
+            if (null == resultList || resultList.size() == 0) {
                 throw new MyException("当前任务之前不存在用户任务无法驳回!");
             }
             //得到第一个任务节点的id
             HistoricActivityInstance historicActivityInstance = resultList.get(0);
             String startActId = historicActivityInstance.getActivityId();
-            if(startActId.equals(task.getTaskDefinitionKey())){
+            if (startActId.equals(task.getTaskDefinitionKey())) {
                 throw new MyException("开始节点无法驳回!");
             }
 
             //得到上一个任务节点的ActivityId和待办人
-            Map<String,String> lastNode = getLastNode(resultList,task.getTaskDefinitionKey());
-            if(null == lastNode){
+            Map<String, String> lastNode = getLastNode(resultList, task.getTaskDefinitionKey());
+            if (null == lastNode) {
                 throw new MyException("回退节点异常!");
             }
             String toActId = lastNode.get("toActId");
@@ -4965,7 +4975,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 record.setMessage("审批信息:由于审批超时,【系统】【自动驳回】审批,审批意见为:“系统自动驳回审批”,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
                 workflowRecordMapper.insert(record);
             });
-        }else if(handleType == 2){//同意
+        } else if (handleType == 2) {//同意
             //新增流程发起流程记录
             WorkflowRecord record = new WorkflowRecord();
             record.setNodeId(task.getId());
@@ -4996,11 +5006,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             }
             //单流向
             if (nextTaskNameList.size() == 1) {
-                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" +  oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
+                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
                 record.setMessage(message);
             }//多流向
             if (nextTaskNameList.size() > 1) {
-                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" +  oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
+                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
                 for (int i = 1; i < nextTaskNameList.size(); i++) {
                     message = message + "、【" + nextTaskNameList.get(i) + "】";
                 }
@@ -5018,20 +5028,20 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
      * 1、当前节点不在历史节点里
      * 2、当前节点在历史节点里
      * 比如,resultList={1,2,3}
-     *     (1)当前节点是4,表示3是完成节点,4驳回需要回退到3
-     *     (2)当前节点是2,表示3是驳回节点,3驳回到当前2节点,2驳回需要回退到1
+     * (1)当前节点是4,表示3是完成节点,4驳回需要回退到3
+     * (2)当前节点是2,表示3是驳回节点,3驳回到当前2节点,2驳回需要回退到1
      * 其他驳回过的情况也都包含在情况2中。
      *
-     * @param resultList 历史节点列表
+     * @param resultList        历史节点列表
      * @param currentActivityId 当前待办节点ActivityId
      * @return 返回值:上一节点的ActivityId和待办人(toActId, assignee)
      */
-    private static Map<String,String> getLastNode(List<HistoricActivityInstance> resultList, String currentActivityId){
-        Map<String,String> backNode = new HashMap<>();
+    private static Map<String, String> getLastNode(List<HistoricActivityInstance> resultList, String currentActivityId) {
+        Map<String, String> backNode = new HashMap<>();
         //新建一个有序不重复集合
-        LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap();
-        for(HistoricActivityInstance hai : resultList){
-            linkedHashMap.put(hai.getActivityId(),hai.getAssignee());
+        LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap();
+        for (HistoricActivityInstance hai : resultList) {
+            linkedHashMap.put(hai.getActivityId(), hai.getAssignee());
         }
         //分两种情况:当前节点在不在历史节点里面,当前节点在历史节点里
         //情况1、当前节点不在历史节点里
@@ -5040,13 +5050,13 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         //判断历史节点中是否有重复节点
         //if(originSize == duplicateRemovalSize){
         boolean flag = false;
-        for(Map.Entry entry: linkedHashMap.entrySet()){
-            if(currentActivityId.equals(entry.getKey())){
+        for (Map.Entry entry : linkedHashMap.entrySet()) {
+            if (currentActivityId.equals(entry.getKey())) {
                 flag = true;
                 break;
             }
         }
-        if(!flag) {
+        if (!flag) {
             //当前节点不在历史节点里:最后一个节点是完成节点
             HistoricActivityInstance historicActivityInstance = resultList.get(originSize - 1);
             backNode.put("toActId", historicActivityInstance.getActivityId());
@@ -5078,18 +5088,18 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return null;
     }
 
-    private static Map<String,String> currentNodeInHis(LinkedHashMap<String,String> linkedHashMap,String currentActivityId){
+    private static Map<String, String> currentNodeInHis(LinkedHashMap<String, String> linkedHashMap, String currentActivityId) {
         //情况2、当前节点在历史节点里(已回退过的)
-        Map<String,String> backNode = new HashMap<>();
-        ListIterator<Map.Entry<String,String>> li = new ArrayList<>(linkedHashMap.entrySet()).listIterator();
+        Map<String, String> backNode = new HashMap<>();
+        ListIterator<Map.Entry<String, String>> li = new ArrayList<>(linkedHashMap.entrySet()).listIterator();
         //System.out.println("已回退过的");
-        while (li.hasNext()){
-            Map.Entry<String,String> entry = li.next();
-            if(currentActivityId.equals(entry.getKey())){
+        while (li.hasNext()) {
+            Map.Entry<String, String> entry = li.next();
+            if (currentActivityId.equals(entry.getKey())) {
                 li.previous();
-                Map.Entry<String,String> previousEntry = li.previous();
-                backNode.put("toActId",previousEntry.getKey());
-                backNode.put("assignee",previousEntry.getValue());
+                Map.Entry<String, String> previousEntry = li.previous();
+                backNode.put("toActId", previousEntry.getKey());
+                backNode.put("assignee", previousEntry.getValue());
                 return backNode;
             }
         }

+ 15 - 0
src/main/resources/mapper/student/BaseStudentMapper.xml

@@ -0,0 +1,15 @@
+<?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.xjrsoft.module.student.mapper.BaseStudentMapper">
+    <select id="getStudentInfo" resultType="com.xjrsoft.module.student.vo.StudentInfoVo">
+        SELECT t1.user_id,t5.id as grade_id,t5.name AS grade_name,t4.id as class_id,t4.name AS class_name,t2.name AS student_name,t1.student_id,t2.gender,t3.enrollment_type,t6.id as major_id,t6.name AS major_name FROM base_student t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        LEFT JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
+        LEFT JOIN base_class t4 ON t3.class_id = t4.id
+        LEFT JOIN base_grade t5 ON t3.grade_id = t5.id
+        LEFT JOIN base_major_set t6 ON t3.major_set_id = t6.id
+        where  t1.delete_mark=0 and t2.delete_mark=0 and t1.user_id=#{userId};
+    </select>
+</mapper>

+ 2 - 1
src/main/resources/sqlScript/20231120_sql.sql

@@ -58,9 +58,10 @@ CREATE TABLE base_student_scholarship_applicant
     `enabled_mark` INT NOT NULL COMMENT '有效标志',
     `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
     `base_student_scholarship_category_id` bigint NULL DEFAULT NULL COMMENT '奖学金类别ID(base_student_scholarship_category)',
+    `scholarship_level` int NOT NULL DEFAULT 0 COMMENT '奖学金等级 0=无等级',
+    `amount` double NOT NULL DEFAULT 0 COMMENT '金额',
     `applicant_user_id` BIGINT NULL DEFAULT NULL COMMENT '申请人',
     `base_semester_id` bigint NULL DEFAULT NULL COMMENT '学期ID(base_semester)',
-    `scholarship_level` int NOT NULL DEFAULT 0 COMMENT '奖学金等级 0=无等级',
     `grade_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '年级名称',
     `class_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '班级名称',
     `name` VARCHAR(200) NULL DEFAULT NULL COMMENT '姓名',

+ 36 - 0
src/test/java/com/xjrsoft/xjrsoftboot/CompletableFutureTest.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.xjrsoftboot;
+
+import org.apache.tools.ant.taskdefs.Sleep;
+import org.junit.jupiter.api.Test;
+
+import java.util.concurrent.CompletableFuture;
+
+public class CompletableFutureTest {
+
+    @Test
+    public void CompletableFutureTest() throws InterruptedException {
+        CompletableFuture.runAsync(() -> {
+            try {
+                Thread.sleep(2000); // 暂停2秒
+                System.out.println(Thread.currentThread());
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+            System.out.println(1);
+        });
+
+        CompletableFuture.runAsync(() -> {
+            try {
+                Thread.sleep(1000); // 暂停1秒
+                System.out.println(Thread.currentThread());
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+
+            System.out.println(2);
+        });
+
+
+        Thread.sleep(1000000);
+    }
+}