Browse Source

Merge remote-tracking branch 'origin/pre' into pre

dzx 1 year ago
parent
commit
258df2d9e0
21 changed files with 634 additions and 65 deletions
  1. 16 23
      src/main/java/com/xjrsoft/module/assessment/service/impl/AssessmentTemplatePlanServiceImpl.java
  2. 1 1
      src/main/java/com/xjrsoft/module/assessment/vo/AssessmentQuestionOptionResultVo.java
  3. 161 10
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  4. 9 0
      src/main/java/com/xjrsoft/module/organization/dto/UserPageDto.java
  5. 4 1
      src/main/java/com/xjrsoft/module/organization/mapper/UserMapper.java
  6. 4 0
      src/main/java/com/xjrsoft/module/organization/service/IUserService.java
  7. 16 1
      src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java
  8. 56 0
      src/main/java/com/xjrsoft/module/organization/vo/ResetUserPageVo.java
  9. 39 0
      src/main/java/com/xjrsoft/module/organization/vo/ResetUserRoleVo.java
  10. 1 1
      src/main/java/com/xjrsoft/module/organization/vo/UserListVo.java
  11. 6 0
      src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java
  12. 3 0
      src/main/java/com/xjrsoft/module/workflow/entity/WorkflowApproveRecord.java
  13. 2 0
      src/main/java/com/xjrsoft/module/workflow/entity/XjrWorkflowOperateRecord.java
  14. 2 0
      src/main/java/com/xjrsoft/module/workflow/model/UserTaskConfig.java
  15. 8 0
      src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java
  16. 271 22
      src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java
  17. 6 0
      src/main/java/com/xjrsoft/module/workflow/vo/ProcessRecordListVo.java
  18. 1 0
      src/main/java/com/xjrsoft/module/workflow/vo/UserTaskInfoVo.java
  19. 18 0
      src/main/resources/mapper/organization/UserMapper.xml
  20. 9 5
      src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml
  21. 1 1
      src/test/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImplTest.java

+ 16 - 23
src/main/java/com/xjrsoft/module/assessment/service/impl/AssessmentTemplatePlanServiceImpl.java

@@ -62,8 +62,6 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -463,34 +461,21 @@ class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<AssessmentTem
                             Integer count = answerCountMap.get(assessmentQuestion.getParentId().toString() + assessmentQuestion.getId().toString());
                             questionVo.setCount(count == null?0:count);
 
-                            BigDecimal bigDecimal = BigDecimal.valueOf(questionVo.getCount())
-                                    .divide(BigDecimal.valueOf(vo.getStudentCount()))
-                                    .multiply(BigDecimal.valueOf(100))
-                                    .setScale(2, RoundingMode.HALF_UP);
-                            questionVo.setPercentage(bigDecimal.floatValue());
+                            questionVo.setPercentage(vo.getStudentCount());
                             optionList.add(questionVo);
                         }
                     }
-                }
-                if("judge_question".equals(twoQuestion.getType())){
+                }else if("judge_question".equals(twoQuestion.getType())){
                     optionList.add(new AssessmentQuestionOptionResultVo(){{
                         setName("是");
                         Integer count = answerCountMap.get(twoQuestion.getId().toString() + "1");
-                        BigDecimal bigDecimal = BigDecimal.valueOf(count == null?0:count)
-                                .divide(BigDecimal.valueOf(vo.getStudentCount()))
-                                .multiply(BigDecimal.valueOf(100))
-                                .setScale(2, RoundingMode.HALF_UP);
-                        setPercentage(bigDecimal.floatValue());
+                        setPercentage(vo.getStudentCount());
                         setCount(count == null?0:count);
                     }});
                     optionList.add(new AssessmentQuestionOptionResultVo(){{
                         setName("否");
                         Integer count = answerCountMap.get(twoQuestion.getId().toString() + "2");
-                        BigDecimal bigDecimal = BigDecimal.valueOf(count == null?0:count)
-                                .divide(BigDecimal.valueOf(vo.getStudentCount()))
-                                .multiply(BigDecimal.valueOf(100))
-                                .setScale(2, RoundingMode.HALF_UP);
-                        setPercentage(bigDecimal.floatValue());
+                        setPercentage(vo.getStudentCount());
                         setCount(count == null?0:count);
                     }});
                 }else if("scale_question".equals(twoQuestion.getType())) {
@@ -499,14 +484,22 @@ class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<AssessmentTem
                             optionList.add(new AssessmentQuestionOptionResultVo(){{
                                 setName(detailVo.getAnswerId());
                                 Integer count = detailVo.getChooseCount();
-                                BigDecimal bigDecimal = BigDecimal.valueOf(count == null?0:count)
-                                        .divide(BigDecimal.valueOf(vo.getStudentCount())).multiply(BigDecimal.valueOf(100))
-                                        .setScale(2, RoundingMode.HALF_UP);
-                                setPercentage(bigDecimal.floatValue());
+                                setPercentage(vo.getStudentCount());
                                 setCount(count == null?0:count);
                             }});
                         }
                     }
+                }else if("text_question".equals(twoQuestion.getType())) {
+                    for (AssessmentPlanQuestion assessmentQuestion : questionList) {
+                        if(assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())){
+                            AssessmentQuestionOptionResultVo questionVo = BeanUtil.toBean(assessmentQuestion, AssessmentQuestionOptionResultVo.class);
+                            Integer count = answerCountMap.get(assessmentQuestion.getParentId().toString() + assessmentQuestion.getId().toString());
+                            questionVo.setCount(count == null?0:count);
+
+                            questionVo.setPercentage(vo.getStudentCount());
+                            optionList.add(questionVo);
+                        }
+                    }
                 }
                 twoQuestion.setResultList(optionList);
             }

+ 1 - 1
src/main/java/com/xjrsoft/module/assessment/vo/AssessmentQuestionOptionResultVo.java

@@ -22,6 +22,6 @@ public class AssessmentQuestionOptionResultVo implements Serializable {
     private Integer count = 0;
 
     @ApiModelProperty("占比")
-    private Float percentage;
+    private Integer percentage;
 
 }

+ 161 - 10
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -6,12 +6,14 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.RoleEnum;
@@ -22,21 +24,68 @@ import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.sms.SmsCtcc;
 import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.common.utils.TreeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
-import com.xjrsoft.module.organization.dto.*;
-import com.xjrsoft.module.organization.entity.*;
-import com.xjrsoft.module.organization.service.*;
+import com.xjrsoft.module.base.service.IBaseGradeService;
+import com.xjrsoft.module.organization.dto.AddUserDto;
+import com.xjrsoft.module.organization.dto.BindOpenidDto;
+import com.xjrsoft.module.organization.dto.LoginResetPasswordDto;
+import com.xjrsoft.module.organization.dto.RegisterDto;
+import com.xjrsoft.module.organization.dto.ResetPasswordDto;
+import com.xjrsoft.module.organization.dto.UpdateInfoDto;
+import com.xjrsoft.module.organization.dto.UpdatePasswordDto;
+import com.xjrsoft.module.organization.dto.UpdateUserDto;
+import com.xjrsoft.module.organization.dto.UserPageDto;
+import com.xjrsoft.module.organization.dto.UserStudentAddDto;
+import com.xjrsoft.module.organization.dto.UserStudentBindDto;
+import com.xjrsoft.module.organization.dto.UserStudentDeleteDto;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.entity.Post;
+import com.xjrsoft.module.organization.entity.Role;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.organization.entity.UserPostRelation;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.organization.service.IPostService;
+import com.xjrsoft.module.organization.service.IRoleService;
+import com.xjrsoft.module.organization.service.IUserDeptRelationService;
+import com.xjrsoft.module.organization.service.IUserPostRelationService;
+import com.xjrsoft.module.organization.service.IUserRoleRelationService;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.organization.service.IUserStudentService;
 import com.xjrsoft.module.organization.utils.OrganizationUtil;
-import com.xjrsoft.module.organization.vo.*;
+import com.xjrsoft.module.organization.vo.DepartmentTreeVo;
+import com.xjrsoft.module.organization.vo.PendingCountDto;
+import com.xjrsoft.module.organization.vo.ResetUserPageVo;
+import com.xjrsoft.module.organization.vo.ResetUserRoleVo;
+import com.xjrsoft.module.organization.vo.UserDeptVo;
+import com.xjrsoft.module.organization.vo.UserInfoVo;
+import com.xjrsoft.module.organization.vo.UserListVo;
+import com.xjrsoft.module.organization.vo.UserPageVo;
+import com.xjrsoft.module.organization.vo.UserPostVo;
+import com.xjrsoft.module.organization.vo.UserRoleVo;
+import com.xjrsoft.module.organization.vo.UserStudentVo;
+import com.xjrsoft.module.organization.vo.UserVo;
 import com.xjrsoft.module.oss.factory.OssFactory;
-import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.vo.BaseStudentTreeVo;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
@@ -79,7 +128,7 @@ public class UserController {
     private final RedisUtil redisUtil;
 
     private final SmsCtcc smsCtcc;
-
+    private final IBaseGradeService baseGradeService;
     private final IUserStudentService userStudentService;
     private final IBaseClassService baseClassService;
     private final IWorkflowExecuteService workflowExecuteService;
@@ -130,12 +179,17 @@ public class UserController {
                     .like(StrUtil.isNotBlank(dto.getCode()), User::getCode, dto.getCode())
                     .like(StrUtil.isNotBlank(dto.getName()), User::getName, dto.getName())
                     .like(StrUtil.isNotBlank(dto.getMobile()), User::getMobile, dto.getMobile())
+                    .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 1), Role::getId, dto.getTreeId())
+                    .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 2), UserDeptRelation::getDeptId, dto.getTreeId())
+                    .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 3), BaseStudentSchoolRoll::getGradeId, dto.getTreeId())
+                    .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 4), BaseStudentSchoolRoll::getClassId, dto.getTreeId())
                     .eq(ObjectUtil.isNotNull(dto.getUserType()), Role::getId, dto.getUserType())
                     .orderByDesc(User::getId)
                     .select(User::getId)
                     .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
                     .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, User::getId)
                     .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
+                    .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
                     .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class, queryUser);
             for (UserPageVo record : page.getRecords()) {
@@ -169,10 +223,16 @@ public class UserController {
                             .like(StrUtil.isNotBlank(dto.getName()), User::getName, dto.getName())
                             .like(StrUtil.isNotBlank(dto.getMobile()), User::getMobile, dto.getMobile())
                             .eq(ObjectUtil.isNotNull(dto.getUserType()), Role::getId, dto.getUserType())
+                            .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 1), Role::getId, dto.getTreeId())
+                            .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 2), UserDeptRelation::getDeptId, dto.getTreeId())
+                            .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 3), BaseStudentSchoolRoll::getGradeId, dto.getTreeId())
+                            .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 4), BaseStudentSchoolRoll::getClassId, dto.getTreeId())
                             .orderByDesc(User::getId)
                             .select(User::getId)
                             .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
                             .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
+                            .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+                            .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, User::getId)
                             .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,queryUser);
             for (UserPageVo record : page.getRecords()) {
@@ -244,16 +304,13 @@ public class UserController {
 
         }
 
-
         if (deptIds.size() > 0) {
             List<Department> list = departmentService.list(Wrappers.lambdaQuery(Department.class).in(Department::getId, deptIds));
 
             List<UserDeptVo> userDeptVoList = BeanUtil.copyToList(list, UserDeptVo.class);
             vo.setDepartments(userDeptVoList);
-
         }
 
-
         if (postIds.size() > 0) {
             List<Post> list = postService.list(Wrappers.lambdaQuery(Post.class).in(Post::getId, postIds));
 
@@ -286,6 +343,100 @@ public class UserController {
         return RT.ok(pendingCountDto);
     }
 
+    @GetMapping(value = "/reset-user-page")
+    @ApiOperation(value = "移动端用户列表")
+    public RT<PageOutput<ResetUserPageVo>> resetUserPage(UserPageDto dto) {
+        PageOutput<ResetUserPageVo> userPage = userService.getResetUserPage(dto);
+
+        return RT.ok(userPage);
+    }
+
+    @GetMapping(value = "/reset-page-role-list")
+    @ApiOperation(value = "移动端用户列表分类")
+    public RT<List<ResetUserRoleVo>> resetUserTree() {
+        List<ResetUserRoleVo> roleList =  new ArrayList<>();
+        roleList.add(new ResetUserRoleVo(){{
+            setId(null);
+            setName("全部");
+        }});
+        roleList.add(new ResetUserRoleVo(){{
+            setId(2L);
+            setName("教师");
+        }});
+        roleList.add(new ResetUserRoleVo(){{
+            setId(3L);
+            setName("学生");
+        }});
+        roleList.add(new ResetUserRoleVo(){{
+            setId(4L);
+            setName("家长");
+        }});
+
+        return RT.ok(roleList);
+    }
+
+    @GetMapping(value = "/pc-role-tree")
+    @ApiOperation(value = "pc端用户列表分类")
+    public RT<List<ResetUserRoleVo>> pcRoleTree() {
+        List<Department> departmentList = departmentService.list(
+            new QueryWrapper<Department>().lambda()
+            .eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        List<ResetUserRoleVo> voList = new ArrayList<>();
+        for (Department department : departmentList) {
+            ResetUserRoleVo roleVo = BeanUtil.toBean(department, ResetUserRoleVo.class);
+            roleVo.setType(2);
+            voList.add(roleVo);
+        }
+
+        List<ResetUserRoleVo> treeVoList = TreeUtil.build(voList);
+        List<ResetUserRoleVo> roleList =  new ArrayList<>();
+        ResetUserRoleVo roleVo = new ResetUserRoleVo() {{
+            setId(2L);
+            setType(1);
+            setName("教师");
+            setChildren(treeVoList);
+        }};
+        roleList.add(roleVo);
+
+        List<ResetUserRoleVo> gradeClassList = new ArrayList<>();
+        baseClassService.list(
+            new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ).forEach(e->{
+            ResetUserRoleVo gradeClass = new ResetUserRoleVo();
+            gradeClass.setType(4);
+            gradeClass.setName(e.getName());
+            gradeClass.setId(e.getId());
+            gradeClass.setParentId(e.getGradeId());
+            gradeClassList.add(gradeClass);
+        });
+
+        baseGradeService.list(
+            new QueryWrapper<BaseGrade>().lambda().eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ).forEach(e->{
+            ResetUserRoleVo gradeClass = new ResetUserRoleVo();
+            gradeClass.setType(3);
+            gradeClass.setName(e.getName());
+            gradeClass.setId(e.getId());
+            gradeClass.setParentId(3L);
+            gradeClassList.add(gradeClass);
+        });
+        List<ResetUserRoleVo> gradeClassTreeVoList = TreeUtil.build(gradeClassList);
+        roleList.add(new ResetUserRoleVo(){{
+            setId(3L);
+            setType(1);
+            setName("学生");
+            setChildren(gradeClassTreeVoList);
+        }});
+        roleList.add(new ResetUserRoleVo(){{
+            setId(4L);
+            setType(1);
+            setName("家长");
+        }});
+
+        return RT.ok(roleList);
+    }
+
     @PutMapping("/update/info")
     @ApiOperation(value = "登陆人修改自己得用户信息")
     public R updateInfo(@RequestBody @Valid UpdateInfoDto dto) {

+ 9 - 0
src/main/java/com/xjrsoft/module/organization/dto/UserPageDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.organization.dto;
 
 import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.hibernate.validator.constraints.Length;
@@ -30,4 +31,12 @@ public class UserPageDto extends PageInput {
     private String mobile;
 
     private Integer userType;
+    @ApiModelProperty("角色id")
+    private Long roleId;
+
+    @ApiModelProperty("树类型")
+    private Integer treeType;
+
+    @ApiModelProperty("树id")
+    private Long treeId;
 }

+ 4 - 1
src/main/java/com/xjrsoft/module/organization/mapper/UserMapper.java

@@ -1,7 +1,10 @@
 package com.xjrsoft.module.organization.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.organization.dto.UserPageDto;
 import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.vo.ResetUserPageVo;
 import org.apache.ibatis.annotations.Mapper;
 /**
  * <p>
@@ -13,5 +16,5 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface UserMapper extends MPJBaseMapper<User> {
-
+    Page<ResetUserPageVo> getResetUserPage(Page<ResetUserPageVo> page, UserPageDto dto);
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/organization/service/IUserService.java

@@ -7,8 +7,10 @@ import com.xjrsoft.module.organization.dto.BindOpenidDto;
 import com.xjrsoft.module.organization.dto.ResetPasswordDto;
 import com.xjrsoft.module.organization.dto.UpdatePasswordDto;
 import com.xjrsoft.module.organization.dto.UpdateUserDto;
+import com.xjrsoft.module.organization.dto.UserPageDto;
 import com.xjrsoft.module.organization.dto.WeChatPageDto;
 import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.vo.ResetUserPageVo;
 import com.xjrsoft.module.organization.vo.UserInfoVo;
 import com.xjrsoft.module.organization.vo.WeChatPageVO;
 
@@ -73,4 +75,6 @@ public interface IUserService extends MPJBaseService<User> {
      * @return
      */
     PageOutput<WeChatPageVO> getPage(WeChatPageDto dto);
+
+    PageOutput<ResetUserPageVo> getResetUserPage(UserPageDto dto);
 }

+ 16 - 1
src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.constant.GlobalConstant;
@@ -19,7 +20,13 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
-import com.xjrsoft.module.organization.dto.*;
+import com.xjrsoft.module.organization.dto.AddUserDto;
+import com.xjrsoft.module.organization.dto.BindOpenidDto;
+import com.xjrsoft.module.organization.dto.ResetPasswordDto;
+import com.xjrsoft.module.organization.dto.UpdatePasswordDto;
+import com.xjrsoft.module.organization.dto.UpdateUserDto;
+import com.xjrsoft.module.organization.dto.UserPageDto;
+import com.xjrsoft.module.organization.dto.WeChatPageDto;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.entity.UserPostRelation;
@@ -30,6 +37,7 @@ import com.xjrsoft.module.organization.mapper.UserPostRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
 import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.organization.vo.ResetUserPageVo;
 import com.xjrsoft.module.organization.vo.UserInfoVo;
 import com.xjrsoft.module.organization.vo.WeChatPageVO;
 import lombok.AllArgsConstructor;
@@ -331,4 +339,11 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         return ConventPage.getPageOutput(page, WeChatPageVO.class);
 
     }
+
+    @Override
+    public PageOutput<ResetUserPageVo> getResetUserPage(UserPageDto dto){
+        Page<ResetUserPageVo> resetUserPage = userMapper.getResetUserPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<ResetUserPageVo> pageOutput = ConventPage.getPageOutput(resetUserPage, ResetUserPageVo.class);
+        return pageOutput;
+    }
 }

+ 56 - 0
src/main/java/com/xjrsoft/module/organization/vo/ResetUserPageVo.java

@@ -0,0 +1,56 @@
+package com.xjrsoft.module.organization.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @title: 移动端重置密码用户列表
+ * @Author dzx
+ * @Date: 2024年4月11日
+ * @Version 1.0
+ */
+@Data
+public class ResetUserPageVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+     * 账户
+     */
+    @ApiModelProperty("账户")
+    private String userName;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+
+    /**
+     * 性别中文
+     */
+    @ApiModelProperty("性别中文")
+    private String genderCn;
+
+    /**
+     * 手机号
+     */
+    @ApiModelProperty("头像")
+    private String mobile;
+
+
+    /**
+     * 头像
+     */
+    @ApiModelProperty("头像")
+    private String avatar;
+
+
+}

+ 39 - 0
src/main/java/com/xjrsoft/module/organization/vo/ResetUserRoleVo.java

@@ -0,0 +1,39 @@
+package com.xjrsoft.module.organization.vo;
+
+import com.xjrsoft.common.model.tree.ITreeNode;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @title: 移动端重置密码用户列表
+ * @Author dzx
+ * @Date: 2024年4月11日
+ * @Version 1.0
+ */
+@Data
+public class ResetUserRoleVo implements ITreeNode<ResetUserRoleVo,Long>, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+     * 账户
+     */
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("类型:1:角色, 2:部门")
+    private Integer type;
+
+    @ApiModelProperty("父级id")
+    private Long parentId;
+
+    private List<ResetUserRoleVo> children;
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/organization/vo/UserListVo.java

@@ -52,7 +52,7 @@ public class UserListVo implements Serializable {
     /**
      * 性别
      */
-    private Integer gender;
+    private String gender;
 
     /**
      * 手机号

+ 6 - 0
src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java

@@ -234,6 +234,12 @@ public class WorkflowExecuteController {
         return R.ok(workflowExecuteService.withdraw(dto));
     }
 
+    @PostMapping("/my-task/new-withdraw")
+    @ApiOperation(value = "我的流程 撤回(回到草稿箱)")
+    public R newWithdraw(@Valid @RequestBody WithdrawDto dto) {
+        return R.ok(workflowExecuteService.newWithdraw(dto));
+    }
+
 
     @PostMapping("/draft")
     @ApiOperation(value = "保存草稿")

+ 3 - 0
src/main/java/com/xjrsoft/module/workflow/entity/WorkflowApproveRecord.java

@@ -80,5 +80,8 @@ public class WorkflowApproveRecord implements Serializable {
     @ApiModelProperty("发起人id")
     private Long startUserId;
 
+    @ApiModelProperty("是否显示该节点")
+    private Boolean showNode;
+
 
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/workflow/entity/XjrWorkflowOperateRecord.java

@@ -95,4 +95,6 @@ public class XjrWorkflowOperateRecord implements Serializable {
     @TableField(fill = FieldFill.INSERT)
     private Integer usageScenario;
 
+    @ApiModelProperty("是否显示该节点")
+    private Integer showNode;
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/workflow/model/UserTaskConfig.java

@@ -80,4 +80,6 @@ public class UserTaskConfig extends NodeBasicConfig {
      */
     private List<Integer> noticePolicyConfigs;
 
+    private Boolean showNode;
+
 }

+ 8 - 0
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java

@@ -279,6 +279,14 @@ public interface IWorkflowExecuteService {
      */
     boolean withdraw(WithdrawDto dto);
 
+    /**
+     * 撤回(回到草稿箱中)
+     *
+     * @param dto
+     * @return
+     */
+    boolean newWithdraw(WithdrawDto dto);
+
 
 
     /**

+ 271 - 22
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -24,7 +24,17 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.*;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.FormTemplateType;
+import com.xjrsoft.common.enums.WorkflowApproveType;
+import com.xjrsoft.common.enums.WorkflowAutoAgreeType;
+import com.xjrsoft.common.enums.WorkflowIsPrevChooseNextType;
+import com.xjrsoft.common.enums.WorkflowIsRecycleType;
+import com.xjrsoft.common.enums.WorkflowMultiInstanceFinishType;
+import com.xjrsoft.common.enums.WorkflowMultiInstanceType;
+import com.xjrsoft.common.enums.WorkflowNoHandlerType;
+import com.xjrsoft.common.enums.WorkflowRelationAuthType;
+import com.xjrsoft.common.enums.YesOrNoEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -37,6 +47,8 @@ import com.xjrsoft.module.form.mapper.FormTemplateMapper;
 import com.xjrsoft.module.form.service.IFormExecuteService;
 import com.xjrsoft.module.magicapi.service.IMagicApiService;
 import com.xjrsoft.module.magicapi.vo.MagicApiInfoVo;
+import com.xjrsoft.module.oa.entity.OfficialDocumentReceived;
+import com.xjrsoft.module.oa.mapper.OfficialDocumentReceivedMapper;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.service.IUserService;
@@ -45,13 +57,112 @@ import com.xjrsoft.module.system.entity.Stamp;
 import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.system.service.IStampService;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
-import com.xjrsoft.module.workflow.dto.*;
-import com.xjrsoft.module.workflow.entity.*;
-import com.xjrsoft.module.workflow.mapper.*;
-import com.xjrsoft.module.workflow.model.*;
-import com.xjrsoft.module.workflow.service.*;
+import com.xjrsoft.module.workflow.dto.AddOrSubSignDto;
+import com.xjrsoft.module.workflow.dto.ApproveDto;
+import com.xjrsoft.module.workflow.dto.ApproveMultiDto;
+import com.xjrsoft.module.workflow.dto.ApproveMultiInfoDto;
+import com.xjrsoft.module.workflow.dto.ApproveRecordListDto;
+import com.xjrsoft.module.workflow.dto.ApproveUserDto;
+import com.xjrsoft.module.workflow.dto.ApproveUserMultiDto;
+import com.xjrsoft.module.workflow.dto.CirculatedTaskPageDto;
+import com.xjrsoft.module.workflow.dto.DeployDto;
+import com.xjrsoft.module.workflow.dto.DraftPageDto;
+import com.xjrsoft.module.workflow.dto.FinishedTaskPageDto;
+import com.xjrsoft.module.workflow.dto.FormFinishedTaskDto;
+import com.xjrsoft.module.workflow.dto.GetAssigneeDto;
+import com.xjrsoft.module.workflow.dto.LaunchDto;
+import com.xjrsoft.module.workflow.dto.LaunchRelationTaskDto;
+import com.xjrsoft.module.workflow.dto.MonitorPageDto;
+import com.xjrsoft.module.workflow.dto.MoveRecycleDto;
+import com.xjrsoft.module.workflow.dto.MyExaminePageDto;
+import com.xjrsoft.module.workflow.dto.MyProcessPageDto;
+import com.xjrsoft.module.workflow.dto.PendingTaskPageDto;
+import com.xjrsoft.module.workflow.dto.ReLaunchDto;
+import com.xjrsoft.module.workflow.dto.RecycleDeleteDto;
+import com.xjrsoft.module.workflow.dto.RecycleProcessPageDto;
+import com.xjrsoft.module.workflow.dto.RejectNodeDto;
+import com.xjrsoft.module.workflow.dto.RelationTaskInfoDto;
+import com.xjrsoft.module.workflow.dto.RelationTaskPageDto;
+import com.xjrsoft.module.workflow.dto.RestartDto;
+import com.xjrsoft.module.workflow.dto.SaveDraftDto;
+import com.xjrsoft.module.workflow.dto.SetAssigneeDto;
+import com.xjrsoft.module.workflow.dto.SetSuspendedDto;
+import com.xjrsoft.module.workflow.dto.TransferDto;
+import com.xjrsoft.module.workflow.dto.UpdateDraftDto;
+import com.xjrsoft.module.workflow.dto.WithdrawDto;
+import com.xjrsoft.module.workflow.entity.WorkflowApproveRecord;
+import com.xjrsoft.module.workflow.entity.WorkflowCirculated;
+import com.xjrsoft.module.workflow.entity.WorkflowDelegate;
+import com.xjrsoft.module.workflow.entity.WorkflowDraft;
+import com.xjrsoft.module.workflow.entity.WorkflowExtra;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import com.xjrsoft.module.workflow.entity.WorkflowRecord;
+import com.xjrsoft.module.workflow.entity.WorkflowSchema;
+import com.xjrsoft.module.workflow.entity.WorkflowSchemaHistory;
+import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
+import com.xjrsoft.module.workflow.mapper.WorkflowDelegateMapper;
+import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
+import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
+import com.xjrsoft.module.workflow.mapper.WorkflowSchemaHistoryMapper;
+import com.xjrsoft.module.workflow.mapper.WorkflowSchemaMapper;
+import com.xjrsoft.module.workflow.mapper.XjrWorkflowExtraMapper;
+import com.xjrsoft.module.workflow.mapper.XjrWorkflowOperateRecordMapper;
+import com.xjrsoft.module.workflow.model.ApiConfig;
+import com.xjrsoft.module.workflow.model.ApiRequestParamsConfig;
+import com.xjrsoft.module.workflow.model.AuthConfig;
+import com.xjrsoft.module.workflow.model.ButtonConfig;
+import com.xjrsoft.module.workflow.model.FormAssignmentConfig;
+import com.xjrsoft.module.workflow.model.FormConfig;
+import com.xjrsoft.module.workflow.model.MemberConfig;
+import com.xjrsoft.module.workflow.model.ProcessParamConfig;
+import com.xjrsoft.module.workflow.model.RelationProcessConfig;
+import com.xjrsoft.module.workflow.model.StartNodeConfig;
+import com.xjrsoft.module.workflow.model.UserTaskConfig;
+import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
+import com.xjrsoft.module.workflow.service.IWorkflowApproveRecordService;
+import com.xjrsoft.module.workflow.service.IWorkflowCirculatedService;
+import com.xjrsoft.module.workflow.service.IWorkflowDraftService;
+import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
+import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
+import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
+import com.xjrsoft.module.workflow.service.IWorkflowRecordService;
+import com.xjrsoft.module.workflow.service.IXjrWorkflowOperateRecordService;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
-import com.xjrsoft.module.workflow.vo.*;
+import com.xjrsoft.module.workflow.vo.AllRecordListVo;
+import com.xjrsoft.module.workflow.vo.ApproveMultiInfoVo;
+import com.xjrsoft.module.workflow.vo.ApproveMultiVo;
+import com.xjrsoft.module.workflow.vo.CirculatedTaskPageVo;
+import com.xjrsoft.module.workflow.vo.DraftInfoVo;
+import com.xjrsoft.module.workflow.vo.DraftPageVo;
+import com.xjrsoft.module.workflow.vo.FinishedTaskPageVo;
+import com.xjrsoft.module.workflow.vo.FinishedTaskVo;
+import com.xjrsoft.module.workflow.vo.FormFinishedTaskVo;
+import com.xjrsoft.module.workflow.vo.GetAssigneeVo;
+import com.xjrsoft.module.workflow.vo.GetCountVo;
+import com.xjrsoft.module.workflow.vo.HistoryTaskVo;
+import com.xjrsoft.module.workflow.vo.LaunchAndApproveVo;
+import com.xjrsoft.module.workflow.vo.MonitorPageVo;
+import com.xjrsoft.module.workflow.vo.MyProcessPageVo;
+import com.xjrsoft.module.workflow.vo.PendingTaskVo;
+import com.xjrsoft.module.workflow.vo.ProcessInfoVo;
+import com.xjrsoft.module.workflow.vo.ProcessRecordListVo;
+import com.xjrsoft.module.workflow.vo.RecycleProcessInfoVo;
+import com.xjrsoft.module.workflow.vo.RecycleProcessPageVo;
+import com.xjrsoft.module.workflow.vo.RejectNodeVo;
+import com.xjrsoft.module.workflow.vo.RelationFormInfoVo;
+import com.xjrsoft.module.workflow.vo.RelationTaskInfoVo;
+import com.xjrsoft.module.workflow.vo.RelationTaskPageVo;
+import com.xjrsoft.module.workflow.vo.RestartVo;
+import com.xjrsoft.module.workflow.vo.StartNodeFormInfoVo;
+import com.xjrsoft.module.workflow.vo.StartProcessInfoVo;
+import com.xjrsoft.module.workflow.vo.StartProcessRelationTaskVo;
+import com.xjrsoft.module.workflow.vo.TaskInfoRelationTaskVo;
+import com.xjrsoft.module.workflow.vo.TaskInfoVo;
+import com.xjrsoft.module.workflow.vo.UserDefinedProcessRecordListVo;
+import com.xjrsoft.module.workflow.vo.UserTaskFormInfoVo;
+import com.xjrsoft.module.workflow.vo.UserTaskInfoVo;
+import com.xjrsoft.module.workflow.vo.UserTaskRelationTaskVo;
+import com.xjrsoft.module.workflow.vo.WorkflowSchemaInfoVo;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -61,7 +172,12 @@ import org.camunda.bpm.engine.HistoryService;
 import org.camunda.bpm.engine.RepositoryService;
 import org.camunda.bpm.engine.RuntimeService;
 import org.camunda.bpm.engine.TaskService;
-import org.camunda.bpm.engine.history.*;
+import org.camunda.bpm.engine.history.HistoricActivityInstance;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
+import org.camunda.bpm.engine.history.HistoricProcessInstanceQuery;
+import org.camunda.bpm.engine.history.HistoricTaskInstance;
+import org.camunda.bpm.engine.history.HistoricTaskInstanceQuery;
+import org.camunda.bpm.engine.history.HistoricVariableInstance;
 import org.camunda.bpm.engine.impl.persistence.entity.HistoricVariableInstanceEntity;
 import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;
 import org.camunda.bpm.engine.repository.Deployment;
@@ -83,7 +199,17 @@ import org.springframework.transaction.annotation.Transactional;
 import org.ssssssss.magicapi.core.service.MagicAPIService;
 
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -149,6 +275,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
      */
     private static final String DB_FIELD_XML_PREFIX = "xml";
 
+    private final OfficialDocumentReceivedMapper officialdocumentreceivedmapper;
+
 
     @Override
     public boolean deploy(DeployDto dto) {
@@ -378,7 +506,14 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
                 templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
             }
-
+            if(formInfoVo.getFormData().containsKey("document_level") && formInfoVo.getFormData().containsKey("emergency_level")){
+                Object id = formInfoVo.getFormData().get("id");
+                OfficialDocumentReceived received = officialdocumentreceivedmapper.selectById(id.toString());
+                if(received != null){
+                    formInfoVo.getFormData().computeIfAbsent("document_level", k -> received.getDocumentLevel());
+                    formInfoVo.getFormData().computeIfAbsent("emergency_level", k -> received.getEmergencyLevel());
+                }
+            }
             formInfoVos.add(formInfoVo);
         }
         vo.setFormInfos(formInfoVos);
@@ -608,6 +743,9 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 if (!taskNodeConfigMap.isPresent()) {
                     throw new MyException("找不到当前节点的配置信息!");
                 }
+                if(taskNodeConfigMap.get().get("styleType") != null){
+                    vo.setStyleType(Integer.parseInt(taskNodeConfigMap.get().get("styleType").toString()));
+                }
 
                 UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, taskNodeConfigMap.get());
 
@@ -1825,6 +1963,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             approveRecord.setStartUserId(MapUtil.getLong(variableMaps, WorkflowConstant.PROCESS_START_USER_ID_KEY));
             approveRecord.setApproveUserPostId(user.getPostId());
             approveRecord.setApproveType(dto.getApprovedType());
+
+            approveRecord.setShowNode(userTaskConfig.getShowNode());
             approveRecord.setApproveResult(buttonConfig.getButtonName());
 
             approveRecordService.save(approveRecord);
@@ -1928,6 +2068,15 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //新增流程自定义发起流程记录
                 XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
                 xjrWorkflowOperateRecord.setNodeId(task.getId());
+                if(userTaskConfig.getShowNode() != null){
+                    if(userTaskConfig.getShowNode()){
+                        xjrWorkflowOperateRecord.setShowNode(1);
+                    }else{
+                        xjrWorkflowOperateRecord.setShowNode(0);
+                    }
+                }else{
+                    xjrWorkflowOperateRecord.setShowNode(1);
+                }
                 xjrWorkflowOperateRecord.setNodeName(task.getName());
                 xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
                 xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
@@ -3381,8 +3530,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                             vo.setProcessId(e.getProcessId());
                             vo.setProcessName(e.getProcessName());
                             vo.setIsApproval(0);
-                            Integer taskCount = workflowRecordMapper.getTaskCount(e.getTaskId());
-                            if(taskCount > 1){
+                            List<WorkflowApproveRecord> list = approveRecordService.list(
+                                    new QueryWrapper<WorkflowApproveRecord>().lambda()
+                                            .eq(WorkflowApproveRecord::getProcessId, e.getProcessId())
+                            );
+                            if(list.size() > 0){
                                 vo.setIsApproval(1);
                             }
                             //如果是已经完成的任务 默认是100进度
@@ -3683,6 +3835,86 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return true;
     }
 
+    @Override
+    public boolean newWithdraw(WithdrawDto dto) {
+
+        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
+
+        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
+
+        if (historicProcessInstance.getEndTime() != null) {
+            throw new MyException("流程已经结束  无法撤回!");
+        }
+        //如果是简单流程 无多实例 无网关等组件 默认可以根据审批时间
+
+        //获取到当前活动的实例
+//        ActivityInstance activityInstance = runtimeService.getActivityInstance(dto.getProcessId());
+
+        //获取当前活动的任务信息
+        List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
+        //找到当前流程的 任务开始时间 最大值  为当前审批节点
+        WorkflowExtra workflowExtra = workflowExtras.stream()
+                .filter(e -> e.getProcessId().equals(dto.getProcessId()))
+                .max(Comparator.comparing(WorkflowExtra::getStartTime)).orElse(new WorkflowExtra());
+        //新增流程发起流程记录
+        WorkflowRecord record = new WorkflowRecord();
+        record.setNodeId(workflowExtra.getTaskId());
+        record.setNodeName(workflowExtra.getTaskName());
+        record.setNodeType(workflowExtra.getTaskName());
+        record.setProcessId(dto.getProcessId());
+        record.setSchemaId(workflowExtra.getSchemaId());
+        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+        record.setRecordTime(LocalDateTime.now());
+
+        runtimeService.deleteProcessInstance(historicProcessInstance.getId(), "【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到  开始节点!");
+        //保存流程撤回信息
+        workflowRecordMapper.insert(record);
+        workflowExtraMapper.delete(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
+
+        HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
+        //排除xml 查出数据
+        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, historicVariableInstance.getValue()));
+
+        //获取到整个流程模板的配置
+        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
+        List<Object> allFormConfigs = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsKey("formConfigs")).map(x -> x.get("formConfigs")).collect(Collectors.toList());
+        List<FormConfig> formConfigs = new ArrayList<>();
+
+        for (Object allFormConfig : allFormConfigs) {
+            List<FormConfig> thisNodeFormConfigs = Convert.toList(FormConfig.class, allFormConfig);
+            for (FormConfig thisNodeFormConfig : thisNodeFormConfigs) {
+                if (formConfigs.stream().noneMatch(x -> x.getKey().equals(thisNodeFormConfig.getKey()))) {
+                    formConfigs.add(thisNodeFormConfig);
+                }
+            }
+        }
+
+        String[] allFormKey = formConfigs.stream().map(FormConfig::getKey).toArray(String[]::new);
+        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableNameIn(allFormKey).list();
+        for (FormConfig formConfig : formConfigs) {
+
+            RelationFormInfoVo formInfoVo = new RelationFormInfoVo();
+            formInfoVo.setFormType(formConfig.getFormType());
+            formInfoVo.setFormConfig(formConfig);
+
+            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
+                Optional<HistoricVariableInstance> thisFormData = list.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst();
+
+                thisFormData.ifPresent(data -> {
+                    Map<String, Object> formData = Convert.toMap(String.class, Object.class, data.getValue());
+                    WorkflowDraft draft = new WorkflowDraft();
+                    draft.setSchemaId(workflowSchema.getId());
+                    draft.setDataId(formData.get("id").toString());
+                    draft.setFormData(JSONUtil.toJsonStr(formData));
+                    draft.setTaskId(workflowExtra.getTaskId());
+                    workflowDraftService.save(draft);
+                });
+            }
+        }
+
+        return true;
+    }
+
     @Override
     public boolean saveDraft(SaveDraftDto dto) {
 
@@ -4410,6 +4642,13 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             recordListVo.setNodeName(workflowOperateRecord.getNodeName());
             recordListVo.setComment(workflowOperateRecord.getOperateInfo());
             recordListVo.setStartTime(workflowOperateRecord.getRecordTime());
+
+            if(workflowOperateRecord.getShowNode() != null && workflowOperateRecord.getShowNode() == 0){
+                recordListVo.setShowNode(false);
+            }else if(workflowOperateRecord.getShowNode() != null && workflowOperateRecord.getShowNode() == 1){
+                recordListVo.setShowNode(true);
+            }
+
             recordListVo.setCirculateMessage(workflowOperateRecord.getCirculateMessage());
             recordListVos.add(recordListVo);
         }
@@ -5494,21 +5733,30 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         List<UserDefinedProcessRecordListVo> userDefinedProcessRecordListVos = new ArrayList<>();
         for (ProcessRecordListVo p : processRecordListVos) {
             String comment = p.getComment();
+            String approveComment = "";
+            if(!"".equals(comment) && comment != null){
+                approveComment = comment.substring(comment.indexOf("审批内容:")+5).replaceAll(", 未达到会签完成条件", "");
+            }
+
             String[] commentArr = comment.split(",");
             if (commentArr.length > 1) {
                 String[] approveUserNameArr = commentArr[0].split(":");
                 String[] approveResultArr = commentArr[1].split(":");
+                if(approveResultArr.length > 1 && "驳回".equals(approveResultArr[1])){
+                    continue;
+                }
                 String[] approveCommentArr = commentArr[2].split(":");
-                userDefinedProcessRecordListVos.add(new UserDefinedProcessRecordListVo() {{
-                    setNodeType(p.getNodeType());
-                    setNodeName(p.getNodeName());
-                    setComment(p.getComment());
-                    setStartTime(p.getStartTime());
-                    setCirculateMessage(p.getCirculateMessage());
-                    setApproveUserName(approveUserNameArr.length > 1 ? approveUserNameArr[1] : "");
-                    setApproveResult(approveResultArr.length > 1 ? approveResultArr[1] : "");
-                    setApproveComment(approveCommentArr.length > 1 ? approveCommentArr[1] : "");
-                }});
+                UserDefinedProcessRecordListVo recordListVo = new UserDefinedProcessRecordListVo();
+                recordListVo.setNodeType(p.getNodeType());
+                recordListVo.setShowNode(p.getShowNode());
+                recordListVo.setNodeName(p.getNodeName());
+                recordListVo.setComment(p.getComment());
+                recordListVo.setStartTime(p.getStartTime());
+                recordListVo.setCirculateMessage(p.getCirculateMessage());
+                recordListVo.setApproveUserName(approveUserNameArr.length > 1 ? approveUserNameArr[1] : "");
+                recordListVo.setApproveResult(approveResultArr.length > 1 ? approveResultArr[1] : "");
+                recordListVo.setApproveComment(approveComment);
+                userDefinedProcessRecordListVos.add(recordListVo);
             }
 
             if (p.getNodeName().equals("开始节点")) {
@@ -5516,6 +5764,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     setNodeType(p.getNodeType());
                     setComment(p.getComment());
                     setStartTime(p.getStartTime());
+                    setShowNode(false);
                     setCirculateMessage(p.getCirculateMessage());
                     setNodeName("流程发起");
                     setApproveResult("发起");

+ 6 - 0
src/main/java/com/xjrsoft/module/workflow/vo/ProcessRecordListVo.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.workflow.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.time.LocalDateTime;
@@ -36,4 +37,9 @@ public class ProcessRecordListVo {
      * 传阅信息
      */
     private String circulateMessage;
+
+    @ApiModelProperty("是否显示该节点")
+    private Boolean showNode;
+
+
 }

+ 1 - 0
src/main/java/com/xjrsoft/module/workflow/vo/UserTaskInfoVo.java

@@ -74,4 +74,5 @@ public class UserTaskInfoVo {
 
     @ApiModelProperty("样式(0:表单 1:表格)")
     private Integer styleType = 0;
+
 }

+ 18 - 0
src/main/resources/mapper/organization/UserMapper.xml

@@ -0,0 +1,18 @@
+<?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.organization.mapper.UserMapper">
+    <select id="getResetUserPage" parameterType="com.xjrsoft.module.organization.dto.UserPageDto" resultType="com.xjrsoft.module.organization.vo.ResetUserPageVo">
+        SELECT DISTINCT t1.*,t3.name AS gender_cn FROM xjr_user t1
+        INNER JOIN xjr_user_role_relation t2 ON t2.user_id = t1.id
+        LEFT JOIN xjr_dictionary_detail t3 ON t1.gender = t3.code
+        WHERE t1.delete_mark = 0
+        <if test="dto.keyword != null and dto.keyword !=''">
+            and (t1.name like concat('%', #{dto.keyword}, '%') or t1.mobile like concat('%', #{dto.keyword}, '%'))
+        </if>
+        <if test="dto.roleId != null">
+            and t2.role_id = #{dto.roleId}
+        </if>
+    </select>
+</mapper>

+ 9 - 5
src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml

@@ -32,9 +32,9 @@
             t13.name AS roll_modality,
             t11.name AS student_form,
             MAX(CASE WHEN t10.feeitemcode LIKE '999010604%' THEN t10.jfzt ELSE NULL END) AS jxf,
-            MAX(CASE WHEN t10.feeitemcode = 103042766003001 AND t10.beltcode LIKE '%2024%' THEN t10.jfzt ELSE NULL END) AS ssf,
+            MAX(CASE WHEN t10.feeitemcode = 103042766003001 AND LEFT(t10.beltcode, 4) = DATE_FORMAT(CURRENT_DATE, '%Y') THEN t10.jfzt ELSE NULL END) AS ssf,
             MAX(CASE WHEN t10.feeitemcode LIKE '999010603%' THEN t10.jfzt ELSE NULL END) AS jcf,
-        CONCAT(t16.name, ' ', t15.room_name, ' ', t14.bed_number) AS bed_info
+            CONCAT(t16.name, ' ', t15.room_name, ' ', t14.bed_number) AS bed_info
         FROM base_student t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
         INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
@@ -109,8 +109,9 @@
                t3.roll_modality                                                                                              as rollModalityCode,
                 t12.name AS student_form,
                MAX(CASE WHEN t14.feeitemcode LIKE '999010604%' THEN t14.jfzt ELSE NULL END) AS jxf,
-               MAX(CASE WHEN t14.feeitemcode = 103042766003001 AND t14.beltcode LIKE '%2024%' THEN t14.jfzt ELSE NULL END) AS ssf,
-               MAX(CASE WHEN t14.feeitemcode LIKE '999010603%' THEN t14.jfzt ELSE NULL END) AS jcf
+               MAX(CASE WHEN t14.feeitemcode = 103042766003001 AND LEFT(t14.beltcode, 4) = DATE_FORMAT(CURRENT_DATE, '%Y') THEN t14.jfzt ELSE NULL END) AS ssf,
+               MAX(CASE WHEN t14.feeitemcode LIKE '999010603%' THEN t14.jfzt ELSE NULL END) AS jcf,
+               CONCAT(t17.name, ' ', t16.room_name, ' ', t15.bed_number) AS bed_info
         FROM base_student t1
                  INNER JOIN xjr_user t2 ON t1.user_id = t2.id
                  INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
@@ -125,11 +126,14 @@
                  LEFT JOIN xjr_dictionary_detail t12 ON t12.code = t3.student_type
                  LEFT JOIN pb_v_xssfdetail t13 ON t13.personalid = t1.student_id
                  LEFT JOIN pb_v_xsxxsfytb t14 ON t14.Studentcode = t13.personalid
+                 left join room_bed t15 on t15.student_user_id = t1.user_id
+                 left join room t16 on t16.id = t15.room_id
+                 left join base_office_build t17 on t17.id = t16.office_build_id
         WHERE t2.id = #{id}
         GROUP BY t2.id, t2.name, t2.mobile, t2.gender, t11.name, t1.student_id, t5.name, t5.mobile, t4.name,
                  (SELECT mobile FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t2.id AND is_guardian = 1),
                  t8.name, t7.name, t9.name, t2.birth_date, t2.avatar, t6.name, t10.name, t3.archives_status, t3.stduy_status,
-                 t3.roll_modality, t3.archives_status, t3.stduy_status, t3.roll_modality, t12.name
+                 t3.roll_modality, t3.archives_status, t3.stduy_status, t3.roll_modality, t12.name, CONCAT(t17.name, ' ', t16.room_name, ' ', t15.bed_number)
     </select>
     <update id="updateInfoByUserId" parameterType="com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto">
         UPDATE base_student_school_roll SET delete_mark = delete_mark

+ 1 - 1
src/test/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImplTest.java

@@ -18,6 +18,6 @@ class WorkflowExecuteServiceImplTest {
     @Test
     public void testDeleteTask(){
         //taskService.deleteTask("8abd7148-e58b-11ee-a00e-0242c8000007");
-        runtimeService.deleteProcessInstance("8a8990df-e58b-11ee-a00e-0242c8000007", "该流程已经停止");
+        runtimeService.deleteProcessInstance("45a1a081-f8a0-11ee-92e5-0242d200000c", "该流程已经停止");
     }
 }