Browse Source

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

# Conflicts:
#	src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java
fanxp 1 year ago
parent
commit
a9bb86448d
80 changed files with 2512 additions and 269 deletions
  1. 39 0
      src/main/java/com/xjrsoft/common/enums/GenderDictionaryEnum.java
  2. 166 0
      src/main/java/com/xjrsoft/common/utils/FileZipUtil.java
  3. 10 0
      src/main/java/com/xjrsoft/module/ledger/entity/WfSubscription.java
  4. 2 0
      src/main/java/com/xjrsoft/module/ledger/service/IWfSubscriptionService.java
  5. 61 5
      src/main/java/com/xjrsoft/module/ledger/service/impl/WfSubscriptionServiceImpl.java
  6. 31 0
      src/main/java/com/xjrsoft/module/liteflow/node/WfSubscriptionNode.java
  7. 4 0
      src/main/java/com/xjrsoft/module/organization/controller/RoleController.java
  8. 10 2
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  9. 1 1
      src/main/java/com/xjrsoft/module/organization/dto/DepartmentPageDto.java
  10. 1 1
      src/main/java/com/xjrsoft/module/organization/dto/DepartmentTreeDto.java
  11. 1 1
      src/main/java/com/xjrsoft/module/organization/dto/PostTreeDto.java
  12. 2 1
      src/main/java/com/xjrsoft/module/organization/entity/User.java
  13. 6 1
      src/main/java/com/xjrsoft/module/organization/vo/UserInfoVo.java
  14. 6 1
      src/main/java/com/xjrsoft/module/organization/vo/UserPageVo.java
  15. 6 1
      src/main/java/com/xjrsoft/module/organization/vo/UserRoleVo.java
  16. 6 1
      src/main/java/com/xjrsoft/module/organization/vo/UserVo.java
  17. 7 13
      src/main/java/com/xjrsoft/module/personnel/controller/LaborManagementController.java
  18. 4 0
      src/main/java/com/xjrsoft/module/personnel/mapper/LaborManagementMapper.java
  19. 4 0
      src/main/java/com/xjrsoft/module/personnel/service/ILaborManagementService.java
  20. 7 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/LaborManagementServiceImpl.java
  21. 2 1
      src/main/java/com/xjrsoft/module/personnel/vo/LaborManagementPageVo.java
  22. 1 2
      src/main/java/com/xjrsoft/module/room/controller/RoomBedController.java
  23. 3 4
      src/main/java/com/xjrsoft/module/room/dto/RoomBedPageDto.java
  24. 8 0
      src/main/java/com/xjrsoft/module/room/mapper/RoomBedMapper.java
  25. 2 0
      src/main/java/com/xjrsoft/module/room/service/IRoomBedService.java
  26. 10 23
      src/main/java/com/xjrsoft/module/room/service/impl/RoomBedServiceImpl.java
  27. 28 0
      src/main/java/com/xjrsoft/module/room/vo/RoomBedInfoVo.java
  28. 38 17
      src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java
  29. 1 0
      src/main/java/com/xjrsoft/module/schedule/util/ScheduleUtil.java
  30. 70 0
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentInfoController.java
  31. 7 2
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  32. 47 0
      src/main/java/com/xjrsoft/module/student/dto/BaseStudentInfoPageDto.java
  33. 39 0
      src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentInfoDto.java
  34. 1 1
      src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentUserDto.java
  35. 1 1
      src/main/java/com/xjrsoft/module/student/entity/BaseStudentUser.java
  36. 15 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java
  37. 46 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  38. 20 0
      src/main/java/com/xjrsoft/module/student/service/impl/IBaseStudentSchoolRollService.java
  39. 98 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java
  40. 49 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageVo.java
  41. 6 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserPageVo.java
  42. 8 1
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserVo.java
  43. 11 0
      src/main/java/com/xjrsoft/module/system/controller/FileController.java
  44. 20 0
      src/main/java/com/xjrsoft/module/system/dto/FileDownloadDto.java
  45. 3 0
      src/main/java/com/xjrsoft/module/system/service/IFileService.java
  46. 60 0
      src/main/java/com/xjrsoft/module/system/service/impl/FileServiceImpl.java
  47. 9 1
      src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java
  48. 1 1
      src/main/java/com/xjrsoft/module/teacher/entity/XjrUser.java
  49. 6 0
      src/main/java/com/xjrsoft/module/teacher/vo/XjrUserPageVo.java
  50. 6 1
      src/main/java/com/xjrsoft/module/teacher/vo/XjrUserVo.java
  51. 3 1
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookController.java
  52. 10 42
      src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java
  53. 73 0
      src/main/java/com/xjrsoft/module/workflow/dto/AddXjrWorkflowOperateRecordDto.java
  54. 32 0
      src/main/java/com/xjrsoft/module/workflow/dto/UpdateXjrWorkflowOperateRecordDto.java
  55. 26 0
      src/main/java/com/xjrsoft/module/workflow/dto/XjrWorkflowOperateRecordPageDto.java
  56. 0 1
      src/main/java/com/xjrsoft/module/workflow/entity/WorkflowRecord.java
  57. 92 0
      src/main/java/com/xjrsoft/module/workflow/entity/XjrWorkflowOperateRecord.java
  58. 17 0
      src/main/java/com/xjrsoft/module/workflow/mapper/XjrWorkflowOperateRecordMapper.java
  59. 4 58
      src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java
  60. 17 0
      src/main/java/com/xjrsoft/module/workflow/service/IXjrWorkflowOperateRecordService.java
  61. 264 2
      src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java
  62. 25 0
      src/main/java/com/xjrsoft/module/workflow/service/impl/XjrWorkflowOperateRecordServiceImpl.java
  63. 26 0
      src/main/java/com/xjrsoft/module/workflow/vo/UserDefinedProcessRecordListVo.java
  64. 79 0
      src/main/java/com/xjrsoft/module/workflow/vo/XjrWorkflowOperateRecordPageVo.java
  65. 74 0
      src/main/java/com/xjrsoft/module/workflow/vo/XjrWorkflowOperateRecordVo.java
  66. 1 1
      src/main/resources/application-pre.yml
  67. 1 1
      src/main/resources/application-prod.yml
  68. 62 17
      src/main/resources/mapper/personnel/LaborManagementMapper.xml
  69. 14 22
      src/main/resources/mapper/room/RoomBedMapper.xml
  70. 68 0
      src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml
  71. 4 4
      src/main/resources/mapper/teacher/AttendancePersonnelMapper.xml
  72. 26 7
      src/main/resources/mapper/textbook/TextbookIssueRecordMapper.xml
  73. 38 29
      src/main/resources/mapper/textbook/TextbookMapper.xml
  74. 0 1
      src/main/resources/mapper/textbook/TextbookWarehouseRecordMapper.xml
  75. 17 0
      src/test/java/com/xjrsoft/module/ledger/service/impl/WfSubscriptionServiceImplTest.java
  76. 20 0
      src/test/java/com/xjrsoft/module/system/service/impl/FileServiceImplTest.java
  77. 240 0
      src/test/java/com/xjrsoft/xjrsoftboot/DataMaintenanceTest.java
  78. 30 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java
  79. 188 0
      src/test/java/com/xjrsoft/xjrsoftboot/ScheduleLoginTest.java
  80. 71 0
      src/test/java/com/xjrsoft/xjrsoftboot/StudentInfo.java

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

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

+ 166 - 0
src/main/java/com/xjrsoft/common/utils/FileZipUtil.java

@@ -0,0 +1,166 @@
+package com.xjrsoft.common.utils;
+
+import java.io.*;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * @author dzx
+ * @Description 文件压缩工具
+ * 2023/12/5
+ */
+public class FileZipUtil {
+    public static ByteArrayInputStream inputStream2ByteArray(InputStream in, boolean isClose) {
+        byte[] byteArray = null;
+        try {
+            int total = in.available();
+            byteArray = new byte[total];
+            in.read(byteArray);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (isClose) {
+                try {
+                    in.close();
+                } catch (Exception e2) {
+                    //zou.log.Logger.getServerlog().error(" ر   ʧ  ");
+                }
+            }
+        }
+        return new ByteArrayInputStream(byteArray);
+    }
+
+    public static byte[] byteArray(InputStream in, boolean isClose) {
+        byte[] byteArray = null;
+        try {
+            int total = in.available();
+            byteArray = new byte[total];
+            in.read(byteArray);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (isClose) {
+                try {
+                    in.close();
+                } catch (Exception e2) {
+                    //zou.log.Logger.getServerlog().error(" ر   ʧ  ");
+                }
+            }
+        }
+        return byteArray;
+    }
+
+    public static void zipFiles(File[] srcfile, File zipfile) {
+        byte[] buf = new byte[1024];
+        try {
+            // ZipOutputStream ࣺ    ļ    ļ  е ѹ
+            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
+            for (int i = 0; i < srcfile.length; i++) {
+                FileInputStream in = new FileInputStream(srcfile[i]);
+                out.putNextEntry(new ZipEntry(srcfile[i].getName()));
+                int len;
+                while ((len = in.read(buf)) > 0) {
+                    out.write(buf, 0, len);
+                }
+                out.closeEntry();
+                in.close();
+            }
+            out.close();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            //zou.log.Logger.getServerlog().error("ѹ  ʧ   "+e.toString());
+        }
+    }
+
+    public static void zipFiles(List<File> fileList, File zipfile) {
+        byte[] buf = new byte[1024];
+        try {
+            // ZipOutputStream ࣺ    ļ    ļ  е ѹ
+            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
+            for(File file : fileList) {
+                FileInputStream in = new FileInputStream(file);
+                out.putNextEntry(new ZipEntry(file.getName()));
+                int len;
+                while ((len = in.read(buf)) > 0) {
+                    out.write(buf, 0, len);
+                }
+                out.closeEntry();
+                in.close();
+            }
+            out.close();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+
+            //zou.log.Logger.getServerlog().error("ѹ  ʧ   "+e.toString());
+        }
+    }
+
+
+    public static byte[] byteAryMap2Zip(Map<String,byte[]> byteAryMap) {
+        byte[] buf = new byte[1024];
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            // ZipOutputStream ࣺ    ļ    ļ  е ѹ
+            ZipOutputStream out = new ZipOutputStream(baos);
+            for(String fileName : byteAryMap.keySet()) {
+                byte[] byteAry = byteAryMap.get(fileName);
+                ByteArrayInputStream in = new ByteArrayInputStream(byteAry);
+                out.putNextEntry(new ZipEntry(fileName));
+                int len;
+                while ((len = in.read(buf)) > 0) {
+                    out.write(buf, 0, len);
+                }
+                out.closeEntry();
+                in.close();
+            }
+            out.close();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+
+            //zou.log.Logger.getServerlog().error("ѹ  ʧ   "+e.toString());
+        }
+        return baos.toByteArray();
+    }
+
+    public static boolean createFloder(File file) {
+        if (!file.exists()) {
+            file.mkdir();
+        }
+        return true;
+    }
+    public static boolean createFile(File file) {
+
+        if (!file.exists()) {
+            try {
+                file.createNewFile();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return true;
+    }
+    public static String saveFile(String fileName,byte[] fileContent) {
+        File file1 = new File("D:\\     ļ \\flew\\");
+        File file = new File("D:\\     ļ \\flew\\"+fileName);
+        FileOutputStream out = null;
+        createFloder(file1);
+        createFile(file);
+        try {
+            out = new FileOutputStream(file);
+            out.write(fileContent);
+            out.flush();
+            out.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return file.getPath();
+    }
+}

+ 10 - 0
src/main/java/com/xjrsoft/module/ledger/entity/WfSubscription.java

@@ -57,6 +57,16 @@ public class WfSubscription implements Serializable {
     */
     */
     @ApiModelProperty("附件")
     @ApiModelProperty("附件")
     private String folderId;
     private String folderId;
+    /**
+     * 编号
+     */
+    @ApiModelProperty("编号")
+    private String number;
+    /**
+     * 状态(0:未审核 1:审核)
+     */
+    @ApiModelProperty("状态(0:未审核 1:审核)")
+    private Integer status;
 
 
     /**
     /**
     * wfSubscriptionList
     * wfSubscriptionList

+ 2 - 0
src/main/java/com/xjrsoft/module/ledger/service/IWfSubscriptionService.java

@@ -60,4 +60,6 @@ public interface IWfSubscriptionService extends MPJBaseService<WfSubscription> {
      * 列表查询
      * 列表查询
      */
      */
     List<WfSubscriptionExcelVo> getList(WfSubscriptionPageDto dto);
     List<WfSubscriptionExcelVo> getList(WfSubscriptionPageDto dto);
+
+    Boolean dataHandle(Long formId);
 }
 }

+ 61 - 5
src/main/java/com/xjrsoft/module/ledger/service/impl/WfSubscriptionServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.ledger.service.impl;
 package com.xjrsoft.module.ledger.service.impl;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -20,6 +21,7 @@ import com.xjrsoft.module.ledger.vo.WfSubscriptionPageVo;
 import com.xjrsoft.module.ledger.vo.WorkflowRecordVo;
 import com.xjrsoft.module.ledger.vo.WorkflowRecordVo;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.textbook.entity.WfTextbookRecede;
 import com.xjrsoft.module.workflow.entity.WorkflowExtra;
 import com.xjrsoft.module.workflow.entity.WorkflowExtra;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.entity.WorkflowRecord;
 import com.xjrsoft.module.workflow.entity.WorkflowRecord;
@@ -31,11 +33,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -198,4 +198,60 @@ public class WfSubscriptionServiceImpl extends MPJBaseServiceImpl<WfSubscription
         }
         }
         return result;
         return result;
     }
     }
+
+    @Override
+    public Boolean dataHandle(Long formId) {
+        WfSubscription wfSubscription = this.getById(formId);
+
+        if(wfSubscription != null){
+            //获取当前内存中的最大编号
+            LambdaQueryWrapper<WfSubscription> wfSubscriptionLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            wfSubscriptionLambdaQueryWrapper
+                    .select(WfSubscription::getNumber)
+                    .orderByDesc(WfSubscription::getNumber)
+                    .last("limit 1");
+            WfSubscription wfSubscriptionMax = this.getOne(wfSubscriptionLambdaQueryWrapper);
+            if(wfSubscriptionMax != null){
+                String number = wfSubscriptionMax.getNumber();
+                String ysarStr = "";
+                String lastThreeChars = "";
+                if(number != null && number.length() >= 3) {
+                    number = number.trim();
+                    ysarStr = number.substring(0, number.length() - 3);
+                    lastThreeChars = number.substring(number.length() - 3);
+                }
+
+                Date shenQingRiQi = wfSubscription.getShenQingRiQi4752();
+                LocalDate localDate = shenQingRiQi.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+
+                String year = String.valueOf(localDate.getYear());
+
+                WfSubscription wfSubscriptionNew = new WfSubscription();
+
+                if(year.equals(ysarStr)){
+                    int num = Integer.parseInt(lastThreeChars);
+                    num = num + 1;
+                    wfSubscriptionNew.setNumber(ysarStr+num);
+                }else {
+                    wfSubscriptionNew.setNumber(ysarStr+"001");
+                }
+                wfSubscriptionNew.setId(wfSubscription.getId());
+                wfSubscriptionNew.setStatus(1);
+
+                this.updateById(wfSubscriptionNew);
+            }else{
+                Date shenQingRiQi = wfSubscription.getShenQingRiQi4752();
+                LocalDate localDate = shenQingRiQi.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+
+                String year = String.valueOf(localDate.getYear());
+                WfSubscription wfSubscriptionNew = new WfSubscription();
+                wfSubscriptionNew.setNumber(year+"001");
+                wfSubscriptionNew.setId(wfSubscription.getId());
+                wfSubscriptionNew.setStatus(1);
+
+                this.updateById(wfSubscriptionNew);
+            }
+        }
+        return true;
+    }
 }
 }

+ 31 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfSubscriptionNode.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.ledger.service.IWfSubscriptionService;
+import com.xjrsoft.module.textbook.service.IWfTextbookRecedeService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 物品申购流程走完节点
+ */
+@Component("wf_subscription_node")
+public class WfSubscriptionNode extends NodeComponent {
+    @Autowired
+    private IWfSubscriptionService wfSubscriptionService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            wfSubscriptionService.dataHandle(formId);
+        }
+    }
+}

+ 4 - 0
src/main/java/com/xjrsoft/module/organization/controller/RoleController.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.YesOrNoEnum;
 import com.xjrsoft.common.enums.YesOrNoEnum;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
@@ -177,6 +178,9 @@ public class RoleController {
         List<Long> userIds = list.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList());
         List<Long> userIds = list.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList());
         List<User> users = userService.list(Wrappers.<User>query().lambda().in(User::getId, userIds).select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserRoleVo.class).contains(x.getProperty())));
         List<User> users = userService.list(Wrappers.<User>query().lambda().in(User::getId, userIds).select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserRoleVo.class).contains(x.getProperty())));
         List<UserRoleVo> userRoleVos = BeanUtil.copyToList(users, UserRoleVo.class);
         List<UserRoleVo> userRoleVos = BeanUtil.copyToList(users, UserRoleVo.class);
+        for (UserRoleVo userRoleVo : userRoleVos) {
+            userRoleVo.setGenderCn(GenderDictionaryEnum.getValue(userRoleVo.getGender()));
+        }
         return R.ok(userRoleVos);
         return R.ok(userRoleVos);
 
 
     }
     }

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

@@ -13,6 +13,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.R;
@@ -30,6 +31,7 @@ import com.xjrsoft.module.organization.service.*;
 import com.xjrsoft.module.organization.utils.OrganizationUtil;
 import com.xjrsoft.module.organization.utils.OrganizationUtil;
 import com.xjrsoft.module.organization.vo.*;
 import com.xjrsoft.module.organization.vo.*;
 import com.xjrsoft.module.oss.factory.OssFactory;
 import com.xjrsoft.module.oss.factory.OssFactory;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -136,7 +138,9 @@ public class UserController {
                     .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
                     .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
                     .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
                     .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class, queryUser);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class, queryUser);
-
+            for (UserPageVo record : page.getRecords()) {
+                record.setGenderCn(GenderDictionaryEnum.getValue(record.getGender()));
+            }
 
 
             PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page, UserPageVo.class);
             PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page, UserPageVo.class);
 
 
@@ -171,6 +175,9 @@ public class UserController {
                             .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
                             .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
                             .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
                             .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,queryUser);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,queryUser);
+            for (UserPageVo record : page.getRecords()) {
+                record.setGenderCn(GenderDictionaryEnum.getValue(record.getGender()));
+            }
             PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page, UserPageVo.class);
             PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page, UserPageVo.class);
             return R.ok(pageOutput);
             return R.ok(pageOutput);
         }
         }
@@ -184,6 +191,7 @@ public class UserController {
             R.error("找不到此用户!");
             R.error("找不到此用户!");
         }
         }
         UserVo userVo = BeanUtil.toBean(user, UserVo.class);
         UserVo userVo = BeanUtil.toBean(user, UserVo.class);
+        userVo.setGenderCn(GenderDictionaryEnum.getValue(userVo.getGender()));
         List<Long> deptIds = userDeptRelationService.list(Wrappers.lambdaQuery(UserDeptRelation.class)
         List<Long> deptIds = userDeptRelationService.list(Wrappers.lambdaQuery(UserDeptRelation.class)
                         .eq(UserDeptRelation::getUserId, user.getId()))
                         .eq(UserDeptRelation::getUserId, user.getId()))
                 .stream().map(UserDeptRelation::getDeptId).collect(Collectors.toList());
                 .stream().map(UserDeptRelation::getDeptId).collect(Collectors.toList());
@@ -210,7 +218,6 @@ public class UserController {
     @GetMapping(value = "/current/info")
     @GetMapping(value = "/current/info")
     @ApiOperation(value = "当前登录用户信息")
     @ApiOperation(value = "当前登录用户信息")
     public R info() {
     public R info() {
-
         SaSession tokenSession = StpUtil.getTokenSession();
         SaSession tokenSession = StpUtil.getTokenSession();
         User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
         User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
 
 
@@ -227,6 +234,7 @@ public class UserController {
                 .stream().map(UserPostRelation::getPostId).collect(Collectors.toList());
                 .stream().map(UserPostRelation::getPostId).collect(Collectors.toList());
 
 
         UserInfoVo vo = BeanUtil.toBean(user, UserInfoVo.class);
         UserInfoVo vo = BeanUtil.toBean(user, UserInfoVo.class);
+        vo.setGenderCn(GenderDictionaryEnum.getValue(vo.getGender()));
         if (roleIds.size() > 0) {
         if (roleIds.size() > 0) {
 
 
             List<Role> list = roleService.list(Wrappers.lambdaQuery(Role.class).in(Role::getId, roleIds));
             List<Role> list = roleService.list(Wrappers.lambdaQuery(Role.class).in(Role::getId, roleIds));

+ 1 - 1
src/main/java/com/xjrsoft/module/organization/dto/DepartmentPageDto.java

@@ -15,7 +15,7 @@ import org.hibernate.validator.constraints.Length;
 @Data
 @Data
 public class DepartmentPageDto extends PageInput {
 public class DepartmentPageDto extends PageInput {
 
 
-    @Length(min = 1,max = 20,message = "机构名称最少2个字符,最多20个字符!")
+    @Length(min = 1,max = 50,message = "机构名称最少2个字符,最多50个字符!")
     private String name;
     private String name;
 
 
     @Length(min = 1,max = 10,message = "机构编码最少2个字符,最多10个字符!")
     @Length(min = 1,max = 10,message = "机构编码最少2个字符,最多10个字符!")

+ 1 - 1
src/main/java/com/xjrsoft/module/organization/dto/DepartmentTreeDto.java

@@ -12,7 +12,7 @@ import org.hibernate.validator.constraints.Length;
 @Data
 @Data
 public class DepartmentTreeDto {
 public class DepartmentTreeDto {
 
 
-    @Length(min = 1,max = 20,message = "机构名称最少2个字符,最多20个字符!")
+    @Length(min = 1,max = 50,message = "机构名称最少2个字符,最多50个字符!")
     private String name;
     private String name;
 
 
     @Length(min = 1,max = 10,message = "机构编码最少2个字符,最多10个字符!")
     @Length(min = 1,max = 10,message = "机构编码最少2个字符,最多10个字符!")

+ 1 - 1
src/main/java/com/xjrsoft/module/organization/dto/PostTreeDto.java

@@ -9,7 +9,7 @@ import org.hibernate.validator.constraints.Length;
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 public class PostTreeDto extends ListInput {
 public class PostTreeDto extends ListInput {
 
 
-    @Length(min = 1,max = 20,message = "机构名称最少2个字符,最多20个字符!")
+    @Length(min = 1,max = 50,message = "机构名称最少2个字符,最多50个字符!")
     private String name;
     private String name;
 
 
     @Length(min = 1,max = 10,message = "机构编码最少2个字符,最多10个字符!")
     @Length(min = 1,max = 10,message = "机构编码最少2个字符,最多10个字符!")

+ 2 - 1
src/main/java/com/xjrsoft/module/organization/entity/User.java

@@ -45,7 +45,8 @@ public class User extends AuditEntity implements Serializable {
     private String password;
     private String password;
 
 
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
+
 
 
     @ApiModelProperty("手机号")
     @ApiModelProperty("手机号")
     private String mobile;
     private String mobile;

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

@@ -47,7 +47,12 @@ public class UserInfoVo {
     /**
     /**
      * 性别
      * 性别
      */
      */
-    private Integer gender;
+    private String gender;
+
+    /**
+     * 性别中文
+     */
+    private String genderCn;
 
 
     /**
     /**
      * 手机号
      * 手机号

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

@@ -43,7 +43,12 @@ public class UserPageVo implements Serializable {
     /**
     /**
      * 性别
      * 性别
      */
      */
-    private Integer gender;
+    private String gender;
+
+    /**
+     * 性别中文
+     */
+    private String genderCn;
 
 
     /**
     /**
      * 手机号
      * 手机号

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

@@ -21,5 +21,10 @@ public class UserRoleVo {
      */
      */
     private String code;
     private String code;
 
 
-    private Integer gender;
+    private String gender;
+
+    /**
+     * 性别中文
+     */
+    private String genderCn;
 }
 }

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

@@ -41,7 +41,12 @@ public class UserVo implements Serializable {
     /**
     /**
      * 性别
      * 性别
      */
      */
-    private Integer gender;
+    private String gender;
+
+    /**
+     * 性别中文
+     */
+    private String genderCn;
 
 
     /**
     /**
      * 手机号
      * 手机号

+ 7 - 13
src/main/java/com/xjrsoft/module/personnel/controller/LaborManagementController.java

@@ -61,19 +61,13 @@ public class LaborManagementController {
 
 
     @GetMapping("/export")
     @GetMapping("/export")
     @ApiOperation(value = "导出")
     @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid LaborManagementPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
-        List<LaborManagement> list = laborManagementService.list();
+    public ResponseEntity<byte[]> exportData() {
+        List<LaborManagementPageVo> list = laborManagementService.listLaborManagementPageVo();
 
 
-        List<LaborManagementPageVo> customerList = new ArrayList<>();
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
-
-        for (LaborManagement vo : list) {
-            LaborManagementPageVo listVo = BeanUtil.toBean(vo, LaborManagementPageVo.class);
-//            LaborManagementPageDto listDto = BeanUtil.toBean(vo, LaborManagementPageDto.class);
-//            listDto.setStartWorkTime(sdf.format(dto.getStartWorkTime()));
-
-            customerList.add(listVo);
-        }
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
+//        for (LaborManagementPageVo vo : list) {
+//            vo.setStartWorkTime(sdf.format(vo.getStartWorkTime()));
+//        }
 
 
         // 写入Excel
         // 写入Excel
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
@@ -81,7 +75,7 @@ public class LaborManagementController {
                 .automaticMergeHead(false)
                 .automaticMergeHead(false)
                 .excelType(ExcelTypeEnum.XLSX)
                 .excelType(ExcelTypeEnum.XLSX)
                 .sheet()
                 .sheet()
-                .doWrite(customerList);
+                .doWrite(list);
 
 
         // 返回文件流
         // 返回文件流
         return RT.fileStream(bot.toByteArray(), "LaborManagement" + ExcelTypeEnum.XLSX.getValue());
         return RT.fileStream(bot.toByteArray(), "LaborManagement" + ExcelTypeEnum.XLSX.getValue());

+ 4 - 0
src/main/java/com/xjrsoft/module/personnel/mapper/LaborManagementMapper.java

@@ -10,6 +10,8 @@ import com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto;
 import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
+import java.util.List;
+
 /**
 /**
 * @title: 劳资管理信息表
 * @title: 劳资管理信息表
 * @Author brealinxx
 * @Author brealinxx
@@ -19,4 +21,6 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 @Mapper
 public interface LaborManagementMapper extends MPJBaseMapper<LaborManagement> {
 public interface LaborManagementMapper extends MPJBaseMapper<LaborManagement> {
     Page<LaborManagementPageVo> getPage(Page<LaborManagementPageDto> page, LaborManagementPageDto dto);
     Page<LaborManagementPageVo> getPage(Page<LaborManagementPageDto> page, LaborManagementPageDto dto);
+
+    List<LaborManagementPageVo> listLaborManagementPageVo();
 }
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/personnel/service/ILaborManagementService.java

@@ -12,6 +12,8 @@ import com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto;
 import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 import com.xjrsoft.module.weekly.entity.WeeklyDutySchedule;
 import com.xjrsoft.module.weekly.entity.WeeklyDutySchedule;
 
 
+import java.util.List;
+
 /**
 /**
 * @title: 劳资管理信息表
 * @title: 劳资管理信息表
 * @Author brealinxx
 * @Author brealinxx
@@ -21,4 +23,6 @@ import com.xjrsoft.module.weekly.entity.WeeklyDutySchedule;
 
 
 public interface ILaborManagementService extends MPJBaseService<LaborManagement>  {
 public interface ILaborManagementService extends MPJBaseService<LaborManagement>  {
     Page<LaborManagementPageVo> getPage(Page<LaborManagementPageDto> page, LaborManagementPageDto dto);
     Page<LaborManagementPageVo> getPage(Page<LaborManagementPageDto> page, LaborManagementPageDto dto);
+
+    List<LaborManagementPageVo> listLaborManagementPageVo();
 }
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/LaborManagementServiceImpl.java

@@ -14,6 +14,8 @@ import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 /**
 /**
  * @title: 劳资管理信息表
  * @title: 劳资管理信息表
  * @Author brealinxx
  * @Author brealinxx
@@ -31,4 +33,9 @@ public class LaborManagementServiceImpl extends MPJBaseServiceImpl<LaborManageme
         return laborManagementMapper.getPage(page, dto);
         return laborManagementMapper.getPage(page, dto);
     }
     }
 
 
+    @Override
+    public List<LaborManagementPageVo> listLaborManagementPageVo() {
+        return laborManagementMapper.listLaborManagementPageVo();
+    }
+
 }
 }

+ 2 - 1
src/main/java/com/xjrsoft/module/personnel/vo/LaborManagementPageVo.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.personnel.vo;
 package com.xjrsoft.module.personnel.vo;
 
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ContentStyle;
 import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
@@ -20,7 +21,7 @@ public class LaborManagementPageVo {
     * 主键
     * 主键
     */
     */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("主键")
+    @ExcelIgnore
     @ApiModelProperty("主键")
     @ApiModelProperty("主键")
     private String id;
     private String id;
 
 

+ 1 - 2
src/main/java/com/xjrsoft/module/room/controller/RoomBedController.java

@@ -100,14 +100,13 @@ public class RoomBedController {
     public RT<Boolean> add(@Valid @RequestBody AddRoomBedDto dto){
     public RT<Boolean> add(@Valid @RequestBody AddRoomBedDto dto){
         RoomBed roomBed = BeanUtil.toBean(dto, RoomBed.class);
         RoomBed roomBed = BeanUtil.toBean(dto, RoomBed.class);
         boolean isSuccess = roomBedService.save(roomBed);
         boolean isSuccess = roomBedService.save(roomBed);
-    return RT.ok(isSuccess);
+        return RT.ok(isSuccess);
     }
     }
 
 
     @PutMapping
     @PutMapping
     @ApiOperation(value = "修改寝室床位")
     @ApiOperation(value = "修改寝室床位")
     @SaCheckPermission("roombed:edit")
     @SaCheckPermission("roombed:edit")
     public RT<Boolean> update(@Valid @RequestBody UpdateRoomBedDto dto){
     public RT<Boolean> update(@Valid @RequestBody UpdateRoomBedDto dto){
-
         RoomBed roomBed = BeanUtil.toBean(dto, RoomBed.class);
         RoomBed roomBed = BeanUtil.toBean(dto, RoomBed.class);
         return RT.ok(roomBedService.updateById(roomBed));
         return RT.ok(roomBedService.updateById(roomBed));
 
 

+ 3 - 4
src/main/java/com/xjrsoft/module/room/dto/RoomBedPageDto.java

@@ -22,20 +22,19 @@ public class RoomBedPageDto extends PageInput {
     @ApiModelProperty("楼层")
     @ApiModelProperty("楼层")
     public Integer floorNumber;
     public Integer floorNumber;
 
 
-
     @ApiModelProperty("寝室id")
     @ApiModelProperty("寝室id")
     public Long roomId;
     public Long roomId;
 
 
     @ApiModelProperty("入住性别")
     @ApiModelProperty("入住性别")
     public String gender;
     public String gender;
 
 
-    @ApiModelProperty("寝室id")
+    @ApiModelProperty("年级id")
     public Long gradeId;
     public Long gradeId;
 
 
-    @ApiModelProperty("级id")
+    @ApiModelProperty("级id")
     public Long classId;
     public Long classId;
 
 
-    @ApiModelProperty("寝室id")
+    @ApiModelProperty("学生姓名")
     public String studentName;
     public String studentName;
 
 
     @ApiModelProperty("学号")
     @ApiModelProperty("学号")

+ 8 - 0
src/main/java/com/xjrsoft/module/room/mapper/RoomBedMapper.java

@@ -18,6 +18,7 @@ import com.xjrsoft.module.room.vo.DistributeResultListVo;
 import com.xjrsoft.module.room.vo.DistributeRoomBedPageVo;
 import com.xjrsoft.module.room.vo.DistributeRoomBedPageVo;
 import com.xjrsoft.module.room.vo.NoBedStudentPageVo;
 import com.xjrsoft.module.room.vo.NoBedStudentPageVo;
 import com.xjrsoft.module.room.vo.RoomBedExcelVo;
 import com.xjrsoft.module.room.vo.RoomBedExcelVo;
+import com.xjrsoft.module.room.vo.RoomBedInfoVo;
 import com.xjrsoft.module.room.vo.RoomBedPageVo;
 import com.xjrsoft.module.room.vo.RoomBedPageVo;
 import com.xjrsoft.module.room.vo.RoomBedVo;
 import com.xjrsoft.module.room.vo.RoomBedVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -121,4 +122,11 @@ public interface RoomBedMapper extends MPJBaseMapper<RoomBed> {
 
 
     /* 查询分配床位班级列表的各个人数 - 结束 */
     /* 查询分配床位班级列表的各个人数 - 结束 */
 
 
+    /**
+     * 根据用户id查询床位信息
+     * @param id
+     * @return
+     */
+    RoomBedInfoVo getBedInfoByUserId(Long id);
+
 }
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/room/service/IRoomBedService.java

@@ -96,4 +96,6 @@ public interface IRoomBedService extends MPJBaseService<RoomBed> {
 
 
     Boolean adjustBed(AdjustStudentBedDto dto);
     Boolean adjustBed(AdjustStudentBedDto dto);
 
 
+
+
 }
 }

+ 10 - 23
src/main/java/com/xjrsoft/module/room/service/impl/RoomBedServiceImpl.java

@@ -263,38 +263,25 @@ public class RoomBedServiceImpl extends MPJBaseServiceImpl<RoomBedMapper, RoomBe
     @Override
     @Override
     public Boolean distributeRoomBed(DistributeRoomBedDto dto) {
     public Boolean distributeRoomBed(DistributeRoomBedDto dto) {
         List<Room> roomList = roomMapper.selectList(new QueryWrapper<Room>().lambda().in(Room::getId, dto.getRoomIds()));
         List<Room> roomList = roomMapper.selectList(new QueryWrapper<Room>().lambda().in(Room::getId, dto.getRoomIds()));
-        Set<Integer> genderSet = new HashSet<>();
+        Set<String> genderSet = new HashSet<>();
         for (Room room : roomList) {
         for (Room room : roomList) {
-            if("SB10001".equals(room.getGender())){
-                genderSet.add(1);
-            }else if("SB10002".equals(room.getGender())){
-                genderSet.add(2);
-            }
-        }
-        Map<Integer, String> genderMap = new HashMap<>();
-        for (Integer genderNumber : genderSet) {
-            if(genderNumber == 1){
-                genderMap.put(genderNumber, "SB10001");
-            }else if(genderNumber == 2){
-                genderMap.put(genderNumber, "SB10002");
-            }
+            genderSet.add(room.getGender());
         }
         }
 
 
         Date modifyDate = new Date();
         Date modifyDate = new Date();
         Long modifyUserId = StpUtil.getLoginIdAsLong();
         Long modifyUserId = StpUtil.getLoginIdAsLong();
-
         //查询每个班的学生,修改床位信息
         //查询每个班的学生,修改床位信息
         int i = 0;
         int i = 0;
         Map<Long, Integer> classDistributeBedNumber = new HashMap<>();
         Map<Long, Integer> classDistributeBedNumber = new HashMap<>();
         Map<Long, Integer> classStudent = new HashMap<>();
         Map<Long, Integer> classStudent = new HashMap<>();
-        for (Integer genderNumber : genderSet) {
+        for (String genderNumber : genderSet) {
             //根据性别查询出所有空床位信息
             //根据性别查询出所有空床位信息
             List<RoomBed> bedInfoList = roomBedMapper.selectList(
             List<RoomBed> bedInfoList = roomBedMapper.selectList(
                 new MPJLambdaWrapper<RoomBed>()
                 new MPJLambdaWrapper<RoomBed>()
                 .select(RoomBed::getId)
                 .select(RoomBed::getId)
                 .select(RoomBed.class, x -> VoToColumnUtil.fieldsToColumns(RoomBed.class).contains(x.getProperty()))
                 .select(RoomBed.class, x -> VoToColumnUtil.fieldsToColumns(RoomBed.class).contains(x.getProperty()))
                 .innerJoin(Room.class, Room::getId, RoomBed::getRoomId)
                 .innerJoin(Room.class, Room::getId, RoomBed::getRoomId)
-                .eq(Room::getGender, genderMap.get(genderNumber))
+                .eq(Room::getGender, genderNumber)
                 .isNull(RoomBed::getStudentUserId)
                 .isNull(RoomBed::getStudentUserId)
                 .eq(RoomBed::getIsCheckIn, 0)
                 .eq(RoomBed::getIsCheckIn, 0)
                 .in(RoomBed::getRoomId, dto.getRoomIds())
                 .in(RoomBed::getRoomId, dto.getRoomIds())
@@ -433,12 +420,12 @@ public class RoomBedServiceImpl extends MPJBaseServiceImpl<RoomBedMapper, RoomBe
     public Boolean adjustBed(AdjustStudentBedDto dto) {
     public Boolean adjustBed(AdjustStudentBedDto dto) {
         //查询学生的性别
         //查询学生的性别
         XjrUser xjrUser = xjrUserMapper.selectById(dto.getStudentUserId());
         XjrUser xjrUser = xjrUserMapper.selectById(dto.getStudentUserId());
-        String studentGender = null;
-        if(1 == xjrUser.getGender()){
-            studentGender = "SB10001";
-        }else if(2 == xjrUser.getGender()){
-            studentGender = "SB10002";
-        }
+        String studentGender = xjrUser.getGender();
+//        if(1 == xjrUser.getGender()){
+//            studentGender = "SB10001";
+//        }else if(2 == xjrUser.getGender()){
+//            studentGender = "SB10002";
+//        }
         RoomBed roomBedInfo = roomBedMapper.selectById(dto.getBedId());
         RoomBed roomBedInfo = roomBedMapper.selectById(dto.getBedId());
         Room room = roomMapper.selectById(roomBedInfo.getRoomId());
         Room room = roomMapper.selectById(roomBedInfo.getRoomId());
         if(room == null){
         if(room == null){

+ 28 - 0
src/main/java/com/xjrsoft/module/room/vo/RoomBedInfoVo.java

@@ -0,0 +1,28 @@
+package com.xjrsoft.module.room.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 寝室床位表单出参
+* @Author dzx
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class RoomBedInfoVo {
+
+    @ApiModelProperty("主键编号")
+    private Long id;
+
+    @ApiModelProperty("楼栋名称")
+    private String buildName;
+
+    @ApiModelProperty("寝室名称")
+    private String roomName;
+
+    @ApiModelProperty("床位号")
+    private Integer bedNumber;
+
+
+}

+ 38 - 17
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -4,17 +4,15 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.db.Db;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.gson.JsonParser;
-import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.model.result.RT;
-import com.xjrsoft.common.utils.DatasourceUtil;
 import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.service.ICourseTableService;
 import com.xjrsoft.module.courseTable.service.ICourseTableService;
 import com.xjrsoft.module.schedule.dto.CourseTableAdjustDto;
 import com.xjrsoft.module.schedule.dto.CourseTableAdjustDto;
@@ -22,39 +20,34 @@ import com.xjrsoft.module.schedule.dto.CourseTableDto;
 import com.xjrsoft.module.schedule.dto.CourseTablePreCheckDto;
 import com.xjrsoft.module.schedule.dto.CourseTablePreCheckDto;
 import com.xjrsoft.module.schedule.dto.ScheduleWeekExportQueryDto;
 import com.xjrsoft.module.schedule.dto.ScheduleWeekExportQueryDto;
 import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
 import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
-import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.schedule.service.ICourseReceiveMsgService;
 import com.xjrsoft.module.schedule.service.ICourseReceiveMsgService;
-import com.xjrsoft.module.schedule.service.IJianyueDataService;
-import com.xjrsoft.module.schedule.util.DataUtil;
 import com.xjrsoft.module.schedule.util.ScheduleUtil;
 import com.xjrsoft.module.schedule.util.ScheduleUtil;
 import com.xjrsoft.module.schedule.vo.CourseListVo;
 import com.xjrsoft.module.schedule.vo.CourseListVo;
 import com.xjrsoft.module.schedule.vo.CourseTableVo;
 import com.xjrsoft.module.schedule.vo.CourseTableVo;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.service.impl.IBaseStudentSchoolRollService;
 import com.xjrsoft.module.student.service.impl.IBaseStudentSchoolRollService;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.service.IBaseTeacherService;
 import com.xjrsoft.module.teacher.service.IBaseTeacherService;
-import com.xjrsoft.module.textbook.dto.TextbookClaimExportQueryDto;
+import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+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 javax.sql.DataSource;
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayOutputStream;
-import java.sql.SQLException;
 import java.time.DayOfWeek;
 import java.time.DayOfWeek;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
 
 
 /**
 /**
 * @title: 课表
 * @title: 课表
@@ -70,10 +63,11 @@ public class ScheduleController {
 
 
 
 
     private final ICourseReceiveMsgService courseReceiveMsgService;
     private final ICourseReceiveMsgService courseReceiveMsgService;
-    private final IJianyueDataService jianyueDataService;
+//    private final IJianyueDataService jianyueDataService;
     private final ICourseTableService courseTableService;
     private final ICourseTableService courseTableService;
     private final IBaseStudentSchoolRollService baseStudentSchoolRollService;
     private final IBaseStudentSchoolRollService baseStudentSchoolRollService;
     private final IBaseTeacherService baseTeacherService;
     private final IBaseTeacherService baseTeacherService;
+    private final ITeacherbaseManagerService teacherService;
 
 
     @GetMapping(value = "/receive-msg")
     @GetMapping(value = "/receive-msg")
     @ApiOperation(value="接收消息")
     @ApiOperation(value="接收消息")
@@ -245,4 +239,31 @@ public class ScheduleController {
         ByteArrayOutputStream bot = courseTableService.listScheduleWeekExportQuery(dto);
         ByteArrayOutputStream bot = courseTableService.listScheduleWeekExportQuery(dto);
         return RT.fileStream(bot.toByteArray(), "scheduleWeek" + ExcelTypeEnum.XLSX.getValue());
         return RT.fileStream(bot.toByteArray(), "scheduleWeek" + ExcelTypeEnum.XLSX.getValue());
     }
     }
+
+    @GetMapping(value = "/login-url")
+    @ApiOperation(value = "获取单点登录地址")
+    @SaCheckPermission("evaluateobject:detail")
+    public RT<String> getAccessToken() throws Exception {
+        XjrUser xjrUser = teacherService.getById(StpUtil.getLoginIdAsLong());
+        long timeMillis = System.currentTimeMillis();
+        String sign = ScheduleUtil.createSign(timeMillis);
+
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("mobileNo", xjrUser.getMobile());
+
+        String url = ScheduleUtil.apiUrl + "auth/user/token";
+        try {
+            String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timeMillis);
+            JsonParser parser = new JsonParser();
+            JsonObject resultJson = parser.parse(result).getAsJsonObject();
+            if(resultJson.get("code").getAsInt() != 0){
+                return RT.error("无登录权限");
+            }
+            JsonObject dataJson = resultJson.get("data").getAsJsonObject();
+            String loginUrl = ScheduleUtil.hostUrl + "?access_token=" + dataJson.get("access_token").getAsString();
+            return RT.ok(loginUrl);
+        }catch (Exception e){
+            return RT.error(e.getMessage());
+        }
+    }
 }
 }

+ 1 - 0
src/main/java/com/xjrsoft/module/schedule/util/ScheduleUtil.java

@@ -26,6 +26,7 @@ public class ScheduleUtil {
     public static final String apiUrl = "http://219.153.208.33:20000/api/v1/ScheduleFlowV2/OpenApi/";
     public static final String apiUrl = "http://219.153.208.33:20000/api/v1/ScheduleFlowV2/OpenApi/";
     public static final String password = "@ak8To$xSHFoT6FoqsqYb3";
     public static final String password = "@ak8To$xSHFoT6FoqsqYb3";
     public static final String secert = "UUXQ8G4W9IU";
     public static final String secert = "UUXQ8G4W9IU";
+    public static final String hostUrl = "http://219.153.208.33:20000";
 //    private static JianyuekbConfig jianyuekbConfig;
 //    private static JianyuekbConfig jianyuekbConfig;
 
 
 //    public ScheduleUtil(JianyuekbConfig jianyuekbConfig){
 //    public ScheduleUtil(JianyuekbConfig jianyuekbConfig){

+ 70 - 0
src/main/java/com/xjrsoft/module/student/controller/BaseStudentInfoController.java

@@ -0,0 +1,70 @@
+package com.xjrsoft.module.student.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.student.dto.BaseStudentInfoPageDto;
+import com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto;
+import com.xjrsoft.module.student.service.impl.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.vo.BaseStudentInfoDetailVo;
+import com.xjrsoft.module.student.vo.BaseStudentInfoPageVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.validation.Valid;
+
+/**
+* @title: 学生职务设置
+* @Author dzx
+* @Date: 2023-11-13
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/student" + "/basestudentinfo")
+@Api(value = "/student"  + "/basestudentinfo",tags = "学生信息修改管理")
+@AllArgsConstructor
+public class BaseStudentInfoController {
+
+
+    private final IBaseStudentSchoolRollService baseStudentSchoolRollService;
+
+    @GetMapping(value = "/mobile-page")
+    @ApiOperation(value="学生列表(分页)")
+    @SaCheckPermission("basestudentpost:detail")
+    public RT<PageOutput<BaseStudentInfoPageVo>> mobilePage(@Valid BaseStudentInfoPageDto dto){
+        Page<BaseStudentInfoPageVo> mobilePage = baseStudentSchoolRollService.getMobilePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<BaseStudentInfoPageVo> pageOutput = ConventPage.getPageOutput(mobilePage, BaseStudentInfoPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+
+    @PutMapping
+    @ApiOperation(value = "修改学生职务设置")
+    @SaCheckPermission("basestudentpost:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateBaseStudentInfoDto dto){
+        return RT.ok(baseStudentSchoolRollService.updateInfo(dto));
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询详情信息")
+    @SaCheckPermission("room:detail")
+    public RT<BaseStudentInfoDetailVo> info(@RequestParam Long id){
+        BaseStudentInfoDetailVo detailVo = baseStudentSchoolRollService.getInfoById(id);
+        if (detailVo == null) {
+            return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(detailVo, BaseStudentInfoDetailVo.class));
+    }
+
+
+}

+ 7 - 2
src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.toolkit.MPJWrappers;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
@@ -80,7 +81,9 @@ public class StudentManagerController {
                         .leftJoin("base_grade a on a.id = t2.grade_id")
                         .leftJoin("base_grade a on a.id = t2.grade_id")
                         .leftJoin("base_major_set b on b.id = t2.major_set_id")
                         .leftJoin("base_major_set b on b.id = t2.major_set_id")
                         .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId));
                         .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId));
-
+        for (BaseStudentUserPageVo record : page.getRecords()) {
+            record.setGenderCn(GenderDictionaryEnum.getValue(record.getGender()));
+        }
         PageOutput<BaseStudentUserPageVo> pageOutput = ConventPage.getPageOutput(page, BaseStudentUserPageVo.class);
         PageOutput<BaseStudentUserPageVo> pageOutput = ConventPage.getPageOutput(page, BaseStudentUserPageVo.class);
         return R.ok(pageOutput);
         return R.ok(pageOutput);
     }
     }
@@ -118,7 +121,9 @@ public class StudentManagerController {
         if (baseStudentUser == null) {
         if (baseStudentUser == null) {
             return R.error("找不到此数据!");
             return R.error("找不到此数据!");
         }
         }
-        return R.ok(BeanUtil.toBean(baseStudentUser, BaseStudentUserVo.class));
+        BaseStudentUserVo userVo = BeanUtil.toBean(baseStudentUser, BaseStudentUserVo.class);
+        userVo.setGenderCn(GenderDictionaryEnum.getValue(userVo.getGender()));
+        return R.ok(userVo);
     }
     }
 
 
 
 

+ 47 - 0
src/main/java/com/xjrsoft/module/student/dto/BaseStudentInfoPageDto.java

@@ -0,0 +1,47 @@
+package com.xjrsoft.module.student.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 学生职务设置分页查询入参
+* @Author dzx
+* @Date: 2023-11-13
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseStudentInfoPageDto extends PageInput {
+    /**
+     * 年级id
+     */
+    @ApiModelProperty("年级id")
+    private Long gradeId;
+
+    /**
+     * 专业方向id
+     */
+    @ApiModelProperty("专业方向id")
+    private Long majorSetId;
+
+    /**
+     * 班级id
+     */
+    @ApiModelProperty("班级id")
+    private Long classId;
+
+    /**
+     * 关键字
+     */
+    @ApiModelProperty("关键字")
+    private String keyWord;
+
+    /**
+     * 班主任id
+     */
+    @ApiModelProperty("班主任id")
+    private Long teacherId;
+}

+ 39 - 0
src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentInfoDto.java

@@ -0,0 +1,39 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+* @title: 学生职务设置
+* @Author dzx
+* @Date: 2023-11-13
+* @Version 1.0
+*/
+@Data
+public class UpdateBaseStudentInfoDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 学习形式
+    */
+    @ApiModelProperty("学习形式")
+    private String rollModality;
+    /**
+     * 学籍状态(xjr_dictionary_item[archives_status])
+     */
+    @ApiModelProperty("学籍状态(xjr_dictionary_item[archives_status])")
+    private String archivesStatus;
+    /**
+     * 就读方式(xjr_dictionary_item[stduy_status])
+     */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+
+    @ApiModelProperty("学生userIds")
+    private List<Long> userIds;
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentUserDto.java

@@ -35,7 +35,7 @@ public class UpdateBaseStudentUserDto {
      * 性别
      * 性别
      */
      */
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
     /**
     /**
      * 手机号
      * 手机号
      */
      */

+ 1 - 1
src/main/java/com/xjrsoft/module/student/entity/BaseStudentUser.java

@@ -64,7 +64,7 @@ public class BaseStudentUser implements Serializable {
      * 性别
      * 性别
      */
      */
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
     /**
     /**
      * 手机号
      * 手机号
      */
      */

+ 15 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java

@@ -1,8 +1,15 @@
 package com.xjrsoft.module.student.mapper;
 package com.xjrsoft.module.student.mapper;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.student.dto.BaseStudentInfoPageDto;
+import com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.vo.BaseStudentInfoDetailVo;
+import com.xjrsoft.module.student.vo.BaseStudentInfoPageVo;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
 
 
 /**
 /**
  * @title: mapper
  * @title: mapper
@@ -12,4 +19,12 @@ import org.apache.ibatis.annotations.Mapper;
  */
  */
 @Mapper
 @Mapper
 public interface BaseStudentSchoolRollMapper extends MPJBaseMapper<BaseStudentSchoolRoll> {
 public interface BaseStudentSchoolRollMapper extends MPJBaseMapper<BaseStudentSchoolRoll> {
+
+    Page<BaseStudentInfoPageVo> getMobilePage(Page<BaseStudentInfoPageVo> page, BaseStudentInfoPageDto dto);
+
+    BaseStudentInfoDetailVo getInfoById(Long id);
+
+    Boolean updateInfoByUserId(UpdateBaseStudentInfoDto dto, Long id);
+
 }
 }
+

+ 46 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java

@@ -1,11 +1,24 @@
 package com.xjrsoft.module.student.service.impl;
 package com.xjrsoft.module.student.service.impl;
 
 
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.room.mapper.RoomBedMapper;
+import com.xjrsoft.module.room.vo.RoomBedInfoVo;
+import com.xjrsoft.module.student.dto.BaseStudentInfoPageDto;
+import com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
+import com.xjrsoft.module.student.vo.BaseStudentInfoDetailVo;
+import com.xjrsoft.module.student.vo.BaseStudentInfoPageVo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 /**
 /**
 * @title: 助学金申请
 * @title: 助学金申请
 * @Author dzx
 * @Author dzx
@@ -17,4 +30,37 @@ import org.springframework.stereotype.Service;
 public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStudentSchoolRollMapper, BaseStudentSchoolRoll> implements IBaseStudentSchoolRollService {
 public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStudentSchoolRollMapper, BaseStudentSchoolRoll> implements IBaseStudentSchoolRollService {
 
 
     private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
     private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
+    private final RoomBedMapper roomBedMapper;
+    private final BaseClassMapper baseClassMapper;
+
+
+    @Override
+    public Page<BaseStudentInfoPageVo> getMobilePage(Page<BaseStudentInfoPageVo> page, BaseStudentInfoPageDto dto) {
+        long teacherId = StpUtil.getLoginIdAsLong();
+        List<BaseClass> classList = baseClassMapper.selectList(
+            new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getTeacherId, teacherId)
+        );
+        if(classList != null && !classList.isEmpty()){
+            dto.setTeacherId(teacherId);
+        }
+        return baseStudentSchoolRollMapper.getMobilePage(page, dto);
+    }
+
+    @Override
+    public Boolean updateInfo(UpdateBaseStudentInfoDto dto) {
+        for (Long id : dto.getUserIds()) {
+            baseStudentSchoolRollMapper.updateInfoByUserId(dto, id);
+        }
+        return true;
+    }
+
+    @Override
+    public BaseStudentInfoDetailVo getInfoById(Long id) {
+        BaseStudentInfoDetailVo info = baseStudentSchoolRollMapper.getInfoById(id);
+        RoomBedInfoVo bedInfoByUserId = roomBedMapper.getBedInfoByUserId(info.getId());
+        if(bedInfoByUserId != null){
+            info.setBedInfo(bedInfoByUserId.getBuildName() + " " + bedInfoByUserId.getRoomName() + " " + bedInfoByUserId.getBedNumber());
+        }
+        return info;
+    }
 }
 }

+ 20 - 0
src/main/java/com/xjrsoft/module/student/service/impl/IBaseStudentSchoolRollService.java

@@ -1,7 +1,13 @@
 package com.xjrsoft.module.student.service.impl;
 package com.xjrsoft.module.student.service.impl;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.room.dto.RoomPageDto;
+import com.xjrsoft.module.student.dto.BaseStudentInfoPageDto;
+import com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.vo.BaseStudentInfoDetailVo;
+import com.xjrsoft.module.student.vo.BaseStudentInfoPageVo;
 
 
 /**
 /**
 * @title: 奖学金申请
 * @title: 奖学金申请
@@ -12,5 +18,19 @@ import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 
 
 public interface IBaseStudentSchoolRollService extends MPJBaseService<BaseStudentSchoolRoll> {
 public interface IBaseStudentSchoolRollService extends MPJBaseService<BaseStudentSchoolRoll> {
 
 
+    Page<BaseStudentInfoPageVo> getMobilePage(Page<BaseStudentInfoPageVo> page, BaseStudentInfoPageDto dto);
 
 
+    /**
+     * 移动端查询学生信息列表
+     * @param dto
+     * @return
+     */
+    Boolean updateInfo(UpdateBaseStudentInfoDto dto);
+
+    /**
+     * 移动端查询学生详情信息
+     * @param id
+     * @return
+     */
+    BaseStudentInfoDetailVo getInfoById(Long id);
 }
 }

+ 98 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java

@@ -0,0 +1,98 @@
+package com.xjrsoft.module.student.vo;
+
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 移动端学生修改信息列表
+* @Author dzx
+* @Date: 2024年2月26日
+* @Version 1.0
+*/
+@Data
+public class BaseStudentInfoDetailVo {
+
+
+    @ApiModelProperty("主键编号")
+    private Long id;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学号")
+    private String studentId;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("本人电话")
+    private String phone;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("监护人电话")
+    private String guardianPhone;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班主任名称")
+    private String teacherName;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    /**
+     * 学习形式
+     */
+    @ApiModelProperty("学习形式")
+    private String rollModality;
+    /**
+     * 学习形式
+     */
+    @ApiModelProperty("学习形式")
+    private String rollModalityCode;
+    /**
+     * 学籍状态(xjr_dictionary_item[archives_status])
+     */
+    @ApiModelProperty("学籍状态(xjr_dictionary_item[archives_status])")
+    private String archivesStatus;
+    /**
+     * 学籍状态(xjr_dictionary_item[archives_status])
+     */
+    @ApiModelProperty("学籍状态(xjr_dictionary_item[archives_status])")
+    private String archivesStatusCode;
+    /**
+     * 就读方式(xjr_dictionary_item[stduy_status])
+     */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+
+    /**
+     * 就读方式(xjr_dictionary_item[stduy_status])
+     */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatusCode;
+
+    @ApiModelProperty("床位信息")
+    private String bedInfo;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("出生日期")
+    private Date birthDate;
+
+    @ApiModelProperty("性别(SB10001:男 SB10002:女)")
+    private String gender;
+
+    @ApiModelProperty("民族")
+    private String nation;
+
+    private String majorSetName;
+}

+ 49 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageVo.java

@@ -0,0 +1,49 @@
+package com.xjrsoft.module.student.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 移动端学生修改信息列表
+* @Author dzx
+* @Date: 2024年2月26日
+* @Version 1.0
+*/
+@Data
+public class BaseStudentInfoPageVo {
+
+
+    @ApiModelProperty("主键编号")
+    private Long id;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学号")
+    private String studentId;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("本人电话")
+    private String phone;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("监护人电话")
+    private String guardianPhone;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班主任名称")
+    private String teacherName;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("班级名称")
+    private String className;
+
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserPageVo.java

@@ -47,6 +47,12 @@ public class BaseStudentUserPageVo {
      */
      */
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
     private String gender;
     private String gender;
+
+    /**
+     * 性别中文
+     */
+    @ApiModelProperty("性别中文")
+    private String genderCn;
     /**
     /**
      * 证件号码
      * 证件号码
      */
      */

+ 8 - 1
src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserVo.java

@@ -36,7 +36,14 @@ public class BaseStudentUserVo {
      * 性别
      * 性别
      */
      */
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
+
+    /**
+     * 性别中文
+     */
+    @ApiModelProperty("性别中文")
+    private String genderCn;
+
     /**
     /**
      * 手机号
      * 手机号
      */
      */

+ 11 - 0
src/main/java/com/xjrsoft/module/system/controller/FileController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.img.ImgUtil;
 import cn.hutool.core.img.ImgUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.UploadUtil;
 import com.xjrsoft.common.utils.UploadUtil;
@@ -20,6 +22,7 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.OSSConfig;
 import com.xjrsoft.config.OSSConfig;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.oss.factory.OssFactory;
 import com.xjrsoft.module.oss.factory.OssFactory;
+import com.xjrsoft.module.system.dto.FileDownloadDto;
 import com.xjrsoft.module.system.dto.FileListDto;
 import com.xjrsoft.module.system.dto.FileListDto;
 import com.xjrsoft.module.system.dto.FilePageDto;
 import com.xjrsoft.module.system.dto.FilePageDto;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.entity.File;
@@ -30,6 +33,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -223,4 +227,11 @@ public class FileController {
         fileService.save(fileEntity);
         fileService.save(fileEntity);
         return fileEntity;
         return fileEntity;
     }
     }
+
+    @GetMapping("/download")
+    @ApiOperation(value = "下载文件")
+    public ResponseEntity<byte[]> download(@Valid FileDownloadDto dto) {
+        byte[] resultBtyeAry_temp = fileService.downloadFileByZip(dto.getFolderId());
+        return RT.fileStream(resultBtyeAry_temp, dto.getFileName() + ".zip");
+    }
 }
 }

+ 20 - 0
src/main/java/com/xjrsoft/module/system/dto/FileDownloadDto.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.system.dto;
+
+import com.xjrsoft.common.page.ListInput;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
+
+/**
+ * @Author: tzx
+ * @Date: 2022/7/28 9:34
+ */
+@Data
+public class FileDownloadDto {
+    /**
+     * 文件夹id
+     */
+    private Long folderId;
+
+    private String fileName;
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/system/service/IFileService.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.system.service;
 
 
 import com.github.yulichang.base.MPJBaseService;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.entity.File;
+import org.springframework.http.ResponseEntity;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -14,4 +15,6 @@ import com.xjrsoft.module.system.entity.File;
 public interface IFileService extends MPJBaseService<File> {
 public interface IFileService extends MPJBaseService<File> {
 
 
     boolean deleteFile(String encode);
     boolean deleteFile(String encode);
+
+    byte[] downloadFileByZip(Long folderId);
 }
 }

+ 60 - 0
src/main/java/com/xjrsoft/module/system/service/impl/FileServiceImpl.java

@@ -1,11 +1,27 @@
 package com.xjrsoft.module.system.service.impl;
 package com.xjrsoft.module.system.service.impl;
 
 
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.FileZipUtil;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.mapper.FileMapper;
 import com.xjrsoft.module.system.mapper.FileMapper;
 import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.system.service.IFileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
 /**
  * <p>
  * <p>
  * 文件关联关系表 服务实现类
  * 文件关联关系表 服务实现类
@@ -17,8 +33,52 @@ import org.springframework.stereotype.Service;
 @Service
 @Service
 public class FileServiceImpl extends MPJBaseServiceImpl<FileMapper, File> implements IFileService {
 public class FileServiceImpl extends MPJBaseServiceImpl<FileMapper, File> implements IFileService {
 
 
+    @Autowired
+    private ResourceLoader resourceLoader;
+
     @Override
     @Override
     public boolean deleteFile(String encode) {
     public boolean deleteFile(String encode) {
         return false;
         return false;
     }
     }
+
+    @Override
+    public byte[] downloadFileByZip(Long folderId) {
+        List<File> fileList = this.list(Wrappers.<File>query().lambda().eq(File::getFolderId, folderId));
+
+        //声明一个Map,将所有文件装进去,map的key是完整的文件名
+        Map<String, byte[]> byteAryMap = new HashMap<>();
+
+        for (int i = 0; i < fileList.size(); i++) {
+//            String localFilePath = "C:\\Users\\大数据与最优化研究所\\Downloads\\" + fileList.get(i).getFileName() + fileList.get(i).getFileType();
+//            System.err.println(localFilePath);
+            try {
+                URL url = new URL(fileList.get(i).getFileUrl());
+                URLConnection conn = url.openConnection();
+                InputStream in = conn.getInputStream();
+//                        FileOutputStream fos = new FileOutputStream(localFilePath)
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                byte[] buffer = new byte[1024];
+                int bytesRead;
+                while ((bytesRead = in.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, bytesRead);
+                }
+                byte[] byteArray = outputStream.toByteArray();
+                byteAryMap.put(fileList.get(i).getFileName() + fileList.get(i).getFileType(), byteArray);
+//                    System.err.println(byteArray.length);
+//                    outputStream.writeTo(fos);
+
+//                System.out.println("File downloaded successfully.");
+                in.close();
+                outputStream.close();
+            } catch (MalformedURLException e) {
+                throw new RuntimeException(e);
+            } catch (FileNotFoundException e) {
+                throw new RuntimeException(e);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        //执行下面这段代码就可以拿到压缩之后的byte数组
+        return FileZipUtil.byteAryMap2Zip(byteAryMap);
+    }
 }
 }

+ 9 - 1
src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.page.PageOutput;
@@ -76,8 +77,13 @@ public class TeacherbaseManagerController {
                 .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
                 .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
 
 
         IPage<XjrUser> page = teacherbaseManagerService.page(ConventPage.getPage(dto), queryWrapper);
         IPage<XjrUser> page = teacherbaseManagerService.page(ConventPage.getPage(dto), queryWrapper);
+
         PageOutput<XjrUserPageVo> pageOutput = ConventPage.getPageOutput(page, XjrUserPageVo.class);
         PageOutput<XjrUserPageVo> pageOutput = ConventPage.getPageOutput(page, XjrUserPageVo.class);
 
 
+        for (XjrUserPageVo record : pageOutput.getList()) {
+            record.setGenderCn(GenderDictionaryEnum.getValue(record.getGender()));
+        }
+
         return R.ok(pageOutput);
         return R.ok(pageOutput);
     }
     }
 
 
@@ -89,7 +95,9 @@ public class TeacherbaseManagerController {
         if (xjrUser == null) {
         if (xjrUser == null) {
            return R.error("找不到此数据!");
            return R.error("找不到此数据!");
         }
         }
-        return R.ok(BeanUtil.toBean(xjrUser, XjrUserVo.class));
+        XjrUserVo userVo = BeanUtil.toBean(xjrUser, XjrUserVo.class);
+        userVo.setGenderCn(GenderDictionaryEnum.getValue(userVo.getGender()));
+        return R.ok(userVo);
     }
     }
 
 
 
 

+ 1 - 1
src/main/java/com/xjrsoft/module/teacher/entity/XjrUser.java

@@ -63,7 +63,7 @@ public class XjrUser implements Serializable {
     * 性别
     * 性别
     */
     */
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
     /**
     /**
     * 手机号
     * 手机号
     */
     */

+ 6 - 0
src/main/java/com/xjrsoft/module/teacher/vo/XjrUserPageVo.java

@@ -42,6 +42,12 @@ public class XjrUserPageVo {
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
     private String gender;
     private String gender;
 
 
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别中文")
+    private String genderCn;
+
     /**
     /**
      * 证件类型
      * 证件类型
      */
      */

+ 6 - 1
src/main/java/com/xjrsoft/module/teacher/vo/XjrUserVo.java

@@ -43,7 +43,12 @@ public class XjrUserVo {
     * 性别
     * 性别
     */
     */
     @ApiModelProperty("性别")
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别中文")
+    private String genderCn;
     /**
     /**
     * 手机号
     * 手机号
     */
     */

+ 3 - 1
src/main/java/com/xjrsoft/module/textbook/controller/TextbookController.java

@@ -194,7 +194,9 @@ public class TextbookController {
             baseSemesterLambdaQueryWrapper
             baseSemesterLambdaQueryWrapper
                     .eq(BaseSemester::getId, dto.getBaseSemesterId());
                     .eq(BaseSemester::getId, dto.getBaseSemesterId());
             BaseSemester baseSemester = baseSemesterService.getOne(baseSemesterLambdaQueryWrapper);
             BaseSemester baseSemester = baseSemesterService.getOne(baseSemesterLambdaQueryWrapper);
-            baseSemesterCn = baseSemester.getName();
+            if(baseSemester != null){
+                baseSemesterCn = baseSemester.getName();
+            }
         }
         }
         String headTitle = "重庆市铜梁职业教育中心" + baseSemesterCn + "教材征订表";
         String headTitle = "重庆市铜梁职业教育中心" + baseSemesterCn + "教材征订表";
         List<List<String>> headList = new ArrayList<>();
         List<List<String>> headList = new ArrayList<>();

+ 10 - 42
src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java

@@ -7,52 +7,15 @@ import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.module.ledger.dto.WfSubscriptionPageDto;
-import com.xjrsoft.module.ledger.vo.WfSubscriptionPageVo;
-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.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.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.dto.*;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import com.xjrsoft.module.workflow.vo.PendingTaskVo;
 import com.xjrsoft.module.workflow.vo.PendingTaskVo;
+import com.xjrsoft.module.workflow.vo.ProcessRecordListVo;
+import com.xjrsoft.module.workflow.vo.UserDefinedProcessRecordListVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
-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.bind.annotation.*;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.util.List;
 import java.util.List;
@@ -364,5 +327,10 @@ public class WorkflowExecuteController {
         return RT.ok(pageOutput);
         return RT.ok(pageOutput);
     }
     }
 
 
-
+    @GetMapping("/approve-record-list")
+    @ApiOperation(value = "自定义流程记录列表")
+    public RT<List<UserDefinedProcessRecordListVo>> approveRecordList(@Valid ApproveRecordListDto dto) {
+        List<UserDefinedProcessRecordListVo> userDefinedProcessRecordListVos = workflowExecuteService.listApproveRecord(dto);
+        return RT.ok(userDefinedProcessRecordListVos);
+    }
 }
 }

+ 73 - 0
src/main/java/com/xjrsoft/module/workflow/dto/AddXjrWorkflowOperateRecordDto.java

@@ -0,0 +1,73 @@
+package com.xjrsoft.module.workflow.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 工作流操作记录表
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Data
+public class AddXjrWorkflowOperateRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 节点id
+    */
+    @ApiModelProperty("节点id")
+    private String nodeId;
+    /**
+    * 节点类型
+    */
+    @ApiModelProperty("节点类型")
+    private String nodeType;
+    /**
+    * 节点名称
+    */
+    @ApiModelProperty("节点名称")
+    private String nodeName;
+    /**
+    * 节点多实例类型(节点审批类型)
+    */
+    @ApiModelProperty("节点多实例类型(节点审批类型)")
+    private Integer nodeMultiType;
+    /**
+    * 模板id
+    */
+    @ApiModelProperty("模板id")
+    private Long schemaId;
+    /**
+    * 流程id
+    */
+    @ApiModelProperty("流程id")
+    private String processId;
+    /**
+    * 审批操作信息
+    */
+    @ApiModelProperty("审批操作信息")
+    private String operateInfo;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private Date recordTime;
+    /**
+    * 传阅信息
+    */
+    @ApiModelProperty("传阅信息")
+    private String circulateMessage;
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/workflow/dto/UpdateXjrWorkflowOperateRecordDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.workflow.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 工作流操作记录表
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Data
+public class UpdateXjrWorkflowOperateRecordDto extends AddXjrWorkflowOperateRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/workflow/dto/XjrWorkflowOperateRecordPageDto.java

@@ -0,0 +1,26 @@
+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 java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 工作流操作记录表分页查询入参
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class XjrWorkflowOperateRecordPageDto extends PageInput {
+
+
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/workflow/entity/WorkflowRecord.java

@@ -56,5 +56,4 @@ public class WorkflowRecord implements Serializable {
 
 
     @TableField(fill = FieldFill.INSERT)
     @TableField(fill = FieldFill.INSERT)
     private Long createUserId;
     private Long createUserId;
-
 }
 }

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

@@ -0,0 +1,92 @@
+package com.xjrsoft.module.workflow.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 工作流操作记录表
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Data
+@TableName("xjr_workflow_operate_record")
+@ApiModel(value = "xjr_workflow_operate_record", description = "工作流操作记录表")
+public class XjrWorkflowOperateRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 节点id
+    */
+    @ApiModelProperty("节点id")
+    private String nodeId;
+    /**
+    * 节点类型
+    */
+    @ApiModelProperty("节点类型")
+    private String nodeType;
+    /**
+    * 节点名称
+    */
+    @ApiModelProperty("节点名称")
+    private String nodeName;
+    /**
+    * 节点多实例类型(节点审批类型)
+    */
+    @ApiModelProperty("节点多实例类型(节点审批类型)")
+    private Integer nodeMultiType;
+    /**
+    * 模板id
+    */
+    @ApiModelProperty("模板id")
+    private Long schemaId;
+    /**
+    * 流程id
+    */
+    @ApiModelProperty("流程id")
+    private String processId;
+    /**
+    * 审批操作信息
+    */
+    @ApiModelProperty("审批操作信息")
+    private String operateInfo;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private LocalDateTime recordTime;
+    /**
+    * 传阅信息
+    */
+    @ApiModelProperty("传阅信息")
+    private String circulateMessage;
+    /**
+    * 操作人id
+    */
+    @ApiModelProperty("操作人id")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/workflow/mapper/XjrWorkflowOperateRecordMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.workflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 工作流操作记录表
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Mapper
+public interface XjrWorkflowOperateRecordMapper extends MPJBaseMapper<XjrWorkflowOperateRecord> {
+
+}

+ 4 - 58
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java

@@ -2,64 +2,8 @@ package com.xjrsoft.module.workflow.service;
 
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.page.PageOutput;
-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.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.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.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.RelationTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskPageVo;
-import com.xjrsoft.module.workflow.vo.RestartVo;
-import com.xjrsoft.module.workflow.vo.StartProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskInfoVo;
+import com.xjrsoft.module.workflow.dto.*;
+import com.xjrsoft.module.workflow.vo.*;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -439,4 +383,6 @@ public interface IWorkflowExecuteService {
 
 
     Boolean dealTimeoutTask(Integer handleType,String taskId);
     Boolean dealTimeoutTask(Integer handleType,String taskId);
 
 
+    List<UserDefinedProcessRecordListVo> listApproveRecord(ApproveRecordListDto dto);
+
 }
 }

+ 17 - 0
src/main/java/com/xjrsoft/module/workflow/service/IXjrWorkflowOperateRecordService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.workflow.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 工作流操作记录表
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+
+public interface IXjrWorkflowOperateRecordService extends MPJBaseService<XjrWorkflowOperateRecord> {
+}

+ 264 - 2
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -48,7 +48,18 @@ import com.xjrsoft.module.workflow.constant.WorkflowConstant;
 import com.xjrsoft.module.workflow.dto.*;
 import com.xjrsoft.module.workflow.dto.*;
 import com.xjrsoft.module.workflow.entity.*;
 import com.xjrsoft.module.workflow.entity.*;
 import com.xjrsoft.module.workflow.mapper.*;
 import com.xjrsoft.module.workflow.mapper.*;
-import com.xjrsoft.module.workflow.model.*;
+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.*;
 import com.xjrsoft.module.workflow.service.*;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
 import com.xjrsoft.module.workflow.vo.*;
 import com.xjrsoft.module.workflow.vo.*;
@@ -119,6 +130,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
 
     private final WorkflowRecordMapper workflowRecordMapper;
     private final WorkflowRecordMapper workflowRecordMapper;
 
 
+    private final XjrWorkflowOperateRecordMapper xjrWorkflowOperateRecordMapper;
+
     private final IWorkflowCirculatedService circulatedService;
     private final IWorkflowCirculatedService circulatedService;
 
 
     private final IWorkflowApproveRecordService approveRecordService;
     private final IWorkflowApproveRecordService approveRecordService;
@@ -1077,7 +1090,6 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
     @SneakyThrows
     @SneakyThrows
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public List<LaunchAndApproveVo> newLaunch(LaunchDto dto) {
     public List<LaunchAndApproveVo> newLaunch(LaunchDto dto) {
-        System.out.println("newLaunch start");
         WorkflowSchema workflowSchema = workflowSchemaMapper.selectById(dto.getSchemaId());
         WorkflowSchema workflowSchema = workflowSchemaMapper.selectById(dto.getSchemaId());
 
 
         if (workflowSchema == null) {
         if (workflowSchema == null) {
@@ -1882,6 +1894,20 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 String oldTaskName = task.getName();
                 String oldTaskName = task.getName();
                 record.setCirculateMessage(circulateMessage);
                 record.setCirculateMessage(circulateMessage);
 
 
+                //新增流程自定义发起流程记录
+                XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                xjrWorkflowOperateRecord.setNodeId(task.getId());
+                xjrWorkflowOperateRecord.setNodeName(task.getName());
+                xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
+                xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+                //当前任务的名称
+                String oldTaskNameCustom = task.getName();
+                xjrWorkflowOperateRecord.setCirculateMessage(circulateMessage);
+
                 taskService.complete(task.getId());
                 taskService.complete(task.getId());
                 List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
                 List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
                 result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
                 result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
@@ -1895,6 +1921,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //新增工作流程信息数据
                 //新增工作流程信息数据
                 addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, oldTaskName, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
                 addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, oldTaskName, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
 
 
+                addCustomWorkflowRecord(userTaskConfig, nextTaskNameList, user, xjrWorkflowOperateRecord, oldTaskNameCustom, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
+
             }
             }
 
 
             //如果是驳回
             //如果是驳回
@@ -1929,6 +1957,21 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 //                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
 //                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
                     record.setMessage("审批信息:【" + user.getName() + "】【驳回】审批,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
                     record.setMessage("审批信息:【" + user.getName() + "】【驳回】审批,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
                     workflowRecordMapper.insert(record);
                     workflowRecordMapper.insert(record);
+
+                    //新增自定义流程发起流程记录
+                    XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                    xjrWorkflowOperateRecord.setNodeId(task.getId());
+                    xjrWorkflowOperateRecord.setNodeName(task.getName());
+                    xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                    xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                    xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                    xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                    xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now().minusSeconds(+1));//时间设置提前1秒钟,好排序
+
+//                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
+                    String message = "审批人:" + user.getName() + ", 审批结果:驳回, 审批内容:驳回";
+                    xjrWorkflowOperateRecord.setOperateInfo(message);
+                    xjrWorkflowOperateRecordMapper.insert(xjrWorkflowOperateRecord);
                 });
                 });
 
 
             }
             }
@@ -1958,6 +2001,19 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
 
                 workflowRecordMapper.insert(record);
                 workflowRecordMapper.insert(record);
 
 
+                //新增流程发起流程记录
+                XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                xjrWorkflowOperateRecord.setNodeId(task.getId());
+                xjrWorkflowOperateRecord.setNodeName(task.getName());
+                xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+
+                String message = "审批人:" + user.getName() + ", 审批结果:结束, 审批内容:结束流程";
+                xjrWorkflowOperateRecord.setOperateInfo(message);
+                xjrWorkflowOperateRecordMapper.insert(xjrWorkflowOperateRecord);
             }
             }
 
 
             updateFileInfo(dto.getFileFolderIds(), task.getProcessInstanceId());
             updateFileInfo(dto.getFileFolderIds(), task.getProcessInstanceId());
@@ -2225,6 +2281,17 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
                     //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
                     record.setRecordTime(LocalDateTime.now());
                     record.setRecordTime(LocalDateTime.now());
 
 
+                    //批量审批流程信息记录
+                    XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                    xjrWorkflowOperateRecord.setNodeId(task.getId());
+                    xjrWorkflowOperateRecord.setNodeName(task.getName());
+                    xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                    xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                    xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                    xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                    //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
+                    xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+
                     //新增审批详情返回给前端
                     //新增审批详情返回给前端
                     ApproveMultiVo approveMultiVo = new ApproveMultiVo();
                     ApproveMultiVo approveMultiVo = new ApproveMultiVo();
                     WorkflowExtra extraFirst = workflowExtras.stream().filter(x -> x.getTaskId().equals(task.getId())).findFirst().orElse(new WorkflowExtra());
                     WorkflowExtra extraFirst = workflowExtras.stream().filter(x -> x.getTaskId().equals(task.getId())).findFirst().orElse(new WorkflowExtra());
@@ -2234,6 +2301,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
                     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);
+                        addCustomWorkflowRecord(userTaskConfig, nextTaskNameList, user, xjrWorkflowOperateRecord, task.getName(), "同意", dto.getApprovedContent(), task, resultName);
 
 
                         if (nextTaskNameList.size() == 0) {
                         if (nextTaskNameList.size() == 0) {
                             String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
                             String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
@@ -2256,6 +2324,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     if (dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode()) {
                     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);
+                        addCustomWorkflowRecord(userTaskConfig, nextTaskNameList, user, xjrWorkflowOperateRecord, task.getName(), "拒绝", dto.getApprovedContent(), task, resultName);
                         if (nextTaskNameList.size() == 0) {
                         if (nextTaskNameList.size() == 0) {
                             String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
                             String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
                             approveMultiVo.setApproveDetail(message);
                             approveMultiVo.setApproveDetail(message);
@@ -4183,6 +4252,63 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return recordListVos;
         return recordListVos;
     }
     }
 
 
+    /**
+     * 根据流程id  获取流程流转信息(自定义)
+     *
+     * @param processInstanceId
+     * @return
+     */
+    private List<ProcessRecordListVo> getCustomProcessRecordListVos(String processInstanceId, int onlySelf) {
+
+        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
+        List<Long> roleIds = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_ROLE_ID_KEY, new ArrayList<>());
+        LambdaQueryWrapper<XjrWorkflowOperateRecord> workflowOperateRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if (onlySelf == YesOrNoEnum.YES.getCode()) {//仅查看本人
+            if (roleIds.contains(GlobalConstant.SUPER_ADMIN_ROLE_ID)) {//管理员数据
+                workflowOperateRecordLambdaQueryWrapper.eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .orderByAsc(XjrWorkflowOperateRecord::getRecordTime)
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, user.getName())
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, "流程结束")
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, "脚本节点")
+                        .eq(XjrWorkflowOperateRecord::getCreateUserId, StpUtil.getLoginIdAsLong())//脚本任务
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId);
+            } else {//其他人数据
+                workflowOperateRecordLambdaQueryWrapper.eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .orderByAsc(XjrWorkflowOperateRecord::getRecordTime)
+                        .eq(XjrWorkflowOperateRecord::getCreateUserId, StpUtil.getLoginIdAsLong())
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, user.getName())
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, user.getName())
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, "脚本节点")
+                        .eq(XjrWorkflowOperateRecord::getCreateUserId, StpUtil.getLoginIdAsLong())//脚本任务
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId);
+            }
+        } else {
+            workflowOperateRecordLambdaQueryWrapper.eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                    .orderByAsc(XjrWorkflowOperateRecord::getRecordTime);
+        }
+
+        List<XjrWorkflowOperateRecord> workflowOperateRecords = xjrWorkflowOperateRecordMapper.selectList(workflowOperateRecordLambdaQueryWrapper);
+
+        List<ProcessRecordListVo> recordListVos = new ArrayList<>(workflowOperateRecords.size());
+        for (XjrWorkflowOperateRecord workflowOperateRecord : workflowOperateRecords) {
+            ProcessRecordListVo recordListVo = new ProcessRecordListVo();
+            recordListVo.setNodeType(workflowOperateRecord.getNodeType());
+            recordListVo.setNodeName(workflowOperateRecord.getNodeName());
+            recordListVo.setComment(workflowOperateRecord.getOperateInfo());
+            recordListVo.setStartTime(workflowOperateRecord.getRecordTime());
+            recordListVo.setCirculateMessage(workflowOperateRecord.getCirculateMessage());
+            recordListVos.add(recordListVo);
+        }
+
+        return recordListVos;
+    }
+
 
 
     private void invokeAutoAgree(String processInstanceId, Long schemaId, WorkflowSchemaConfig workflowSchemaConfig, List<Task> taskList) {
     private void invokeAutoAgree(String processInstanceId, Long schemaId, WorkflowSchemaConfig workflowSchemaConfig, List<Task> taskList) {
 
 
@@ -4241,6 +4367,9 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         List<Long> allUserIds = new ArrayList<>();//所有自动同意审批的用户id
         List<Long> allUserIds = new ArrayList<>();//所有自动同意审批的用户id
         //新增流程发起流程记录
         //新增流程发起流程记录
         WorkflowRecord record = new WorkflowRecord();
         WorkflowRecord record = new WorkflowRecord();
+        //自定义流程发起记录
+        XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+
         //候选审批人包含流程任务发起人
         //候选审批人包含流程任务发起人
         if (autoAgreeConfig.contains(WorkflowAutoAgreeType.APPROVED_INCLUDE_INITIATOR.getCode())) {
         if (autoAgreeConfig.contains(WorkflowAutoAgreeType.APPROVED_INCLUDE_INITIATOR.getCode())) {
             if (approveUserIds.contains(startUserId)) {
             if (approveUserIds.contains(startUserId)) {
@@ -4308,6 +4437,9 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         if (isAgree) {
         if (isAgree) {
             //自动同意之后完成本次任务
             //自动同意之后完成本次任务
             record.setRecordTime(LocalDateTime.now());
             record.setRecordTime(LocalDateTime.now());
+
+            xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+
             taskService.complete(task.getId());
             taskService.complete(task.getId());
             List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
             List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
             String allOpinions = StringPool.EMPTY;
             String allOpinions = StringPool.EMPTY;
@@ -4321,12 +4453,19 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 String allNextTaskName = StrUtil.join(StringPool.SPACE, list.parallelStream().map(t -> "【" + t.getName() + "】").collect(Collectors.toList()));
                 String allNextTaskName = StrUtil.join(StringPool.SPACE, list.parallelStream().map(t -> "【" + t.getName() + "】").collect(Collectors.toList()));
 
 
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 " + allNextTaskName;
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 " + allNextTaskName;
+                String operateInfo = "审批人:" + approveName + ", 审批结果:" + allOpinions + ", 审批内容:自动同意";
+
                 addProcessRecord(task, schemaId, message, record);
                 addProcessRecord(task, schemaId, message, record);
+                addCustomProcessRecord(task, schemaId, operateInfo, xjrWorkflowOperateRecord);
+
                 // 如果还有用户任务  则递归调用
                 // 如果还有用户任务  则递归调用
                 invokeAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, list);
                 invokeAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, list);
             } else {
             } else {
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 结束节点";
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 结束节点";
+                String operateInfo = "审批人:" + approveName + ", 审批结果:" + allOpinions + ", 审批内容:自动同意";
+
                 addProcessRecord(task, schemaId, message, record);
                 addProcessRecord(task, schemaId, message, record);
+                addCustomProcessRecord(task, schemaId, operateInfo, xjrWorkflowOperateRecord);
             }
             }
         }
         }
 
 
@@ -4642,6 +4781,22 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
 
     }
     }
 
 
+    private void addCustomProcessRecord(Task task, Long schemaId, String message, XjrWorkflowOperateRecord record) {
+
+        IXjrWorkflowOperateRecordService xjrWorkflowOperateRecordService = SpringUtil.getBean(IXjrWorkflowOperateRecordService.class);
+        //新增流程发起流程记录
+        record.setNodeId(task.getId());
+        record.setNodeName(task.getName());
+        record.setNodeType(WorkflowConstant.START_EVENT_TYPE_NAME);
+        record.setProcessId(task.getProcessInstanceId());
+        record.setSchemaId(schemaId);
+        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+
+        record.setOperateInfo(message);
+
+        xjrWorkflowOperateRecordService.save(record);
+    }
+
 
 
     /**
     /**
      * 记录开始节点
      * 记录开始节点
@@ -4899,6 +5054,89 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         workflowRecordMapper.insert(record);
         workflowRecordMapper.insert(record);
     }
     }
 
 
+    /**
+     * 新增工作流程信息数据
+     *
+     * @param userTaskConfig   用户任务配置信息
+     * @param nextTaskNameList 下一个节点的名称集合
+     * @param user             当前用户的对象
+     * @param record           工作流程信息的对象
+     * @param oldTaskName      前一个节点的名称
+     * @param buttonName       按钮名称
+     */
+    private void addCustomWorkflowRecord(UserTaskConfig userTaskConfig, List<String> nextTaskNameList, User user, XjrWorkflowOperateRecord record, String oldTaskName, String buttonName, String approvedContent, Task task, Object resultName) {
+        //单实例
+        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
+            //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
+            if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
+                String message = "审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent;
+                record.setOperateInfo(message);
+            }
+            //单流向
+            if (nextTaskNameList.size() == 1) {
+                String message = "审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent;
+                record.setOperateInfo(message);
+            }//多流向
+            if (nextTaskNameList.size() > 1) {
+                String message = "审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent;
+                record.setOperateInfo(message);
+            }
+        }
+        //多实例,判断是不是会签流程,以及会签流程的状态
+        else {
+            //判断是否达到完成条件
+            List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(task.getProcessInstanceId()).list();
+            Boolean getCompleteConditional = isGetCompleteConditional(userTaskConfig, list);
+
+            //审批但未达到完成条件;审批信息:[会签][用户名] [审批按钮名称]审批,审批意见为:“[审批意见]”。
+            if (getCompleteConditional) {
+                //获取当前节点是否完成会签或者会签失败
+                if (ObjectUtil.isNotEmpty(resultName)) { //resultName只能从这个节点拿,不然会签节点后直接结束流程,就会拿不到流程变量信息
+                    Boolean isSuccess = Boolean.valueOf(resultName.toString());
+                    //审批达到完成条件,完成会签;审批信息:[会签][用户名] [审按名称]审批,审批见为:[审批意见]”,达到会签完成条件,由[上一节点名称]流转到下,多流向的情况则由[上一节点名称] 流转到[多流向节点名称]。
+                    if (isSuccess) {
+                        //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
+                        if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                        //单流向
+                        if (nextTaskNameList.size() == 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }//多流向
+                        if (nextTaskNameList.size() > 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                    }
+                    //审批达到完成条件,会签失败;例如:审批信息:[会签][用户名][审按名称]审批,审批意见为:“[审批意见]”,未达到会签完成条件,由[管理层审批]流转到(部门审批]
+                    if (buttonName.equals(WorkflowApproveType.DISAGREE.getValue())) {
+                        //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
+                        if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ",未达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                        //单流向
+                        if (nextTaskNameList.size() == 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 未达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }//多流向
+                        if (nextTaskNameList.size() > 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 未达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                    }
+                }
+            } else {
+                //审批但未达到完成条件;审批信息:[会签][用户名] [审批按钮名称]审批,审批意见为:“[审批意见]”。
+                String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 未达到会签完成条件";
+                record.setOperateInfo(message);
+            }
+        }
+        xjrWorkflowOperateRecordMapper.insert(record);
+    }
+
     /**
     /**
      * 判断多实例是否达到完成条件
      * 判断多实例是否达到完成条件
      *
      *
@@ -5082,6 +5320,30 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return true;
         return true;
     }
     }
 
 
+    @Override
+    public List<UserDefinedProcessRecordListVo> listApproveRecord(ApproveRecordListDto dto) {
+        List<ProcessRecordListVo> processRecordListVos = this.getCustomProcessRecordListVos(dto.getProcessId(), 0);
+        List<UserDefinedProcessRecordListVo> userDefinedProcessRecordListVos = new ArrayList<>();
+        for(ProcessRecordListVo p : processRecordListVos){
+            String comment = p.getComment();
+            String[] commentArr = comment.split(",");
+            String[] approveUserNameArr = commentArr[0].split(":");
+            String[] approveResultArr = commentArr[1].split(":");
+            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[1]);
+                setApproveResult(approveResultArr[1]);
+                setApproveComment(approveCommentArr[1]);
+            }});
+        }
+        return userDefinedProcessRecordListVos;
+    }
+
     /**
     /**
      * 获取上一节点信息
      * 获取上一节点信息
      * 分两种情况:
      * 分两种情况:

+ 25 - 0
src/main/java/com/xjrsoft/module/workflow/service/impl/XjrWorkflowOperateRecordServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.workflow.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
+import com.xjrsoft.module.workflow.mapper.XjrWorkflowOperateRecordMapper;
+import com.xjrsoft.module.workflow.service.IXjrWorkflowOperateRecordService;
+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: 2024-02-27
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class XjrWorkflowOperateRecordServiceImpl extends MPJBaseServiceImpl<XjrWorkflowOperateRecordMapper, XjrWorkflowOperateRecord> implements IXjrWorkflowOperateRecordService {
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/workflow/vo/UserDefinedProcessRecordListVo.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.workflow.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: tzx
+ * @Date: 2022/11/8 16:10
+ */
+@Data
+public class UserDefinedProcessRecordListVo extends ProcessRecordListVo{
+
+    @ApiModelProperty("审批结果")
+    private String approveResult;
+
+    @ApiModelProperty("审批内容")
+    private String approveComment;
+
+    @ApiModelProperty("审批人姓名")
+    @TableField(exist = false)
+    private String approveUserName;
+}

+ 79 - 0
src/main/java/com/xjrsoft/module/workflow/vo/XjrWorkflowOperateRecordPageVo.java

@@ -0,0 +1,79 @@
+package com.xjrsoft.module.workflow.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 工作流操作记录表分页列表出参
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Data
+public class XjrWorkflowOperateRecordPageVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private String id;
+    /**
+    * 节点id
+    */
+    @ApiModelProperty("节点id")
+    private String nodeId;
+    /**
+    * 节点类型
+    */
+    @ApiModelProperty("节点类型")
+    private String nodeType;
+    /**
+    * 节点名称
+    */
+    @ApiModelProperty("节点名称")
+    private String nodeName;
+    /**
+    * 节点多实例类型(节点审批类型)
+    */
+    @ApiModelProperty("节点多实例类型(节点审批类型)")
+    private Integer nodeMultiType;
+    /**
+    * 模板id
+    */
+    @ApiModelProperty("模板id")
+    private Long schemaId;
+    /**
+    * 流程id
+    */
+    @ApiModelProperty("流程id")
+    private String processId;
+    /**
+    * 审批操作信息
+    */
+    @ApiModelProperty("审批操作信息")
+    private String operateInfo;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private Date recordTime;
+    /**
+    * 传阅信息
+    */
+    @ApiModelProperty("传阅信息")
+    private String circulateMessage;
+    /**
+    * 操作人id
+    */
+    @ApiModelProperty("操作人id")
+    private Long createUserId;
+
+}

+ 74 - 0
src/main/java/com/xjrsoft/module/workflow/vo/XjrWorkflowOperateRecordVo.java

@@ -0,0 +1,74 @@
+package com.xjrsoft.module.workflow.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 工作流操作记录表表单出参
+* @Author dzx
+* @Date: 2024-02-27
+* @Version 1.0
+*/
+@Data
+public class XjrWorkflowOperateRecordVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 节点id
+    */
+    @ApiModelProperty("节点id")
+    private String nodeId;
+    /**
+    * 节点类型
+    */
+    @ApiModelProperty("节点类型")
+    private String nodeType;
+    /**
+    * 节点名称
+    */
+    @ApiModelProperty("节点名称")
+    private String nodeName;
+    /**
+    * 节点多实例类型(节点审批类型)
+    */
+    @ApiModelProperty("节点多实例类型(节点审批类型)")
+    private Integer nodeMultiType;
+    /**
+    * 模板id
+    */
+    @ApiModelProperty("模板id")
+    private Long schemaId;
+    /**
+    * 流程id
+    */
+    @ApiModelProperty("流程id")
+    private String processId;
+    /**
+    * 审批操作信息
+    */
+    @ApiModelProperty("审批操作信息")
+    private String operateInfo;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private Date recordTime;
+    /**
+    * 传阅信息
+    */
+    @ApiModelProperty("传阅信息")
+    private String circulateMessage;
+
+
+
+}

+ 1 - 1
src/main/resources/application-pre.yml

@@ -58,7 +58,7 @@ xjrsoft:
   common:
   common:
     druid-account: admin # druid 监控账户
     druid-account: admin # druid 监控账户
     druid-password: admin # druid 监控密码
     druid-password: admin # druid 监控密码
-    default-password: "cqtlzjzx2023" #默认密码(用户重置密码后为该密码)
+    default-password: "Aa123456." #默认密码(用户重置密码后为该密码)
     domain-api: http://10.150.10.139:8888/api #api域名地址
     domain-api: http://10.150.10.139:8888/api #api域名地址
     #    domain-app: https://yxh-web.ngrok.yingcaibx.com/# #app域名地址
     #    domain-app: https://yxh-web.ngrok.yingcaibx.com/# #app域名地址
     domain-app: http://172.19.17.106:5173/app/# #app域名地址
     domain-app: http://172.19.17.106:5173/app/# #app域名地址

+ 1 - 1
src/main/resources/application-prod.yml

@@ -56,7 +56,7 @@ xjrsoft:
   common:
   common:
     druid-account: admin # druid 监控账户
     druid-account: admin # druid 监控账户
     druid-password: admin # druid 监控密码
     druid-password: admin # druid 监控密码
-    default-password: "cqtlzjzx2023" #默认密码(用户重置密码后为该密码)
+    default-password: "Aa123456." #默认密码(用户重置密码后为该密码)
     domain-api: https://zhxy.cqtlzjzx.com/api #api域名地址
     domain-api: https://zhxy.cqtlzjzx.com/api #api域名地址
     domain-app: https://zhxy.cqtlzjzx.com/app/# #app域名地址
     domain-app: https://zhxy.cqtlzjzx.com/app/# #app域名地址
     domain-web: https://zhxy.cqtlzjzx.com #web域名地址
     domain-web: https://zhxy.cqtlzjzx.com #web域名地址

+ 62 - 17
src/main/resources/mapper/personnel/LaborManagementMapper.xml

@@ -4,19 +4,32 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xjrsoft.module.personnel.mapper.LaborManagementMapper">
 <mapper namespace="com.xjrsoft.module.personnel.mapper.LaborManagementMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.personnel.dto.LaborManagementPageDto" resultType="com.xjrsoft.module.personnel.vo.LaborManagementPageVo">
     <select id="getPage" parameterType="com.xjrsoft.module.personnel.dto.LaborManagementPageDto" resultType="com.xjrsoft.module.personnel.vo.LaborManagementPageVo">
-        SELECT
-        t.id, t.user_name, t.name, t1.name AS gender, t2.start_work_time, t3.name AS jobState, t4.nature_organization, t5.name, t6.name AS job
+        SELECT t.id,
+        t.user_name,
+        t.name,
+        t1.name AS gender,
+        t2.start_work_time,
+        t3.name AS jobState,
+        t4.name as nature_organization,
+        t5.name,
+        t9.name AS job
         FROM xjr_user t
         FROM xjr_user t
         inner JOIN base_teacher t2 ON t2.user_id = t.id
         inner JOIN base_teacher t2 ON t2.user_id = t.id
-        LEFT JOIN xjr_dictionary_detail t1 ON t1.item_id = (SELECT id FROM xjr_dictionary_item WHERE code = 'gender') AND t1.code = (CASE t.gender
-            WHEN 1 THEN 'SB10001'
-            WHEN 2 THEN 'SB10002'
-            WHEN 3 THEN 'SB10003'
-            ELSE t.gender END)
-        LEFT JOIN xjr_dictionary_detail t3 ON t3.item_id = (SELECT id FROM xjr_dictionary_item WHERE code = 'job_state') AND t3.value = t2.job_state
-        LEFT JOIN wf_teacher_depart t4 ON t4.applicant_user_id = t2.user_id
-        LEFT JOIN xjr_department t5 ON t4.dept_name = t5.id
-        LEFT JOIN xjr_dictionary_detail t6 ON t6.code = t4.job
+        LEFT JOIN xjr_dictionary_detail t1
+        ON t1.item_id = (SELECT id FROM xjr_dictionary_item WHERE code = 'gender') AND
+        t1.code = (CASE t.gender
+        WHEN 1 THEN 'SB10001'
+        WHEN 2 THEN 'SB10002'
+        WHEN 3 THEN 'SB10003'
+        ELSE t.gender END)
+        LEFT JOIN xjr_dictionary_detail t3
+        ON t3.item_id = (SELECT id FROM xjr_dictionary_item WHERE code = 'job_state') AND
+        t3.value = t2.job_state
+        LEFT JOIN xjr_dictionary_detail t4 ON t4.code = t2.employ_way
+        LEFT JOIN xjr_user_dept_relation t7 ON t7.user_id = t.id
+        LEFT JOIN xjr_department t5 ON t5.id = t7.dept_id
+        LEFT JOIN xjr_user_post_relation t8 ON t8.user_id = t.id
+        LEFT JOIN xjr_post t9 ON t9.id = t8.post_id
         WHERE t.delete_mark = 0
         WHERE t.delete_mark = 0
         <if test="dto.userName != null">
         <if test="dto.userName != null">
             AND t.user_name = #{dto.userName}
             AND t.user_name = #{dto.userName}
@@ -56,14 +69,46 @@
         ORDER BY t.id;
         ORDER BY t.id;
 
 
     </select>
     </select>
+
+    <select id="listLaborManagementPageVo" resultType="com.xjrsoft.module.personnel.vo.LaborManagementPageVo">
+        SELECT t.id,
+               t.user_name,
+               t.name,
+               t1.name AS gender,
+               t2.start_work_time,
+               t3.name AS jobState,
+               t4.name as nature_organization,
+               t5.name,
+               t9.name AS job
+        FROM xjr_user t
+                 inner JOIN base_teacher t2 ON t2.user_id = t.id
+                 LEFT JOIN xjr_dictionary_detail t1
+                           ON t1.item_id = (SELECT id FROM xjr_dictionary_item WHERE code = 'gender') AND
+                              t1.code = (CASE t.gender
+                                             WHEN 1 THEN 'SB10001'
+                                             WHEN 2 THEN 'SB10002'
+                                             WHEN 3 THEN 'SB10003'
+                                             ELSE t.gender END)
+                 LEFT JOIN xjr_dictionary_detail t3
+                           ON t3.item_id = (SELECT id FROM xjr_dictionary_item WHERE code = 'job_state') AND
+                              t3.value = t2.job_state
+                 LEFT JOIN xjr_dictionary_detail t4 ON t4.code = t2.employ_way
+                 LEFT JOIN xjr_user_dept_relation t7 ON t7.user_id = t.id
+                 LEFT JOIN xjr_department t5 ON t5.id = t7.dept_id
+                 LEFT JOIN xjr_user_post_relation t8 ON t8.user_id = t.id
+                 LEFT JOIN xjr_post t9 ON t9.id = t8.post_id
+        WHERE t.delete_mark = 0
+        ORDER BY t.id;
+    </select>
 <!--
 <!--
 工号:xjruser-username;
 工号:xjruser-username;
 姓名:xjruser-name;
 姓名:xjruser-name;
-性别:xjruser-gender->xjritem-性别id->sjrdition-itemid-code;
-入职时间:baseteacher-startworktime
-在职状态:baseteacher-jobstate
-人员类别:wf_teacher_depart-natureorigan 1
-任职部门:wf_teacher_depart-deptname-xjrdepart->name
-工作岗位:wf_teacher_depart-job
+性别:xjruser-gender->xjritem;
+性别id->sjrdition-itemid-code;
+入职时间:baseteacher-startworktime;
+在职状态:baseteacher-jobstate;
+人员类别:wf_teacher_depart-natureorigan;
+任职部门:wf_teacher_depart-deptname-xjrdepart->name;
+工作岗位:wf_teacher_depart-job;
 -->
 -->
 </mapper>
 </mapper>

+ 14 - 22
src/main/resources/mapper/room/RoomBedMapper.xml

@@ -100,12 +100,7 @@
         WHERE c1.delete_mark = 0 AND c2.delete_mark = 0
         WHERE c1.delete_mark = 0 AND c2.delete_mark = 0
         AND c3.code = 'FB3002' AND c2.class_id = t1.id
         AND c3.code = 'FB3002' AND c2.class_id = t1.id
         <if test="dto.gender != null">
         <if test="dto.gender != null">
-            <if test="dto.gender == 'SB10001'">
-                and c4.gender = 1
-            </if>
-            <if test="dto.gender == 'SB10002'">
-                and c4.gender = 2
-            </if>
+            and c4.gender = #{dto.gender}
         </if>
         </if>
         ) AS need_count,
         ) AS need_count,
         (
         (
@@ -115,12 +110,7 @@
         WHERE a1.delete_mark = 0 AND a2.delete_mark = 0
         WHERE a1.delete_mark = 0 AND a2.delete_mark = 0
         AND a2.class_id = t1.id
         AND a2.class_id = t1.id
         <if test="dto.gender != null">
         <if test="dto.gender != null">
-            <if test="dto.gender == 'SB10001'">
-                and c4.gender = 1
-            </if>
-            <if test="dto.gender == 'SB10002'">
-                and c4.gender = 2
-            </if>
+            and c4.gender = #{dto.gender}
         </if>
         </if>
         ) AS distribute_count FROM base_class t1
         ) AS distribute_count FROM base_class t1
         LEFT JOIN base_grade t2 ON t1.grade_id = t2.id
         LEFT JOIN base_grade t2 ON t1.grade_id = t2.id
@@ -134,12 +124,7 @@
         WHERE c1.delete_mark = 0 AND c2.delete_mark = 0
         WHERE c1.delete_mark = 0 AND c2.delete_mark = 0
         AND c3.code = 'FB3002' AND c2.class_id = t1.id
         AND c3.code = 'FB3002' AND c2.class_id = t1.id
         <if test="dto.gender != null">
         <if test="dto.gender != null">
-            <if test="dto.gender == 'SB10001'">
-                and c4.gender = 1
-            </if>
-            <if test="dto.gender == 'SB10002'">
-                and c4.gender = 2
-            </if>
+            and c4.gender = #{dto.gender}
         </if>
         </if>
         ) >
         ) >
         (
         (
@@ -179,7 +164,7 @@
         LEFT JOIN xjr_user t3 ON t2.user_id = t3.id
         LEFT JOIN xjr_user t3 ON t2.user_id = t3.id
         WHERE t1.delete_mark = 0
         WHERE t1.delete_mark = 0
         AND t2.delete_mark = 0 AND t3.delete_mark = 0
         AND t2.delete_mark = 0 AND t3.delete_mark = 0
-        AND t3.gender = 1
+        AND t3.gender = 'SB10001'
         AND t2.stduy_status = 'FB3002' GROUP BY t1.id
         AND t2.stduy_status = 'FB3002' GROUP BY t1.id
     </select>
     </select>
     <!-- 需要安排的女生总人数 -->
     <!-- 需要安排的女生总人数 -->
@@ -189,7 +174,7 @@
         LEFT JOIN xjr_user t3 ON t2.user_id = t3.id
         LEFT JOIN xjr_user t3 ON t2.user_id = t3.id
         WHERE t1.delete_mark = 0
         WHERE t1.delete_mark = 0
         AND t2.delete_mark = 0 AND t3.delete_mark = 0
         AND t2.delete_mark = 0 AND t3.delete_mark = 0
-        AND t3.gender = 2
+        AND t3.gender = 'SB10002'
         AND t2.stduy_status = 'FB3002' GROUP BY t1.id
         AND t2.stduy_status = 'FB3002' GROUP BY t1.id
     </select>
     </select>
     <!-- 已分配的总人数 -->
     <!-- 已分配的总人数 -->
@@ -295,7 +280,7 @@
     </select>
     </select>
 
 
     <select id="getClassStudetBed" parameterType="com.xjrsoft.module.room.dto.AdjustClassPageDto" resultType="com.xjrsoft.module.room.vo.AdjustBedClassStudentPageVo">
     <select id="getClassStudetBed" parameterType="com.xjrsoft.module.room.dto.AdjustClassPageDto" resultType="com.xjrsoft.module.room.vo.AdjustBedClassStudentPageVo">
-        SELECT t1.user_id,t4.id AS class_id, t4.name AS class_name,t2.name AS student_name,REPLACE(REPLACE(t2.gender,1,'男'),2,'女') AS gender_cn,t7.name AS build_name,t6.room_name,t5.bed_number FROM base_student t1
+        SELECT t1.user_id,t4.id AS class_id, t4.name AS class_name,t2.name AS student_name,REPLACE(REPLACE(t2.gender,'SB10001','男'),'SB10002','女') AS gender_cn,t7.name AS build_name,t6.room_name,t5.bed_number FROM base_student t1
         LEFT JOIN xjr_user t2 ON t1.user_id = t2.id
         LEFT 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_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_class t4 ON t3.class_id = t4.id
@@ -371,7 +356,7 @@
     </select>
     </select>
 
 
     <select id="getNoBedStudent" parameterType="com.xjrsoft.module.room.dto.AdjustBedPageDto" resultType="com.xjrsoft.module.room.vo.NoBedStudentPageVo">
     <select id="getNoBedStudent" parameterType="com.xjrsoft.module.room.dto.AdjustBedPageDto" resultType="com.xjrsoft.module.room.vo.NoBedStudentPageVo">
-        SELECT t1.user_id, t2.name AS student_name,REPLACE(REPLACE(t2.gender,1,'男'),2,'女') as gender_cn,t4.name AS class_name FROM base_student t1
+        SELECT t1.user_id, t2.name AS student_name,REPLACE(REPLACE(t2.gender,'SB10001','男'),'SB10002','女') as gender_cn,t4.name AS class_name FROM base_student t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
         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_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_class t4 ON t3.class_id = t4.id
@@ -381,5 +366,12 @@
             SELECT student_user_id FROM room_bed WHERE delete_mark = 0 AND student_user_id IS NOT NULL
             SELECT student_user_id FROM room_bed WHERE delete_mark = 0 AND student_user_id IS NOT NULL
         )
         )
     </select>
     </select>
+    <select id="getBedInfoByUserId" resultType="com.xjrsoft.module.room.vo.RoomBedInfoVo">
+        SELECT t3.name as build_name,t2.room_name,t1.bed_number,t1.id FROM room_bed t1
+        LEFT JOIN room t2 ON t1.room_id = t2.id
+        LEFT JOIN base_office_build t3 ON t2.office_build_id = t3.id
+        WHERE t3.build_type = 'FB3604'
+        AND t1.student_user_id = #{id}
+    </select>
 
 
 </mapper>
 </mapper>

+ 68 - 0
src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml

@@ -0,0 +1,68 @@
+<?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.BaseStudentSchoolRollMapper">
+    <select id="getMobilePage" parameterType="com.xjrsoft.module.student.dto.BaseStudentInfoPageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentInfoPageVo">
+        SELECT t2.id,
+        t2.name AS student_name,
+        t1.student_id,
+        t2.mobile AS phone,
+        CONCAT(t5.name, ' ', t5.mobile) AS teacher_name,
+        t4.name AS class_name,
+        t6.mobile AS guardian_phone
+        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
+        LEFT JOIN base_class t4 ON t3.class_id = t4.id
+        LEFT JOIN xjr_user t5 ON t4.teacher_id = t5.id
+        LEFT JOIN base_student_family_member t6 ON t6.user_id = t2.id AND t6.delete_mark = 0 AND t6.is_guardian = 1
+        WHERE t2.delete_mark = 0
+        AND t1.delete_mark = 0
+        <if test="dto.gradeId != null">
+            and t4.grade_id = #{dto.gradeId}
+        </if>
+        <if test="dto.majorSetId != null">
+            and t3.major_set_id = #{dto.majorSetId}
+        </if>
+        <if test="dto.classId != null">
+            and t4.id = #{dto.classId}
+        </if>
+        <if test="dto.teacherId != null">
+            and t4.teacher_id = #{dto.teacherId}
+        </if>
+        <if test="dto.keyWord != null and dto.keyWord != ''">
+            and (t4.name like concat('%', #{dto.keyWord}, '%')
+            or t2.name like concat('%', #{dto.keyWord}, '%')
+            or t5.name like concat('%', #{dto.keyWord}, '%')
+            or t1.student_id like concat('%', #{dto.keyWord}, '%')
+            or t2.mobile like concat('%', #{dto.keyWord}, '%')
+            or t6.mobile LIKE concat('%', #{dto.keyWord}, '%')
+            )
+        </if>
+    </select>
+    <select id="getInfoById" resultType="com.xjrsoft.module.student.vo.BaseStudentInfoDetailVo">
+        SELECT t2.id,t2.name AS student_name,t1.student_id,t2.mobile AS phone,CONCAT(t5.name, ' ', t5.mobile) AS teacher_name,t4.name AS class_name,
+        (SELECT mobile FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t2.id AND is_guardian = 1) AS guardian_phone,
+        t8.name AS archives_status,t7.name AS stduy_status,t9.name AS roll_modality,t2.birth_date, t2.gender,t2.avatar,
+        t6.name AS nation,t10.name AS major_set_name,t3.archives_status as archivesStatusCode,t3.stduy_status as stduyStatusCode,t3.roll_modality as rollModalityCode
+        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
+        LEFT JOIN base_class t4 ON t3.class_id = t4.id
+        LEFT JOIN xjr_user t5 ON t4.teacher_id = t5.id
+        LEFT JOIN xjr_dictionary_detail t6 ON t6.code = t1.nation AND t6.item_id = 2023000000000000008
+        LEFT JOIN xjr_dictionary_detail t7 ON t7.code = t3.stduy_status AND t7.item_id = 2023000000000000030
+        LEFT JOIN xjr_dictionary_detail t8 ON t8.code = t3.archives_status AND t8.item_id = 2023000000000000029
+        LEFT JOIN xjr_dictionary_detail t9 ON t9.code = t3.roll_modality AND t9.item_id = 1762024751192084482
+        LEFT JOIN base_major_set t10 ON t3.major_set_id = t10.id
+        WHERE t2.id = #{id}
+    </select>
+    <update id="updateInfoByUserId" parameterType="com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto">
+        UPDATE base_student_school_roll SET delete_mark = delete_mark
+        <if test="dto.rollModality != null and dto.rollModality != ''">,roll_modality = #{dto.rollModality} </if>
+        <if test="dto.archivesStatus != null and dto.archivesStatus != ''">,archives_status = #{dto.archivesStatus} </if>
+        <if test="dto.stduyStatus != null and dto.stduyStatus != ''">,stduy_status = #{dto.stduyStatus} </if>
+        where user_id = #{id}
+    </update>
+</mapper>

+ 4 - 4
src/main/resources/mapper/teacher/AttendancePersonnelMapper.xml

@@ -10,7 +10,7 @@
         t1.id as userId,
         t1.id as userId,
         t1.name as userName,
         t1.name as userName,
         t1.user_name as jobNumber,
         t1.user_name as jobNumber,
-        REPLACE(REPLACE(t1.gender,1,'男'),2,'女') AS gender,
+        REPLACE(REPLACE(t1.gender,'SB10001','男'),'SB10002','女') AS gender,
         t1.mobile as mobile,
         t1.mobile as mobile,
         t5.name as deptName,
         t5.name as deptName,
         t4.name as postName
         t4.name as postName
@@ -24,7 +24,7 @@
         <if test="dto.keyword != null and dto.keyword != ''">
         <if test="dto.keyword != null and dto.keyword != ''">
             and (
             and (
             t1.name LIKE CONCAT('%',#{dto.keyword},'%')
             t1.name LIKE CONCAT('%',#{dto.keyword},'%')
-            OR t1.gender LIKE CONCAT('%',REPLACE(REPLACE(#{dto.keyword},'男',1),'女',2),'%')
+            OR t1.gender LIKE CONCAT('%',REPLACE(REPLACE(#{dto.keyword},'男','SB10001'),'女','SB10002'),'%')
             OR t1.mobile LIKE CONCAT('%',#{dto.keyword},'%')
             OR t1.mobile LIKE CONCAT('%',#{dto.keyword},'%')
             OR t1.user_name LIKE CONCAT('%',#{dto.keyword},'%')
             OR t1.user_name LIKE CONCAT('%',#{dto.keyword},'%')
             OR t4.name LIKE CONCAT('%',#{dto.keyword},'%')
             OR t4.name LIKE CONCAT('%',#{dto.keyword},'%')
@@ -39,7 +39,7 @@
         select
         select
             t.id as userId,
             t.id as userId,
             t.name as userName,
             t.name as userName,
-            REPLACE(REPLACE(t.gender,1,'男'),2,'女') AS gender,
+            REPLACE(REPLACE(t.gender,'SB10001','男'),'SB10002','女') AS gender,
             t.mobile as mobile,
             t.mobile as mobile,
             t.user_name as jobNumber,
             t.user_name as jobNumber,
             t3.name as deptName,
             t3.name as deptName,
@@ -63,7 +63,7 @@
             <if test="dto.keyword != null and dto.keyword != ''">
             <if test="dto.keyword != null and dto.keyword != ''">
                 and (
                 and (
                 t.name LIKE CONCAT('%',#{dto.keyword},'%')
                 t.name LIKE CONCAT('%',#{dto.keyword},'%')
-                OR t.gender LIKE CONCAT('%',REPLACE(REPLACE(#{dto.keyword},'男',1),'女',2),'%')
+                OR t.gender LIKE CONCAT('%',REPLACE(REPLACE(#{dto.keyword},'男','SB10001'),'女','SB10002'),'%')
                 OR t.mobile LIKE CONCAT('%',#{dto.keyword},'%')
                 OR t.mobile LIKE CONCAT('%',#{dto.keyword},'%')
                 OR t.user_name LIKE CONCAT('%',#{dto.keyword},'%')
                 OR t.user_name LIKE CONCAT('%',#{dto.keyword},'%')
                 OR t3.name LIKE CONCAT('%',#{dto.keyword},'%')
                 OR t3.name LIKE CONCAT('%',#{dto.keyword},'%')

+ 26 - 7
src/main/resources/mapper/textbook/TextbookIssueRecordMapper.xml

@@ -71,25 +71,44 @@
     </select>
     </select>
 
 
     <select id="getList" parameterType="com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto" resultType="com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo">
     <select id="getList" parameterType="com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto" resultType="com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo">
-        SELECT t1.id,t1.sort_code,t3.issn,t3.book_name,t3.publishing_house,t3.editor_in_chief,t7.group_name,t5.name AS grade_name,
-        t6.name AS class_name,t8.name AS course_name,t10.name AS textbook_type_cn,t3.specifications_models,
-        t11.name AS issue_mode_cn,t1.create_date,t9.name AS claim_user,t1.issue_number FROM textbook_issue_record t1
+        SELECT t1.id,
+        t1.sort_code,
+        t3.issn,
+        t3.book_name,
+        t3.publishing_house,
+        t3.editor_in_chief,
+        t7.group_name,
+        t5.name  AS grade_name,
+        ifnull(t6.name, t14.name)  AS class_name,
+        t8.name  AS course_name,
+        t10.name AS textbook_type_cn,
+        t3.specifications_models,
+        t11.name AS issue_mode_cn,
+        t1.create_date,
+        t9.name  AS claim_user,
+        t1.issue_number,
+        t15.name as baseSemesterIdCn
+        FROM textbook_issue_record t1
         LEFT JOIN wf_textbook_claim_item t2 ON t1.data_item_id = t2.id
         LEFT JOIN wf_textbook_claim_item t2 ON t1.data_item_id = t2.id
-        LEFT JOIN textbook t3 ON t2.textbook_id = t3.id
-        LEFT JOIN wf_textbook_claim t4 ON t2.wf_textbook_claim_id = t4.id
+        LEFT JOIN wf_textbook_claim t4 ON t1.data_id = t4.id
+        LEFT JOIN wf_textbook_recede_item t12 ON t12.id = t1.data_item_id
+        LEFT JOIN wf_textbook_recede t13 ON t13.id = t1.data_id
+        LEFT JOIN textbook t3 ON t3.id = t1.textbook_id
         LEFT JOIN base_grade t5 ON t3.grade_id = t5.id
         LEFT JOIN base_grade t5 ON t3.grade_id = t5.id
         LEFT JOIN base_class t6 ON t4.class_id = t6.id
         LEFT JOIN base_class t6 ON t4.class_id = t6.id
+        LEFT JOIN base_class t14 ON t13.class_id = t14.id
         LEFT JOIN subject_group t7 ON t3.subject_group_id = t7.id
         LEFT JOIN subject_group t7 ON t3.subject_group_id = t7.id
         LEFT JOIN base_course_subject t8 ON t3.course_subject_id = t8.id
         LEFT JOIN base_course_subject t8 ON t3.course_subject_id = t8.id
-        LEFT JOIN xjr_user t9 ON t4.claim_user_id = t9.id
+        LEFT JOIN xjr_user t9 ON t1.receive_user_id = t9.id
         LEFT JOIN xjr_dictionary_detail t10 ON t3.textbook_type = t10.code AND t10.item_id = 1739209191193636865
         LEFT JOIN xjr_dictionary_detail t10 ON t3.textbook_type = t10.code AND t10.item_id = 1739209191193636865
         LEFT JOIN xjr_dictionary_detail t11 ON t1.issue_mode = t11.code AND t11.item_id = 1739821685805215745
         LEFT JOIN xjr_dictionary_detail t11 ON t1.issue_mode = t11.code AND t11.item_id = 1739821685805215745
+        LEFT JOIN base_semester t15 ON t15.id = t3.base_semester_id
         WHERE t1.delete_mark = 0
         WHERE t1.delete_mark = 0
         <if test="dto.ids != null and dto.ids.size() > 0">
         <if test="dto.ids != null and dto.ids.size() > 0">
             and t1.id in <foreach item="id" index="index" collection="dto.ids" open="(" close=")"
             and t1.id in <foreach item="id" index="index" collection="dto.ids" open="(" close=")"
                                   separator=",">
                                   separator=",">
             #{id}
             #{id}
-        </foreach>
+                        </foreach>
         </if>
         </if>
         order by t1.create_date desc
         order by t1.create_date desc
     </select>
     </select>

+ 38 - 29
src/main/resources/mapper/textbook/TextbookMapper.xml

@@ -23,13 +23,13 @@
         <if test="dto.textbookType != null and dto.textbookType != ''">
         <if test="dto.textbookType != null and dto.textbookType != ''">
             and t1.textbook_type = #{dto.textbookType}
             and t1.textbook_type = #{dto.textbookType}
         </if>
         </if>
-        <if test="dto.baseSemesterId != null">
+        <if test="dto.baseSemesterId != null and dto.baseSemesterId > 0">
             and t1.base_semester_id = #{dto.baseSemesterId}
             and t1.base_semester_id = #{dto.baseSemesterId}
         </if>
         </if>
-        <if test="dto.subjectGroupId != null">
+        <if test="dto.subjectGroupId != null and dto.subjectGroupId > 0">
             and t1.subject_group_id = #{dto.subjectGroupId}
             and t1.subject_group_id = #{dto.subjectGroupId}
         </if>
         </if>
-        <if test="dto.courseSubjectId != null">
+        <if test="dto.courseSubjectId != null and dto.courseSubjectId > 0">
             and t1.course_subject_id = #{dto.courseSubjectId}
             and t1.course_subject_id = #{dto.courseSubjectId}
         </if>
         </if>
         <if test="dto.bookName != null and dto.bookName != ''">
         <if test="dto.bookName != null and dto.bookName != ''">
@@ -186,13 +186,13 @@
         <if test="dto.textbookType != null and dto.textbookType != ''">
         <if test="dto.textbookType != null and dto.textbookType != ''">
             and t1.textbook_type = #{dto.textbookType}
             and t1.textbook_type = #{dto.textbookType}
         </if>
         </if>
-        <if test="dto.baseSemesterId != null">
+        <if test="dto.baseSemesterId != null and dto.baseSemesterId > 0">
             and t1.base_semester_id = #{dto.baseSemesterId}
             and t1.base_semester_id = #{dto.baseSemesterId}
         </if>
         </if>
-        <if test="dto.subjectGroupId != null">
+        <if test="dto.subjectGroupId != null and dto.subjectGroupId > 0">
             and t1.subject_group_id = #{dto.subjectGroupId}
             and t1.subject_group_id = #{dto.subjectGroupId}
         </if>
         </if>
-        <if test="dto.courseSubjectId != null">
+        <if test="dto.courseSubjectId != null and dto.courseSubjectId > 0">
             and t1.course_subject_id = #{dto.courseSubjectId}
             and t1.course_subject_id = #{dto.courseSubjectId}
         </if>
         </if>
         <if test="dto.bookName != null and dto.bookName != ''">
         <if test="dto.bookName != null and dto.bookName != ''">
@@ -238,13 +238,13 @@
         <if test="dto.textbookType != null and dto.textbookType != ''">
         <if test="dto.textbookType != null and dto.textbookType != ''">
             and t8.textbook_type = #{dto.textbookType}
             and t8.textbook_type = #{dto.textbookType}
         </if>
         </if>
-        <if test="dto.baseSemesterId != null">
+        <if test="dto.baseSemesterId != null and dto.baseSemesterId > 0">
             and t8.base_semester_id = #{dto.baseSemesterId}
             and t8.base_semester_id = #{dto.baseSemesterId}
         </if>
         </if>
-        <if test="dto.subjectGroupId != null">
+        <if test="dto.subjectGroupId != null and dto.subjectGroupId > 0">
             and t8.subject_group_id = #{dto.subjectGroupId}
             and t8.subject_group_id = #{dto.subjectGroupId}
         </if>
         </if>
-        <if test="dto.courseSubjectId != null">
+        <if test="dto.courseSubjectId != null and dto.courseSubjectId > 0">
             and t8.course_subject_id = #{dto.courseSubjectId}
             and t8.course_subject_id = #{dto.courseSubjectId}
         </if>
         </if>
         <if test="dto.bookName != null and dto.bookName != ''">
         <if test="dto.bookName != null and dto.bookName != ''">
@@ -271,41 +271,49 @@
                 left join wf_textbook_claim_item t1 on t1.wf_textbook_claim_id = t.id
                 left join wf_textbook_claim_item t1 on t1.wf_textbook_claim_id = t.id
                 left join textbook t2 on t2.id = t1.textbook_id
                 left join textbook t2 on t2.id = t1.textbook_id
             where claim_type = 'claim_student'
             where claim_type = 'claim_student'
-            <if test="dto.baseSemesterId != null">
-                amd t.base_semester_id = #{dto.baseSemesterId}
+            <if test="dto.baseSemesterId != null and dto.baseSemesterId > 0">
+                and t.base_semester_id = #{dto.baseSemesterId}
             </if>
             </if>
-            <if test="dto.classId != null">
+            <if test="dto.classId != null and dto.classId > 0">
                 and t.class_id = #{dto.classId}
                 and t.class_id = #{dto.classId}
             </if>
             </if>
-            <if test="dto.textbookId != null">
+            <if test="dto.textbookId != null and dto.textbookId > 0">
                 and t1.textbook_id = #{dto.textbookId}
                 and t1.textbook_id = #{dto.textbookId}
             </if>
             </if>
             group by t.base_semester_id, t.class_id, t1.textbook_id
             group by t.base_semester_id, t.class_id, t1.textbook_id
         )
         )
         select
         select
-            t.base_semester_id,
-            t.class_id,
-            t.textbook_id,
-            t2.name as textbookTypeCn,
-            t1.book_name,
-            t1.editor_in_chief,
-            t1.publishing_house,
-            t1.issn,
-            t1.appraisal_price,
-            t1.subtotal,
-            t.num,
-            t.claimNum
+        t.base_semester_id,
+        t3.name as baseSemesterIdCn,
+        t.class_id,
+        t4.name as classIdCn,
+        t5.name as headTeacherName,
+        t6.name as classRoomName,
+        t.textbook_id,
+        t2.name as textbookTypeCn,
+        t1.book_name,
+        t1.editor_in_chief,
+        t1.publishing_house,
+        t1.issn,
+        t1.appraisal_price,
+        t1.subtotal,
+        t.num,
+        t.claimNum
         from textbook_class t
         from textbook_class t
-            left join textbook t1 on t1.id = t.textbook_id
-            left join xjr_dictionary_detail t2 on t2.code = t1.textbook_type
+        left join textbook t1 on t1.id = t.textbook_id
+        left join xjr_dictionary_detail t2 on t2.code = t1.textbook_type
+        left join base_semester t3 on t3.id = t.base_semester_id
+        left join base_class t4 on t4.id = t.class_id
+        left join xjr_user t5 on t5.id = t4.teacher_id
+        left join base_classroom t6 on t6.id = t4.classroom_id
         <where>
         <where>
             <if test="dto.textbookType != null and dto.textbookType != ''">
             <if test="dto.textbookType != null and dto.textbookType != ''">
                 and t1.textbook_type = #{dto.textbookType}
                 and t1.textbook_type = #{dto.textbookType}
             </if>
             </if>
-            <if test="dto.subjectGroupId != null">
+            <if test="dto.subjectGroupId != null and dto.subjectGroupId > 0">
                 and t1.subject_group_id = #{dto.subjectGroupId}
                 and t1.subject_group_id = #{dto.subjectGroupId}
             </if>
             </if>
-            <if test="dto.courseSubjectId != null">
+            <if test="dto.courseSubjectId != null and dto.courseSubjectId > 0">
                 and t1.course_subject_id = #{dto.courseSubjectId}
                 and t1.course_subject_id = #{dto.courseSubjectId}
             </if>
             </if>
             <if test="dto.bookName != null and dto.bookName != ''">
             <if test="dto.bookName != null and dto.bookName != ''">
@@ -318,5 +326,6 @@
                 and t1.issn like concat('%', #{dto.issn}, '%')
                 and t1.issn like concat('%', #{dto.issn}, '%')
             </if>
             </if>
         </where>
         </where>
+        order by t2.name desc
     </select>
     </select>
 </mapper>
 </mapper>

+ 0 - 1
src/main/resources/mapper/textbook/TextbookWarehouseRecordMapper.xml

@@ -32,7 +32,6 @@
         LEFT JOIN base_course_subject t5 ON t3.course_subject_id = t5.id
         LEFT JOIN base_course_subject t5 ON t3.course_subject_id = t5.id
         LEFT JOIN xjr_dictionary_detail t6 ON t3.textbook_type = t6.code AND t6.item_id = 1739209191193636865
         LEFT JOIN xjr_dictionary_detail t6 ON t3.textbook_type = t6.code AND t6.item_id = 1739209191193636865
         LEFT JOIN base_grade t7 ON t3.grade_id = t7.id
         LEFT JOIN base_grade t7 ON t3.grade_id = t7.id
-        LEFT JOIN textbook_class_relation t8 ON t8.textbook_id = t3.id
         LEFT JOIN base_semester t9 ON t9.id = t3.base_semester_id
         LEFT JOIN base_semester t9 ON t9.id = t3.base_semester_id
         WHERE t1.delete_mark = 0
         WHERE t1.delete_mark = 0
         <if test="dto.textbookType != null and dto.textbookType != ''">
         <if test="dto.textbookType != null and dto.textbookType != ''">

+ 17 - 0
src/test/java/com/xjrsoft/module/ledger/service/impl/WfSubscriptionServiceImplTest.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.ledger.service.impl;
+
+import com.xjrsoft.module.ledger.service.IWfSubscriptionService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.junit.jupiter.api.Assertions.*;
+@SpringBootTest
+class WfSubscriptionServiceImplTest {
+    @Autowired
+    private IWfSubscriptionService wfSubscriptionService;
+    @Test
+    void dataHandle() {
+        wfSubscriptionService.dataHandle(1732758742634655744L);
+    }
+}

+ 20 - 0
src/test/java/com/xjrsoft/module/system/service/impl/FileServiceImplTest.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.system.service.impl;
+
+import com.xjrsoft.module.system.service.IFileService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@SpringBootTest
+class FileServiceImplTest {
+
+    @Autowired
+    private IFileService fileService;
+
+    @Test
+    void downloadFileByZip() {
+        fileService.downloadFileByZip(1763433147208306689L);
+    }
+}

+ 240 - 0
src/test/java/com/xjrsoft/xjrsoftboot/DataMaintenanceTest.java

@@ -0,0 +1,240 @@
+package com.xjrsoft.xjrsoftboot;
+
+import cn.hutool.db.Db;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.read.listener.PageReadListener;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.entity.BaseMajorSet;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.sql.DataSource;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+@SpringBootTest
+public class DataMaintenanceTest {
+
+    @Test
+    public void maintenanceStudent(){
+        //读取excel的数据
+        List<StudentInfo> studentInfoList = new ArrayList<>();
+        String fileName = "C:\\Users\\大数据与最优化研究所\\Desktop\\公司-沈祖山\\学生信息20240222.xls";
+        EasyExcel.read(fileName, StudentInfo.class, new PageReadListener<StudentInfo>(studentInfoList::addAll)).sheet().doRead();
+
+        //读取数据库的数据
+        List<XjrUser> xjrUserList = new ArrayList<>();
+        List<BaseGrade> baseGradeList = new ArrayList<>();
+        List<BaseMajorSet> baseMajorSetList = new ArrayList<>();
+        List<BaseClass> baseClassList = new ArrayList<>();
+        List<DictionaryDetail> studentTypeList = new ArrayList<>();
+        List<DictionaryDetail> stduyStatusList = new ArrayList<>();
+        DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        try {
+            Db use = Db.use(datasource);
+            //学生用户id和身份证
+            String listXjrUserSql = "select t.credential_number,t.id from xjr_user t left join xjr_user_role_relation t1 on t1.user_id = t.id where t1.role_id = 3 and t.delete_mark = 0 and t.enabled_mark = 1";
+            xjrUserList = use.query(listXjrUserSql, XjrUser.class);
+            //年级id和年级name
+            String listGradeSql = "select t.id,t.name from base_grade t";
+            baseGradeList = use.query(listGradeSql, BaseGrade.class);
+            //在读专业方向id和在读专业方向name
+            String listMajorSeteSql = "select t.id,t.name from base_major_set t";
+            baseMajorSetList = use.query(listMajorSeteSql, BaseMajorSet.class);
+            //班级id和班级name
+            String listClassSql = "select t.id,t.name from base_class t";
+            baseClassList = use.query(listClassSql, BaseClass.class);
+            //学生类型code和学生类型name
+            String liststudentTypeSql = "select t.code,t.name from xjr_dictionary_detail t LEFT JOIN xjr_dictionary_item t1 on t1.id = t.item_id where t.delete_mark = 0 and t.enabled_mark = 1 and t1.`code` = 'student_type'";
+            studentTypeList = use.query(liststudentTypeSql, DictionaryDetail.class);
+            //就读方式code和就读方式name
+            String liststudentStatusSql = "select t.code,t.name from xjr_dictionary_detail t LEFT JOIN xjr_dictionary_item t1 on t1.id = t.item_id where t.delete_mark = 0 and t.enabled_mark = 1 and t1.`code` = 'stduy_status'";
+            stduyStatusList = use.query(liststudentStatusSql, DictionaryDetail.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        List<Object> propertyList1 = studentInfoList.stream()
+                .map(studentInfo -> getProperty(studentInfo, "sfzh"))
+                .collect(Collectors.toList());
+
+        List<Object> propertyList2 = xjrUserList.stream()
+                .map(xjrUser -> getProperty(xjrUser, "credentialNumber"))
+                .collect(Collectors.toList());
+
+        List<Object> differentProperties = new ArrayList<>(propertyList1);
+        differentProperties.removeAll(propertyList2);
+
+        System.out.println("集合一中有,集合二中没有的的属性值:");
+        //differentProperties.forEach(System.out::println);
+
+        List<Object> differentProperties1 = new ArrayList<>(propertyList2);
+        differentProperties1.removeAll(propertyList1);
+
+        //System.out.println("集合二中有,集合一中没有的的属性值:");
+        //differentProperties1.forEach(System.out::println);
+
+        //已有学生数据身份证号和用户id的映射
+        Map<String, Long> credentialNumberAndUserId = new HashMap<>();
+        for (XjrUser xjrUser : xjrUserList){
+            if(xjrUser.getCredentialNumber() != null){
+                credentialNumberAndUserId.put(xjrUser.getCredentialNumber(), xjrUser.getId());
+            }
+        }
+
+        //年级id和年级name的映射
+        Map<String, Long> gradeByNameAndIdMap = new HashMap<>();
+        for (BaseGrade baseGrade : baseGradeList){
+            if(baseGrade.getName() != null){
+                gradeByNameAndIdMap.put(baseGrade.getName(), baseGrade.getId());
+            }
+        }
+
+        //在读专业方向id和在读专业方向name的映射
+        Map<String, Long> baseMajorSetByNameAndIdMap = new HashMap<>();
+        for (BaseMajorSet baseMajorSet : baseMajorSetList){
+            if(baseMajorSet.getName() != null){
+                baseMajorSetByNameAndIdMap.put(baseMajorSet.getName(), baseMajorSet.getId());
+            }
+        }
+
+        //班级id和班级name的映射
+        Map<String, Long> baseClassByNameAndIdMap = new HashMap<>();
+        for (BaseClass baseClass : baseClassList){
+            if(baseClass.getName() != null){
+                baseClassByNameAndIdMap.put(baseClass.getName(), baseClass.getId());
+            }
+        }
+
+        //学生类型code和学生类型name的映射
+        Map<String, String> studentTypeByNameAndCodeMap = new HashMap<>();
+        for (DictionaryDetail dictionaryDetail : studentTypeList){
+            if(dictionaryDetail.getName() != null){
+                studentTypeByNameAndCodeMap.put(dictionaryDetail.getName(), dictionaryDetail.getCode());
+            }
+        }
+
+        //就读方式code和就读方式name的映射
+        Map<String, String> stduyStatusByNameAndCodeMap = new HashMap<>();
+        for (DictionaryDetail dictionaryDetail : stduyStatusList){
+            if(dictionaryDetail.getName() != null){
+                stduyStatusByNameAndCodeMap.put(dictionaryDetail.getName(), dictionaryDetail.getCode());
+            }
+        }
+
+        //处理所有数据的信息
+        //添加学生家庭成员信息,添加的为监护人
+        StringBuilder modifyBSFMSqlSb = new StringBuilder();
+        modifyBSFMSqlSb.append("# base_student_family_member新增监护人电话 \n");
+        modifyBSFMSqlSb.append("INSERT INTO base_student_family_member (id, create_user_id, create_date, delete_mark, enabled_mark, user_id, name, mobile, is_guardian) \nVALUES ");
+        //学生学籍信息修改
+        StringBuilder modifyBSSRSqlSb = new StringBuilder();
+        modifyBSSRSqlSb.append("# base_student_school_roll学生学籍信息修改\nBEGIN;\n");
+        //学生学号信息修改
+        StringBuilder modifyBSSqlSb = new StringBuilder();
+        modifyBSSqlSb.append("# base_student学生学号信息修改 \nBEGIN;\n");
+
+        long BSFMId = 456789123462290L;
+        for (int i = 0; i < studentInfoList.size(); i++) {
+            StudentInfo studentInfo = studentInfoList.get(i);
+            if(differentProperties.contains(studentInfo.getSfzh())
+                    || credentialNumberAndUserId.get(studentInfo.getSfzh()) == null
+                    || studentInfo.getJhrdh().isEmpty()){
+                continue;
+            }
+            modifyBSFMSqlSb.append("(");
+            modifyBSFMSqlSb.append(++BSFMId);
+            modifyBSFMSqlSb.append(", 1000000000000000000, '2024-02-23', 0, 1, ");
+            modifyBSFMSqlSb.append(credentialNumberAndUserId.get(studentInfo.getSfzh()));
+            modifyBSFMSqlSb.append(", '', '");
+            modifyBSFMSqlSb.append(studentInfo.getJhrdh());
+            modifyBSFMSqlSb.append("', 1),\n");
+
+            if(differentProperties.contains(studentInfo.getSfzh()) || studentInfo.getJhrdh().isEmpty()){
+                continue;
+            }
+
+            modifyBSSRSqlSb.append("UPDATE base_student_school_roll SET roll_number = '"
+                    + studentInfo.getXjh()
+                    + "', archives_number = '"
+                    + studentInfo.getXsdabh()
+                    + "', ");
+            if(gradeByNameAndIdMap.get(studentInfo.getBjnj()) != null){
+                modifyBSSRSqlSb.append("grade_id = "
+                                    + (gradeByNameAndIdMap.get(studentInfo.getBjnj()))
+                                    + ", ");
+
+            }
+            if(baseMajorSetByNameAndIdMap.get(studentInfo.getZdzyfx()) != null){
+                modifyBSSRSqlSb.append("major_set_id = "
+                        + baseMajorSetByNameAndIdMap.get(studentInfo.getZdzyfx())
+                        + ", ");
+            }
+            if(baseClassByNameAndIdMap.get(studentInfo.getBjmc()) != null){
+                modifyBSSRSqlSb.append("class_id = "
+                        + baseClassByNameAndIdMap.get(studentInfo.getBjmc())
+                        + ", ");
+            }
+
+            modifyBSSRSqlSb.append( "student_type = '"
+                    + studentTypeByNameAndCodeMap.get(studentInfo.getXslb())
+                    + "', stduy_status = '"
+                    + stduyStatusByNameAndCodeMap.get(studentInfo.getJdfs())
+                    + "' WHERE user_id = "
+                    + credentialNumberAndUserId.get(studentInfo.getSfzh())
+                    + ";\n");
+
+            if(credentialNumberAndUserId.get(studentInfo.getSfzh()) != null){
+                modifyBSSqlSb.append("UPDATE base_student SET student_id = '"
+                        + studentInfo.getXh()
+                        + "' WHERE user_id = "
+                        + credentialNumberAndUserId.get(studentInfo.getSfzh())
+                        + ";\n");
+            }
+        }
+        modifyBSSRSqlSb.append("COMMIT;\n");
+        modifyBSSqlSb.append("COMMIT;\n");
+        //System.err.println(modifyBSFMSqlSb.toString());
+        if (modifyBSFMSqlSb.length() > 0) {
+            char lastChar = modifyBSFMSqlSb.charAt(modifyBSFMSqlSb.length() - 2);
+            if(lastChar == ','){
+                modifyBSFMSqlSb.deleteCharAt(modifyBSFMSqlSb.length() - 2);
+            }
+            //System.out.println("最后一个字符是:" + lastChar);
+            //System.out.println(lastChar == ',');
+        }
+        modifyBSFMSqlSb.append(";\n\n");
+        modifyBSSRSqlSb.append("\n\n");
+        modifyBSSqlSb.append("\n\n");
+
+        String filePath = "C:\\Users\\大数据与最优化研究所\\Desktop\\公司-沈祖山\\output.sql";
+
+        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))){
+            writer.write(modifyBSFMSqlSb.toString());
+            writer.write(modifyBSSRSqlSb.toString());
+            writer.write(modifyBSSqlSb.toString());
+            //System.out.println("StringBuilder content has been written to the file: " + filePath);
+        } catch (IOException e) {
+            //System.err.println("Error writing to the file: " + e.getMessage());
+        }
+    }
+
+    public static Object getProperty(Object object, String propertyName) {
+        try {
+            return object.getClass().getMethod("get" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1)).invoke(object);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}

+ 30 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -2254,4 +2254,34 @@ public class FreeMarkerGeneratorTest {
         apiGeneratorService.generateCodes(params);
         apiGeneratorService.generateCodes(params);
 
 
     }
     }
+
+    /**
+     * 评价项
+     * @throws IOException
+     */
+    @Test
+    public void gcWorkflowOperateRecord() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("xjr_workflow_operate_record");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("workflow");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+
+    }
 }
 }

+ 188 - 0
src/test/java/com/xjrsoft/xjrsoftboot/ScheduleLoginTest.java

@@ -0,0 +1,188 @@
+package com.xjrsoft.xjrsoftboot;
+
+import cn.dev33.satoken.secure.SaSecureUtil;
+import com.google.gson.JsonObject;
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * @author dzx
+ * @date 2024/2/27
+ */
+//@RunWith(SpringRunner.class)
+//@SpringBootTest(classes = XjrSoftApplication.class)
+public class ScheduleLoginTest {
+//    @Autowired
+//    private XjrUserMapper userMapper;
+
+    public static final String ALGORITHM = "HmacSHA256";
+    @Test
+    void test() throws Exception {
+        long timestamp = System.currentTimeMillis();
+        System.out.println("timestamp:" + timestamp);
+        String md5Str = SaSecureUtil.md5("@ak8To$xSHFoT6FoqsqYb3" + timestamp);
+
+
+        String sign = calculateHMac("UUXQ8G4W9IU", md5Str);
+        System.out.println("sign:" + sign);
+
+        String phone = "15334561180";
+
+        String url = "https://live.jianyuekb.com/api/v1/ScheduleFlowV2/OpenApi/auth/user/token";
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("mobileNo", phone);
+
+//        String result = doPost(url, jsonObject.toString(), sign, timestamp);
+//        System.out.println(result);
+    }
+
+    public static String calculateHMac(String key, String data) throws Exception {
+        Mac sha256_HMAC = Mac.getInstance(ALGORITHM);
+
+        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);
+        sha256_HMAC.init(secret_key);
+
+        return byteArrayToHex(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
+    }
+
+    public static String byteArrayToHex(byte[] a) {
+        StringBuilder sb = new StringBuilder(a.length * 2);
+        for (byte b : a)
+            sb.append(String.format("%02x", b));
+        return sb.toString();
+    }
+
+
+    /**
+     * 将加密后的字节数组转换成字符串
+     *
+     * @param b 字节数组
+     * @return 字符串
+     */
+    private static String byteArrayToHexString(byte[] b) {
+        StringBuilder hs = new StringBuilder();
+        String stmp;
+        for (int n = 0; b != null && n < b.length; n++) {
+            stmp = Integer.toHexString(b[n] & 0XFF);
+            if (stmp.length() == 1)
+                hs.append('0');
+            hs.append(stmp);
+        }
+        return hs.toString().toLowerCase();
+    }
+
+    public static String doPost(String httpUrl, String param, String sign, Long timestamp) {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        OutputStreamWriter writer = null;
+        try {
+            URL url = new URL(httpUrl);
+            // 通过远程url连接对象打开连接
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestProperty("schoolId","UUFM5TID45X");
+            connection.setRequestProperty("sign",sign);
+            connection.setRequestProperty("timestamp",String.format("%d",timestamp));
+            // 设置连接请求方式
+            connection.setRequestMethod("POST");
+            // 设置连接主机服务器超时时间:15000毫秒
+            connection.setConnectTimeout(15000);
+            // 设置读取主机服务器返回数据超时时间:60000毫秒
+            connection.setReadTimeout(60000);
+            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
+            connection.setDoOutput(true);
+            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
+            connection.setDoInput(true);
+            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
+            connection.setRequestProperty("Content-Type", "application/json");
+            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
+//            connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
+            writer = new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
+            //body参数放这里
+            writer.write(param);
+            writer.flush();
+
+            writer.close();
+            // 通过连接对象获取一个输出流
+//            os = connection.getOutputStream();
+//            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
+//            os.write(param.getBytes());
+            // 通过连接对象获取一个输入流,向远程读取
+            if (connection.getResponseCode() == 200) {
+                is = connection.getInputStream();
+                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuffer sbf = new StringBuffer();
+                String temp = null;
+                // 循环遍历一行一行读取数据
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            }else{
+                is = connection.getInputStream();
+                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuffer sbf = new StringBuffer();
+                String temp = null;
+                // 循环遍历一行一行读取数据
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                System.out.println(sbf.toString());
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            // 断开与远程地址url的连接
+            connection.disconnect();
+        }
+        return result;
+    }
+
+}

+ 71 - 0
src/test/java/com/xjrsoft/xjrsoftboot/StudentInfo.java

@@ -0,0 +1,71 @@
+package com.xjrsoft.xjrsoftboot;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Comparator;
+import java.util.Objects;
+
+@Data
+public class StudentInfo {
+    //身份证号
+    @ExcelProperty(index = 62)
+    private String sfzh;
+
+    //监护人电话
+    @ExcelProperty(index = 6)
+    private String jhrdh;
+
+    //班级名称
+    @ExcelProperty(index = 30)
+    private String bjmc;
+
+    //班级年级
+    @ExcelProperty(index = 20)
+    private String bjnj;
+
+    //在读专业方向
+    @ExcelProperty(index = 24)
+    private String zdzyfx;
+
+    //在读专业代码
+    @ExcelProperty(index = 25)
+    private String zdzydm;
+
+    //在读专业
+    @ExcelProperty(index = 26)
+    private String zdzy;
+
+    //学籍号
+    @ExcelProperty(index = 15)
+    private String xjh;
+
+    //学生档案编号
+    @ExcelProperty(index = 16)
+    private String xsdabh;
+
+    //学生类别
+    @ExcelProperty(index = 33)
+    private String xslb;
+
+    //就读方式
+    @ExcelProperty(index = 34)
+    private String jdfs;
+
+    //学号
+    @ExcelProperty(index = 54)
+    private String xh;
+
+    //报名缴费状态
+    @ExcelProperty(index = 99)
+    private String bmjfzt;
+
+    //录取专业方向
+    @ExcelProperty(index = 107)
+    private String lqzyfx;
+
+    //报读专业方向
+    @ExcelProperty(index = 111)
+    private String bdzyfx;
+}