Forráskód Böngészése

人力资源模块代码提交

wangqiang 1 éve
szülő
commit
105465d5ef
96 módosított fájl, 17362 hozzáadás és 0 törlés
  1. 10 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/FlowableApiFallbackFactory.java
  2. 34 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/HumanApiFallBackFactory.java
  3. 6 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IFlowableApi.java
  4. 29 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IHumanApi.java
  5. 5 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/factory/UserApiFallbackFactory.java
  6. 7 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/feign/IUserApi.java
  7. 4 0
      jeeplus-common/jeeplus-common-core/src/main/java/com/jeeplus/common/constant/AppNameConstants.java
  8. 19 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableProcessController.java
  9. 39 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java
  10. 67 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java
  11. 147 0
      jeeplus-modules/jeeplus-human/pom.xml
  12. 28 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/JeeplusHumanApplication.java
  13. 103 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/controller/DepartRegistrationController.java
  14. 38 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/domain/DepartRegistration.java
  15. 34 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/mapper/DepartMapper.java
  16. 47 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/mapper/xml/DepartMapper.xml
  17. 137 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/service/DepartService.java
  18. 338 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/controller/EnrollmentRegistrationController.java
  19. 22 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentKeyCard.java
  20. 62 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentRegistration.java
  21. 23 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentRiceCard.java
  22. 36 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentSocialSecurityCard.java
  23. 30 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentWageCard.java
  24. 23 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentKeyCardMapper.java
  25. 37 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentRegistrationMapper.java
  26. 20 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentRiceCardMapper.java
  27. 22 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentSocialSecurityCardMapper.java
  28. 22 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentWageCardMapper.java
  29. 37 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentKeyCardMapper.xml
  30. 77 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentRegistrationMapper.xml
  31. 31 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentRiceCardMapper.xml
  32. 32 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentSocialSecurityCardMapper.xml
  33. 38 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentWageCardMapper.xml
  34. 156 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentKeyCardService.java
  35. 305 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentRegistrationService.java
  36. 102 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentRiceCardService.java
  37. 92 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentSocialSecurityCardService.java
  38. 98 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentWageCardService.java
  39. 61 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/ResponseUtil.java
  40. 140 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/controller/RegistrationWorkLogController.java
  41. 26 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/domain/HolidayVo.java
  42. 63 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/domain/RegistrationWorkLog.java
  43. 28 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/domain/RegistrationWorkLogDetail.java
  44. 31 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/RegistrationWorkLogDetailMapper.java
  45. 41 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/RegistrationWorkLogMapper.java
  46. 26 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/xml/RegistrationWorkLogDetailMapper.xml
  47. 58 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/xml/RegistrationWorkLogMapper.xml
  48. 199 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/service/RegistrationWorkLogService.java
  49. 73 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/service/dto/RegistrationWorkLogDto.java
  50. 188 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/util/HolidayUtil.java
  51. 133 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/controller/RegisterController.java
  52. 59 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/domain/Registration.java
  53. 28 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/domain/RegistrationExperience.java
  54. 22 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/domain/RegistrationFamilyMembers.java
  55. 32 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/FamilyMembersMapper.java
  56. 48 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/InterRegistrationMapper.java
  57. 32 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/RegistrationExperienceMapper.java
  58. 29 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/xml/FamilyMembersMapper.xml
  59. 123 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/xml/InterRegistrationMapper.xml
  60. 29 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/xml/RegistrationExperienceMapper.xml
  61. 292 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/service/RegistrationService.java
  62. 60 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/service/dto/RegistrationDto.java
  63. 94 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/controller/ReimburseRegisterController.java
  64. 96 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/controller/ReimburseSubmitAccountController.java
  65. 67 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseRegister.java
  66. 29 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseRegisterDetail.java
  67. 52 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseSubmitAccount.java
  68. 29 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseSubmitAccountDetail.java
  69. 26 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseRegisterDetailMapper.java
  70. 29 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseRegisterMapper.java
  71. 24 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseSubmitAccountDetailMapper.java
  72. 36 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseSubmitAccountMapper.java
  73. 32 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseRegisterDetailMapper.xml
  74. 51 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseRegisterMapper.xml
  75. 35 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseSubmitAccountDetailMapper.xml
  76. 72 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseSubmitAccountMapper.xml
  77. 210 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/service/ReimburseRegisterService.java
  78. 304 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/service/ReimburseSubmitAccountService.java
  79. 102 0
      jeeplus-modules/jeeplus-human/src/main/resources/bootstrap.yml
  80. 631 0
      jeeplus-modules/jeeplus-human/src/main/resources/freemarker/auditRecordFormAfterBinding.ftl
  81. 1978 0
      jeeplus-modules/jeeplus-human/src/main/resources/freemarker/firstAudit.ftl
  82. 807 0
      jeeplus-modules/jeeplus-human/src/main/resources/freemarker/proofreadAudit.ftl
  83. 4317 0
      jeeplus-modules/jeeplus-human/src/main/resources/freemarker/reportAusstellung.ftl
  84. 1978 0
      jeeplus-modules/jeeplus-human/src/main/resources/freemarker/secondAuditFtl.ftl
  85. 1978 0
      jeeplus-modules/jeeplus-human/src/main/resources/freemarker/thirdlyAudit.ftl
  86. 13 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/AreaController.java
  87. 7 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/feign/UserApiImpl.java
  88. 3 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/AreaMapper.java
  89. 7 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/AreaMapper.xml
  90. 7 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/AreaService.java
  91. 49 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/RegistrationInfo.java
  92. 14 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/HumanFeignApi.java
  93. 14 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/TenantFeignApi.java
  94. 92 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java
  95. 1 0
      jeeplus-modules/pom.xml
  96. BIN
      门禁卡开通注意事项.doc

+ 10 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/FlowableApiFallbackFactory.java

@@ -37,6 +37,16 @@ public class FlowableApiFallbackFactory implements FallbackFactory <IFlowableApi
             }
 
             @Override
+            public Map getByNameForFen(String name) {
+                return null;
+            }
+
+            @Override
+            public String startForFen(Map<String, String> map) {
+                return null;
+            }
+
+            @Override
             public void insertMyNotice(Map<String, String> map) {
 
             }

+ 34 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/HumanApiFallBackFactory.java

@@ -0,0 +1,34 @@
+package com.jeeplus.flowable.factory;
+
+import com.jeeplus.flowable.feign.IHumanApi;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-21 9:22
+ */
+@Slf4j
+@Component
+public class HumanApiFallBackFactory implements FallbackFactory<IHumanApi> {
+
+    @Override
+    public IHumanApi create(Throwable cause) {
+        log.error ( "财务服务调用失败:{}", cause.getMessage ( ) );
+        return new IHumanApi() {
+
+
+            @Override
+            public String getTimeOutRegisters() {
+                return null;
+            }
+
+            @Override
+            public String getTimeOutReimburseRegisters() {
+                return null;
+            }
+        };
+    }
+}

+ 6 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IFlowableApi.java

@@ -23,6 +23,12 @@ public interface IFlowableApi {
     @RequestMapping(value = "/flowable/task/historicTaskList2", method = RequestMethod.POST)
     Map historicTaskList2(@RequestParam(value = "procInsId")String procInsId);
 
+    @RequestMapping(value = "/flowable/process/getByNameForFen", method = RequestMethod.POST)
+    Map getByNameForFen(@RequestParam(value = "name")String name);
+
+    @RequestMapping(value = "/flowable/task/startForFen", method = RequestMethod.POST)
+    String startForFen(@RequestBody Map<String ,String > map);
+
     /**
      * 根据通知信息查询数据
      * @param map

+ 29 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IHumanApi.java

@@ -0,0 +1,29 @@
+package com.jeeplus.flowable.feign;
+
+import com.jeeplus.common.constant.AppNameConstants;
+import com.jeeplus.flowable.factory.HumanApiFallBackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-21 9:20
+ */
+@FeignClient(contextId = "humanApi", name = AppNameConstants.APP_HUMAN_MODULES, fallbackFactory = HumanApiFallBackFactory.class)
+public interface IHumanApi {
+
+    /**
+     * 查询3天未发送日志状态为实习中的人员信息
+     * @return
+     */
+    @GetMapping(value = "/register/getTimeOutRegisters")
+    String getTimeOutRegisters();
+
+    /**
+     * 获取最后一次发起报销且实习状态为结束,并且报销状态为完成的
+     * @return
+     */
+    @GetMapping(value = "/register/getTimeOutReimburseRegisters")
+    String getTimeOutReimburseRegisters();
+}

+ 5 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/factory/UserApiFallbackFactory.java

@@ -49,6 +49,11 @@ public class UserApiFallbackFactory implements FallbackFactory <IUserApi> {
             }
 
             @Override
+            public void deleteById(String id) {
+
+            }
+
+            @Override
             public Set <String> getPermissions(String loginName) {
                 return new HashSet <> ( );
             }

+ 7 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/feign/IUserApi.java

@@ -59,6 +59,13 @@ public interface IUserApi {
     void updateUser(@RequestBody UserDTO userDTO);
 
     /**
+     * 根据id删除用户
+     * @param id
+     */
+    @PostMapping(value = BASE_URL + "/deleteById")
+    void deleteById(@RequestParam("id") String id);
+
+    /**
      * 获取用户访问权限
      *
      * @param loginName

+ 4 - 0
jeeplus-common/jeeplus-common-core/src/main/java/com/jeeplus/common/constant/AppNameConstants.java

@@ -25,4 +25,8 @@ public interface AppNameConstants {
      * 评估模块
      */
     String APP_ASSESS_MODULES = "jeeplus-assess";
+    /**
+     * 评估模块
+     */
+    String APP_HUMAN_MODULES = "jeeplus-human";
 }

+ 19 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableProcessController.java

@@ -265,6 +265,25 @@ public class FlowableProcessController {
     }
 
     /**
+     * 获取流程定义列表
+     */
+    @PostMapping("getByNameForFen")
+    public Map getByNameForFen( Page<Map> page,String name) {
+        /*
+         * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
+         */
+        page = flowProcessService.processList(page, "");
+        List<Map> records = page.getRecords();
+        Map resultMap = new HashMap();
+        for (Map map : records) {
+            if(name.equals(map.get("name"))){
+                resultMap = map;
+            }
+        }
+        return resultMap;
+    }
+
+    /**
      * 流程定义列表
      */
     @GetMapping("getById")

+ 39 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java

@@ -4,6 +4,7 @@
 package com.jeeplus.flowable.controller;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -187,6 +188,43 @@ public class FlowableTaskController {
     }
 
     /**
+     * 启动流程
+     */
+    @PostMapping("startForFen")
+    public String startForFen(@RequestBody Map<String ,String > map) {
+
+        String procDefKey = map.get("procDefKey");
+        String procDefId = map.get("procDefId");
+        String businessTable = map.get("businessTable");
+        String businessId = map.get("businessId");
+        String title = map.get("title");
+        String recordType = map.get("recordType");
+        String assignee = map.get("assignee");
+
+        if ( StrUtil.isBlank ( procDefKey ) && StrUtil.isNotBlank ( procDefId ) ) {
+            procDefKey = StrUtil.split ( procDefId, ":" ).get ( 0 );
+        }
+
+        String procInsId = flowTaskService.startProcessForFen ( procDefKey, businessTable, businessId, title,recordType, procDefId );
+
+        //指定下一步处理人
+        if ( StringUtils.isNotBlank ( assignee ) ) {
+            Task task = taskService.createTaskQuery ( ).processInstanceId ( procInsId ).active ( ).singleResult ( );
+            if(task != null){
+                String[] split = assignee.split(",");
+                if (split.length == 1) {
+                    taskService.setAssignee(task.getId(), assignee);
+                } else {
+                    for (String i : split) {
+                        taskService.addCandidateUser(task.getId(),i);
+                    }
+                }
+            }
+        }
+        return procInsId ;
+    }
+
+    /**
      * 签收任务
      */
     @PostMapping("claim")
@@ -641,4 +679,5 @@ public class FlowableTaskController {
         MyNoticeList noticeList = noticeServicel.getRepetitionCountBymyNoticeTitle(jsonObject);
         return JSON.toJSONString(noticeList);
     }
+
 }

+ 67 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -627,6 +627,73 @@ public class FlowTaskService {
      * @param businessTable 业务表表名
      * @param businessId    业务表编号
      * @param title         流程标题,显示在待办任务标题
+     * @param recordType    项目类型
+     * @return 流程实例ID
+     */
+    public String startProcessForFen(String procDefKey, String businessTable, String businessId, String title,String recordType, String procDefId) {
+        Map <String, Object> vars = Maps.newHashMap ( );
+        return startProcessForFen ( procDefKey, businessTable, businessId, title,  vars ,recordType, procDefId);
+    }
+
+    /**
+     * 启动流程
+     *
+     * @param procDefKey    流程定义KEY
+     * @param businessTable 业务表表名
+     * @param businessId    业务表编号
+     * @param title         流程标题,显示在待办任务标题
+     * @param vars          流程变量
+     * @return 流程实例ID
+     */
+    @SuppressWarnings("unused")
+    public String startProcessForFen(String procDefKey, String businessTable, String businessId, String title, Map <String, Object> vars,String recordType,  String procDefId) {
+        //String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId())
+        // 设置流程变量
+        if ( vars == null ) {
+            vars = Maps.newHashMap ( );
+        }
+
+        String userId = (String) vars.get ( FlowableConstant.INITIATOR );
+        if ( userId == null ) {
+            userId = "1";
+        }
+        String userName = userApi.getById ( userId ).getName ( );
+        vars.put ( FlowableConstant.USERNAME, userName );
+
+        // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+        identityService.setAuthenticatedUserId ( userId );
+
+        // 设置流程标题
+        if ( StrUtil.isNotBlank ( title ) ) {
+            vars.put ( FlowableConstant.TITLE, title );
+        }
+        //设置项目类型
+        if (StrUtil.isNotBlank(recordType)){
+            vars.put(FlowableConstant.RECORDTYPE,recordType);
+        }
+
+
+        // 启动流程
+        ProcessInstance procIns = runtimeService.startProcessInstanceByKeyAndTenantId ( procDefKey, businessTable + ":" + businessId, vars, /*tenantApi.getCurrentTenantId ( )*/ flowMapper.getTenantIdByProcDefKey(procDefKey) );
+
+        // 更新业务表流程实例ID
+        Flow act = new Flow ( );
+        act.setBusinessTable ( businessTable );// 业务表名
+        act.setBusinessId ( businessId );  // 业务表ID
+        act.setProcInsId ( procIns.getId ( ) );
+        act.setProcDefId(procDefId);
+        act.setVars ( vars );
+        flowMapper.updateProcInsIdByBusinessId ( act );
+        return act.getProcInsId ( );
+    }
+
+    /**
+     * 启动流程
+     *
+     * @param procDefKey    流程定义KEY
+     * @param businessTable 业务表表名
+     * @param businessId    业务表编号
+     * @param title         流程标题,显示在待办任务标题
      * @param vars          流程变量
      * @return 流程实例ID
      */

+ 147 - 0
jeeplus-modules/jeeplus-human/pom.xml

@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jeeplus-modules</artifactId>
+        <groupId>org.jeeplus</groupId>
+        <version>9.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jeeplus-human</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+        <!-- poi office -->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.3.0</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.jeeplus</groupId>-->
+        <!--            <artifactId>jeeplus-flowable</artifactId>-->
+        <!--            <version>${project.parent.version}</version>-->
+        <!--        </dependency>-->
+
+        <dependency>
+            <groupId>org.jeeplus</groupId>
+            <artifactId>jeeplus-public-modules</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jeeplus</groupId>
+            <artifactId>jeeplus-common-mybatis-plus</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Sentinel -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <!--添加actuator依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <!--spring boot admin依赖-->
+        <dependency>
+            <groupId>de.codecentric</groupId>
+            <artifactId>spring-boot-admin-starter-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jeeplus</groupId>
+            <artifactId>jeeplus-common-core</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jeeplus</groupId>
+            <artifactId>jeeplus-common-security</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <!--        <dependency>-->
+        <!--            <groupId>org.jeeplus</groupId>-->
+        <!--            <artifactId>jeeplus-system</artifactId>-->
+        <!--            <version>${project.parent.version}</version>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.jeeplus</groupId>-->
+        <!--            <artifactId>jeeplus-system-api</artifactId>-->
+        <!--            <version>${project.parent.version}</version>-->
+        <!--        </dependency>-->
+        <dependency>
+            <groupId>org.jeeplus</groupId>
+            <artifactId>jeeplus-common-log</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jeeplus</groupId>
+            <artifactId>jeeplus-common-swagger</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.2.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+</project>

+ 28 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/JeeplusHumanApplication.java

@@ -0,0 +1,28 @@
+package com.jeeplus.human;
+
+import com.jeeplus.core.annotation.JeeplusCloudApplication;
+import org.springframework.boot.SpringApplication;
+
+/**
+ * 测试模块
+ *
+ * @author jeeplus
+ */
+
+
+@JeeplusCloudApplication
+public class JeeplusHumanApplication {
+    public static void main(String[] args) {
+        SpringApplication.run ( JeeplusHumanApplication.class, args );
+        System.out.println ( " O(∩_∩)O~ 人力资源模块启动成功 ^_^゙  \n" + "    _                         _                   _                  _   \n" +
+                "   (_)                       | |                 | |                | |  \n" +
+                "    _    ___    ___   _ __   | |  _   _   ___    | |_    ___   ___  | |_ \n" +
+                "   | |  / _ \\  / _ \\ | '_ \\  | | | | | | / __|   | __|  / _ \\ / __| | __|\n" +
+                "   | | |  __/ |  __/ | |_) | | | | |_| | \\__ \\   | |_  |  __/ \\__ \\ | |_ \n" +
+                "   | |  \\___|  \\___| | .__/  |_|  \\__,_| |___/    \\__|  \\___| |___/  \\__|\n" +
+                "  _/ |               | |                                                 \n" +
+                " |__/                |_|                                                 " );
+    }
+
+
+}

+ 103 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/controller/DepartRegistrationController.java

@@ -0,0 +1,103 @@
+package com.jeeplus.human.depart.registration.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.human.depart.registration.domain.DepartRegistration;
+import com.jeeplus.human.depart.registration.service.DepartService;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-25 9:53
+ */
+@RestController
+@Api("离职申请信息")
+@RequestMapping(value = "/departRegistration")
+public class DepartRegistrationController {
+
+    @Resource
+    private DepartService departService;
+
+    /**
+     * 查询财务项目信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询离职申请信息列表")
+    @GetMapping("list")
+    public ResponseEntity<IPage<DepartRegistration>> data(DepartRegistration projectReportData, Page<DepartRegistration> page) throws Exception {
+        IPage<DepartRegistration> result = new Page<DepartRegistration>();
+        result = departService.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 保存离职申请信息
+     * @param departRegistration
+     * @return
+     */
+    @ApiLog(value = "保存离职申请信息", type = LogTypeEnum.SAVE)
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody DepartRegistration departRegistration) throws Exception {
+        DepartRegistration s = departService.saveRegistration(departRegistration);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_depart_registration")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<DepartRegistration> findById(@RequestParam String id) throws Exception{
+        DepartRegistration dto = departService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id修改状态status
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "updateStatusById")
+    public void updateStatusById(@RequestBody DepartRegistration dto) {
+        departService.updateStatusById(dto);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = departService.remove(id);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 查询是否有已完成的流程数据
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "查询是否有已完成的流程数据")
+    @GetMapping("/selectComplete")
+    public ResponseEntity<Boolean> selectComplete(){
+        Boolean s = departService.selectComplete();
+        return ResponseEntity.ok(s);
+    }
+}

+ 38 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/domain/DepartRegistration.java

@@ -0,0 +1,38 @@
+package com.jeeplus.human.depart.registration.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 离职申请
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-25 9:41
+ */
+@Data
+@TableName("human_resources_depart_registration")
+public class DepartRegistration extends BaseEntity {
+
+    private String name;
+    private String projectManager;
+    private String remarks;                 //备注
+    private String department;              //所属部门
+    private String arrivalDate;             //到岗日期
+    private String departResignationDate;   //预定离职日期
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+
+    @TableField(exist = false)
+    private String taskId;
+
+    @TableField(exist = false)
+    private List<String> auditUserIds;
+
+    @TableField(exist = false)
+    private String departmentName;
+}

+ 34 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/mapper/DepartMapper.java

@@ -0,0 +1,34 @@
+package com.jeeplus.human.depart.registration.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.human.depart.registration.domain.DepartRegistration;
+import com.jeeplus.human.practice.register.domain.Registration;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-25 9:49
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface DepartMapper extends BaseMapper<DepartRegistration> {
+
+    /**
+     * 查询离职申请表
+     * @param page
+     * @param queryWrapper
+     * @return
+     */
+    IPage<DepartRegistration> findList(Page<DepartRegistration> page, @Param(Constants.WRAPPER) QueryWrapper<DepartRegistration> queryWrapper);
+
+    DepartRegistration getById(@Param("id") String id);
+
+    void updateStatusById(@Param("id") String id, @Param("type") String type);
+}

+ 47 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/mapper/xml/DepartMapper.xml

@@ -0,0 +1,47 @@
+<?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.jeeplus.human.depart.registration.mapper.DepartMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.name,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.project_manager,
+        a.remarks,
+        a.department,
+        a.arrival_date,
+        a.depart_resignation_date
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_depart_registration SET type = #{type}
+		WHERE id = #{id}
+    </update>
+
+    <select id="findList" resultType="com.jeeplus.human.depart.registration.domain.DepartRegistration">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id,
+        su.name as projectManagerName,
+        so.name as departmentName
+        from human_resources_depart_registration a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        left join sys_user su on a.project_manager = su.id
+        LEFT JOIN sys_office so on a.department = so.id
+        ${ew.customSqlSegment}
+        ORDER BY a.create_time DESC
+    </select>
+    <select id="getById" resultType="com.jeeplus.human.depart.registration.domain.DepartRegistration">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_depart_registration a
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+
+</mapper>

+ 137 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/service/DepartService.java

@@ -0,0 +1,137 @@
+package com.jeeplus.human.depart.registration.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.depart.registration.domain.DepartRegistration;
+import com.jeeplus.human.depart.registration.mapper.DepartMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-25 9:50
+ */
+@Service
+@Transactional
+public class DepartService extends ServiceImpl<DepartMapper, DepartRegistration> {
+
+    @Resource
+    private DepartMapper mapper;
+
+    @Resource
+    private IFlowableApi flowTaskService;
+
+    /**
+     * 离职申请信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<DepartRegistration> findList(Page<DepartRegistration> page, DepartRegistration projectReportData) throws Exception{
+        QueryWrapper<DepartRegistration> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,DepartRegistration.class);
+        queryWrapper.eq("a.del_flag","0");
+        IPage<DepartRegistration> list = mapper.findList(page, queryWrapper);
+        list.getRecords().forEach(item -> {
+            // 入库 修改申请
+            if (com.jeeplus.utils.StringUtils.isNotBlank(item.getTaskId()) && com.jeeplus.utils.StringUtils.isNotBlank(item.getType())) {
+                if ("2".equals(item.getType())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditUserIds(flowTaskService.getTaskAuditUsers(item.getTaskId()));  // 获取数据审核人
+                }
+            }
+        });
+        return list;
+
+    }
+
+    public DepartRegistration saveRegistration(DepartRegistration registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            DepartRegistration report = mapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public DepartRegistration update(DepartRegistration reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        DepartRegistration report = new DepartRegistration();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+        mapper.updateById(report);
+
+        return report;
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public DepartRegistration add(DepartRegistration reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        DepartRegistration report = new DepartRegistration();
+        BeanUtils.copyProperties(reportData, report);
+        report.setCreateById(userDTO.getId());
+        report.setCreateTime(new Date());
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        mapper.insert(report);
+
+        return report;
+    }
+
+    public DepartRegistration findById(String id) {
+        // 查询基础信息表
+        DepartRegistration info = mapper.getById(id);
+        return info;
+    }
+
+    public void updateStatusById(DepartRegistration dto) {
+        mapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public String remove(String id) {
+        mapper.deleteById(id);
+        return "操作成功";
+    }
+
+    public Boolean selectComplete() {
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        QueryWrapper<DepartRegistration> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("create_by_id",userDTO.getId());
+        queryWrapper.eq("type","5");
+        Integer integer = mapper.selectCount(queryWrapper);
+        if (integer == 0) {
+            return false;
+        }else {
+            return true;
+        }
+    }
+}

+ 338 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/controller/EnrollmentRegistrationController.java

@@ -0,0 +1,338 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.controller;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.*;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.*;
+import com.jeeplus.human.practice.register.service.dto.RegistrationDto;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:14
+ */
+@RestController
+@Api("实习人员登记表信息")
+@RequestMapping(value = "/enrollmentRegistration")
+public class EnrollmentRegistrationController {
+
+    @Resource
+    private EnrollmentRegistrationService service;
+
+    @Resource
+    private EnrollmentWageCardService wageCardService;
+
+    @Resource
+    private EnrollmentSocialSecurityCardService securityCardService;
+
+    @Resource
+    private EnrollmentKeyCardService keyCardService;
+
+    @Resource
+    private EnrollmentRiceCardService riceCardService;
+
+    /**
+     * 下载门禁卡开通注意事项
+     * 下载门禁卡开通注意事项
+     * @param response
+     */
+    @RequestMapping(value="downloadFile")
+    @ResponseBody
+    public void downloadFile(HttpServletResponse response)  {
+
+
+        //模板对象
+        Template template=null;
+        //下载文件地址
+        String filePath = null;
+        if(System.getProperty("os.name").toLowerCase().contains("win")){
+            filePath = this.getClass().getResource("/").getPath()+"/freemarker";
+        }else{
+            filePath = "/mnt/project/cloud/freemarker";
+        }
+        //freemaker模板路径
+        File path = new File(filePath);
+
+        Configuration cfg = new Configuration();
+        try {
+            cfg.setDirectoryForTemplateLoading(path);
+            //选择对应的ftl文件
+            template = cfg.getTemplate("firstAudit.ftl","UTF-8");
+
+            File docFile = new File("门禁卡开通注意事项.doc");
+            com.jeeplus.human.enrollment.enrollmentRegistration.utils.ResponseUtil.docResponse("门禁卡开通注意事项.doc",docFile,response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                //获取tomcat的路径
+                String tomcatFilePath=System.getProperty("catalina.home");
+                //删除tomcat目录下的处理后的文件信息
+                File tomcatFile = new File(tomcatFilePath+"/bin/"+"门禁卡开通注意事项.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }else{
+                //删除目录下的处理后的文件信息
+                File tomcatFile = new File("/mnt/project/cloud/"+"门禁卡开通注意事项.doc");
+                if (tomcatFile.isFile()) {
+                    tomcatFile.delete();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 查询入职人员登记信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询入职人员登记信息列表")
+    @GetMapping("list")
+    public ResponseEntity<IPage<EnrollmentRegistration>> data(EnrollmentRegistration projectReportData, Page<EnrollmentRegistration> page) throws Exception {
+        IPage<EnrollmentRegistration> result = new Page<EnrollmentRegistration>();
+        result = service.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 保存入职人员登记信息
+     * @param registration
+     * @return
+     */
+    @ApiLog(value = "保存入职人员登记信息", type = LogTypeEnum.SAVE)
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody EnrollmentRegistration registration) throws Exception {
+        EnrollmentRegistration s = service.saveRegistration(registration);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_enrollment_registration")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 保存工资卡信息
+     * @param wageCard
+     * @return
+     */
+    @ApiLog(value = "保存工资卡信息", type = LogTypeEnum.SAVE)
+    @PostMapping("saveWageCard")
+    public ResponseEntity saveWageCard(@Valid @RequestBody EnrollmentWageCard wageCard) throws Exception {
+        EnrollmentWageCard s = wageCardService.saveWageCard(wageCard);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_enrollment_wage_card")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 保存社保信息
+     * @param securityCard
+     * @return
+     */
+    @ApiLog(value = "保存社保信息", type = LogTypeEnum.SAVE)
+    @PostMapping("saveSocialCard")
+    public ResponseEntity saveSocialCard(@Valid @RequestBody EnrollmentSocialSecurityCard securityCard) throws Exception {
+        EnrollmentSocialSecurityCard s = securityCardService.saveSecurityCard(securityCard);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_enrollment_social_security_card")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 保存门卡信息
+     * @param securityCard
+     * @return
+     */
+    @ApiLog(value = "保存门卡信息", type = LogTypeEnum.SAVE)
+    @PostMapping("saveKeyCard")
+    public ResponseEntity saveKeyCard(@Valid @RequestBody EnrollmentKeyCard securityCard) throws Exception {
+        EnrollmentKeyCard s = keyCardService.saveSecurityCard(securityCard);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_enrollment_key_card")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 保存餐补卡号息
+     * @param riceCard
+     * @return
+     */
+    @ApiLog(value = "保存餐补卡号息", type = LogTypeEnum.SAVE)
+    @PostMapping("saveRiceCard")
+    public ResponseEntity saveRiceCard(@Valid @RequestBody EnrollmentRiceCard riceCard) throws Exception {
+        EnrollmentRiceCard s = riceCardService.saveSecurityCard(riceCard);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_enrollment_rice_card")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<EnrollmentRegistration> findById(@RequestParam String id) throws Exception{
+        EnrollmentRegistration dto = service.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据人员登记id查询工资卡信息
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据人员登记id查询工资卡信息")
+    @GetMapping("/findWageCardById")
+    public ResponseEntity<EnrollmentWageCard> findWageCardById(@RequestParam String id) throws Exception{
+        EnrollmentWageCard dto = wageCardService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据人员登记id查询社保信息
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据人员登记id查询社保信息")
+    @GetMapping("/findSocialCardById")
+    public ResponseEntity<EnrollmentSocialSecurityCard> findSocialCardById(@RequestParam String id) throws Exception{
+        EnrollmentSocialSecurityCard dto = securityCardService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据人员登记id查询门卡信息
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据人员登记id查询门卡信息")
+    @GetMapping("/findKeyCardById")
+    public ResponseEntity<EnrollmentKeyCard> findKeyCardById(@RequestParam String id) throws Exception{
+        EnrollmentKeyCard dto = keyCardService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据人员登记id查询餐补卡号信息
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据人员登记id查询餐补卡号信息")
+    @GetMapping("/findRiceCardById")
+    public ResponseEntity<EnrollmentRiceCard> findRiceCardById(@RequestParam String id) throws Exception{
+        EnrollmentRiceCard dto = riceCardService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据人员登记id修改状态工资卡信息流程的status
+     */
+    @ApiOperation(value = "根据人员登记id修改状态工资卡信息流程的status")
+    @PostMapping(value = "updateWageCardStatusById")
+    public void updateWageCardStatusById(@RequestBody EnrollmentWageCard dto) {
+        wageCardService.updateStatusById(dto);
+    }
+
+    /**
+     * 根据人员登记id修改状态社保信息流程的status
+     */
+    @ApiOperation(value = "根据人员登记id修改状态社保信息流程的status")
+    @PostMapping(value = "updateSocialCardStatusById")
+    public void updateSocialCardStatusById(@RequestBody EnrollmentSocialSecurityCard dto) {
+        securityCardService.updateStatusById(dto);
+    }
+
+    /**
+     * 根据人员登记id修改状态社保信息流程的status
+     */
+    @ApiOperation(value = "根据人员登记id修改状态门卡流程的status")
+    @PostMapping(value = "updateKeyCardStatusById")
+    public void updateKeyCardStatusById(@RequestBody EnrollmentKeyCard dto) {
+        keyCardService.updateStatusById(dto);
+    }
+
+    /**
+     * 根据人员登记id修改状态餐补卡号信息流程的status
+     */
+    @ApiOperation(value = "根据人员登记id修改状态餐补卡号信息流程的status")
+    @PostMapping(value = "updateRiceCardStatusById")
+    public void updateRiceCardStatusById(@RequestBody EnrollmentRiceCard dto) {
+        riceCardService.updateStatusById(dto);
+    }
+
+    /**
+     * 根据id修改状态status
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "updateStatusById")
+    public void updateStatusById(@RequestBody EnrollmentRegistration dto) {
+        service.updateStatusById(dto);
+    }
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = service.remove(id);
+        //根据入职人员id删除对应的工资卡信息
+        wageCardService.deleteByRegistrationId(id);
+        //根据入职人员id删除对应的社保信息
+        securityCardService.deleteByRegistrationId(id);
+        //删除门卡信息
+        keyCardService.deleteByRegistrationId(id);
+        //删除餐补卡号信息
+        riceCardService.deleteByRegistrationId(id);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 查询
+     * @param idCard
+     * @return
+     */
+    @ApiOperation(value = "查询身份证号码唯一性")
+    @GetMapping("/findIdCardOnly")
+    public ResponseEntity<Integer> findIdCardOnly(@RequestParam String idCard) throws Exception{
+        Integer idCardOnly = service.findIdCardOnly(idCard);
+        return ResponseEntity.ok(idCardOnly);
+    }
+
+    /**
+     * 查询
+     * @param mobilePhone
+     * @return
+     */
+    @ApiOperation(value = "联系电话唯一性")
+    @GetMapping("/findMobilePhoneOnly")
+    public ResponseEntity<Integer> findMobilePhoneOnly(@RequestParam String mobilePhone) throws Exception{
+        Integer idCardOnly = service.findMobilePhoneOnly(mobilePhone);
+        return ResponseEntity.ok(idCardOnly);
+    }
+}

+ 22 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentKeyCard.java

@@ -0,0 +1,22 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 入职人员登记
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:14
+ */
+@Data
+@TableName("human_resources_enrollment_key_card")
+public class EnrollmentKeyCard extends BaseEntity {
+    private String remarks;             //备注
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String enrollmentRegistrationId;   //员工入职表id
+
+}

+ 62 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentRegistration.java

@@ -0,0 +1,62 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 入职人员登记
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:14
+ */
+@Data
+@TableName("human_resources_enrollment_registration")
+public class EnrollmentRegistration extends BaseEntity {
+    private String name;                //姓名
+    private String sex;                 //性别
+    private String age;                 //年龄
+    private String birthday;            //出生日期
+    private String politicalOutlook;    //政治面貌
+    private String nativePlace;         //籍贯
+    private String nation;              //民族
+    private String maritalStatus;       //婚姻状况
+    private String mobilePhone;         //联系电话
+    private String idCard;              //身份证号码
+    private String homeAddress;         //家庭住址
+    private String permanentAddress;    //常住地址
+    private String graduatedFrom;       //毕业院校
+    private String speciality;          //专业
+    private String startTime;           //开始时间
+    private String endTime;             //毕业时间
+    private String education;           //学历
+    private String educationNature;     //学历性质
+    private String graduatedOrNot;      //是否毕业
+    private String englishLevel;        //英语等级
+    private String ncre;                //计算机等级
+    private String department;          //所属部门
+    private String entryDate;           //进所日期
+    private String contractStartDate;   //合同开始日期
+    private String remarks;             //备注
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String userId;              //用户id
+    private String projectManager;      //项目经理
+
+    @TableField(exist = false)
+    private String socialSecurityNumber;        //社保编号
+    @TableField(exist = false)
+    private String socialSecurityBankNumber;    //社保银行卡号
+    @TableField(exist = false)
+    private String socialSecurityPictureFront;       //社保卡照片正面
+    @TableField(exist = false)
+    private String socialSecurityPictureFrontUrl;       //社保卡照片正面URL
+    @TableField(exist = false)
+    private String socialSecurityPictureOpposite;       //社保卡照片反面
+    @TableField(exist = false)
+    private String socialSecurityPictureOppositeUrl;       //社保卡照片反面URL
+    private String onJobStatus;       //在职状态
+
+}

+ 23 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentRiceCard.java

@@ -0,0 +1,23 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 入职人员餐补卡号信息
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:14
+ */
+@Data
+@TableName("human_resources_enrollment_rice_card")
+public class EnrollmentRiceCard extends BaseEntity {
+    private String remarks;             //备注
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String enrollmentRegistrationId;   //员工入职表id
+    private String riceNumber;          //餐补卡号
+
+}

+ 36 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentSocialSecurityCard.java

@@ -0,0 +1,36 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 社保卡信息
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:14
+ */
+@Data
+@TableName("human_resources_enrollment_social_security_card")
+public class EnrollmentSocialSecurityCard extends BaseEntity {
+    private String remarks;             //备注
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String enrollmentRegistrationId;   //员工入职表id
+    private String socialSecurityNumber;        //社保编号
+    private String socialSecurityBankNumber;    //社保银行卡号
+    private String socialSecurityPictureFront;       //社保卡照片正面
+    private String socialSecurityPictureOpposite;       //社保卡照片反面
+
+
+
+
+
+
+
+
+
+
+
+}

+ 30 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentWageCard.java

@@ -0,0 +1,30 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 入职人员登记
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:14
+ */
+@Data
+@TableName("human_resources_enrollment_wage_card")
+public class EnrollmentWageCard extends BaseEntity {
+    private String remarks;             //备注
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String enrollmentRegistrationId;   //员工入职表id
+    private String zxBankCardNumber;   //中信银行卡号
+    private String gsBankCardNumber;   //工商银行卡号
+    private String zxAccountHolder;   //中信银行卡开户行
+    private String gsAccountHolder;   //工商银行卡开户行
+    private String accountHolderFront;   //银行卡正面
+    private String accountHolderOpposite;   //银行卡反面
+    private String gsAccountHolderFront;   //工商银行银行卡正面
+    private String gsAccountHolderOpposite;   //工商银行银行卡反面
+
+}

+ 23 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentKeyCardMapper.java

@@ -0,0 +1,23 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-17 8:55
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface EnrollmentKeyCardMapper extends BaseMapper<EnrollmentKeyCard> {
+
+    EnrollmentKeyCard getById(@Param("id") String id);
+
+    void updateStatusById(@Param("registrationId") String registrationId, @Param("type") String type);
+
+    String getNoticeUserId(String id);
+}

+ 37 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentRegistrationMapper.java

@@ -0,0 +1,37 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration;
+import com.jeeplus.human.practice.register.domain.Registration;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:26
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface EnrollmentRegistrationMapper extends BaseMapper<EnrollmentRegistration> {
+
+    /**
+     * 查询入职人员登记表
+     * @param page
+     * @param queryWrapper
+     * @return
+     */
+    IPage<EnrollmentRegistration> findList(Page<EnrollmentRegistration> page, @Param(Constants.WRAPPER) QueryWrapper<EnrollmentRegistration> queryWrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    EnrollmentRegistration getById(@Param("id") String id);
+
+    void updateStatusById(@Param("id") String id, @Param("type") String type);
+
+    void removeById(@Param("id") String id);
+}

+ 20 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentRiceCardMapper.java

@@ -0,0 +1,20 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRiceCard;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-20 16:35
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface EnrollmentRiceCardMapper extends BaseMapper<EnrollmentRiceCard> {
+
+    EnrollmentRiceCard getById(String id);
+
+    void updateStatusById(String id, String type);
+}

+ 22 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentSocialSecurityCardMapper.java

@@ -0,0 +1,22 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentSocialSecurityCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-13 9:41
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface EnrollmentSocialSecurityCardMapper extends BaseMapper<EnrollmentSocialSecurityCard> {
+
+    EnrollmentSocialSecurityCard getById(@Param("id") String id);
+
+    void updateStatusById(@Param("registrationId") String registrationId, @Param("type") String type);
+}

+ 22 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentWageCardMapper.java

@@ -0,0 +1,22 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-11 15:09
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface EnrollmentWageCardMapper extends BaseMapper<EnrollmentWageCard> {
+
+    EnrollmentWageCard getById(@Param("id") String id);
+
+    void updateStatusById(@Param("registrationId") String registrationId, @Param("type") String type);
+}

+ 37 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentKeyCardMapper.xml

@@ -0,0 +1,37 @@
+<?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.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentKeyCardMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.enrollment_registration_id,
+        a.remarks
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_enrollment_key_card SET type = #{type}
+		WHERE id = #{registrationId}
+    </update>
+
+    <select id="getById"
+            resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_enrollment_key_card a
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+    <select id="getNoticeUserId" resultType="java.lang.String">
+        select user_id from human_resources_enrollment_registration
+        where
+        id = (select enrollment_registration_id from human_resources_enrollment_key_card
+                where id = #{id} and del_flag = '0')
+        and del_flag = '0'
+    </select>
+</mapper>

+ 77 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentRegistrationMapper.xml

@@ -0,0 +1,77 @@
+<?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.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentRegistrationMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.name,
+        a.sex,
+        a.age,
+        a.birthday,
+        a.political_outlook,
+        a.native_place,
+        a.nation,
+        a.marital_status,
+        a.mobile_phone,
+        a.id_card,
+        a.home_address,
+        a.permanent_address,
+        a.graduated_from,
+        a.speciality,
+        a.start_time,
+        a.end_time,
+        a.education,
+        a.education_nature,
+        a.graduated_or_not,
+        a.english_level,
+        a.ncre,
+        a.department,
+        a.entry_date,
+        a.contract_start_date,
+        a.tenant_id,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.user_id,
+        a.project_manager,
+        a.remarks
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_enrollment_registration SET type = #{type}
+		WHERE id = #{id}
+    </update>
+    <update id="removeById">
+        UPDATE human_resources_enrollment_registration SET del_flag = '1'
+		WHERE id = #{id}
+    </update>
+
+    <select id="findList"
+            resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id,
+        su.name as projectManagerName
+        from human_resources_enrollment_registration a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        left join sys_user su on a.project_manager = su.id
+        ${ew.customSqlSegment}
+        ORDER BY a.create_time DESC
+    </select>
+    <select id="getById"
+            resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration">
+        select
+        <include refid="Base_Column_List"></include>,
+        b.social_security_number,
+        b.social_security_bank_number,
+        b.social_security_picture_front,
+        b.social_security_picture_opposite as socialSecurityPictureOpposite
+        from human_resources_enrollment_registration a
+        left join human_resources_enrollment_social_security_card b on a.id = b.enrollment_registration_id and b.del_flag = '0'
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+</mapper>

+ 31 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentRiceCardMapper.xml

@@ -0,0 +1,31 @@
+<?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.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentRiceCardMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.enrollment_registration_id,
+        a.remarks,
+        a.rice_number
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_enrollment_rice_card SET type = #{type}
+		WHERE id = #{registrationId}
+    </update>
+
+    <select id="getById"
+            resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRiceCard">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_enrollment_rice_card a
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+</mapper>

+ 32 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentSocialSecurityCardMapper.xml

@@ -0,0 +1,32 @@
+<?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.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentSocialSecurityCardMapper">
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.enrollment_registration_id,
+        a.remarks,
+        a.social_security_number,
+        a.social_security_bank_number,
+        a.social_security_picture_front,
+        a.social_security_picture_opposite
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_enrollment_social_security_card SET type = #{type}
+		WHERE id = #{registrationId}
+    </update>
+    <select id="getById"
+            resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentSocialSecurityCard">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_enrollment_social_security_card a
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+</mapper>

+ 38 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentWageCardMapper.xml

@@ -0,0 +1,38 @@
+<?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.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentWageCardMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.enrollment_registration_id,
+        a.remarks,
+        a.zx_bank_card_number,
+        a.gs_bank_card_number,
+        a.zx_account_holder,
+        a.account_holder_front,
+        a.account_holder_opposite,
+        a.gs_account_holder,
+        a.gs_account_holder_front,
+        a.gs_account_holder_opposite
+    </sql>
+    <update id="updateStatusById">
+         UPDATE human_resources_enrollment_wage_card SET type = #{type}
+		WHERE id = #{registrationId}
+    </update>
+
+    <select id="getById"
+            resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_enrollment_wage_card a
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+</mapper>

+ 156 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentKeyCardService.java

@@ -0,0 +1,156 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRiceCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentKeyCardMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-17 8:57
+ */
+@Service
+@Transactional
+public class EnrollmentKeyCardService extends ServiceImpl<EnrollmentKeyCardMapper, EnrollmentKeyCard> {
+
+    @Resource
+    private EnrollmentKeyCardMapper keyCardMapper;
+
+    @Resource
+    private EnrollmentRiceCardService riceCardService;
+
+    public void deleteByRegistrationId(String id){
+        QueryWrapper<EnrollmentKeyCard> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("enrollment_registration_id",id);
+        keyCardMapper.delete(queryWrapper);
+    }
+
+    public EnrollmentKeyCard findById(String id) throws Exception {
+        // 查询基础信息表
+        EnrollmentKeyCard info = keyCardMapper.getById(id);
+        return info;
+    }
+
+    public void updateStatusById(EnrollmentKeyCard dto) {
+        keyCardMapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public EnrollmentKeyCard saveSecurityCard(EnrollmentKeyCard registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            EnrollmentKeyCard report = keyCardMapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentKeyCard add(EnrollmentKeyCard reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentKeyCard report = new EnrollmentKeyCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setCreateById(userDTO.getId());
+        report.setCreateTime(new Date());
+        report.setUpdateTime(new Date());
+        report.setUpdateById(userDTO.getId());
+        keyCardMapper.insert(report);
+
+        return report;
+    }
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentKeyCard update(EnrollmentKeyCard reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentKeyCard report = new EnrollmentKeyCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+        keyCardMapper.updateById(report);
+        if (report.getType().equals("5")){
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+            String day = format.format(new Date());
+            //发送通知到入职登记的人员
+            String userId = keyCardMapper.getNoticeUserId(report.getId());
+            String userName = SpringUtil.getBean(IUserApi.class).getById(userId).getName();
+            String uuid = UUID.randomUUID().toString();
+            //发送通知
+            Map<String ,String > map = new HashMap<>();
+            map.put("taskId",uuid);
+            map.put("title","门卡领取提醒");
+            map.put("defId",report.getId());
+            map.put("taskName","门卡领取提醒");
+            map.put("createUser",userDTO.getLoginName());
+            map.put("createTime",day);
+            map.put("noticeName",userName);
+            map.put("noticeId",userId);
+            map.put("createById",report.getCreateById());
+            SpringUtil.getBean(IFlowableApi.class).add(map);
+
+            Map map2 = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("完善餐补卡号");
+            String procDefId = map2.get("id")+"";
+            //发起完善餐补卡号流程
+            String uid = UUID.randomUUID().toString().replace("-", "");
+            EnrollmentRiceCard wageCard = new EnrollmentRiceCard();
+            wageCard.setId(uid);
+            wageCard.setCreateById("1");
+            wageCard.setUpdateById("1");
+            wageCard.setProcessDefinitionId(procDefId);
+            wageCard.setEnrollmentRegistrationId(report.getId());
+            riceCardService.save(wageCard);
+
+            String procDefKey = map2.get("key")+"";
+            String businessTable = "human_resources_enrollment_rice_card";
+            String businessId = uid;
+            String title = "完善餐补卡号";
+            String assignee = userId;
+            String recordType = "";
+            Map<String,String> newMap = new HashMap();
+            newMap.put("procDefId", procDefId);
+            newMap.put("procDefKey", procDefKey);
+            newMap.put("businessTable", businessTable);
+            newMap.put("businessId", businessId);
+            newMap.put("title", title);
+            newMap.put("assignee", assignee);
+            newMap.put("recordType", recordType);
+            String procInsId = SpringUtil.getBean(IFlowableApi.class).startForFen(newMap);
+
+            wageCard.setProcInsId(procInsId);
+            wageCard.setType("2");
+            riceCardService.saveOrUpdate(wageCard);
+
+
+        }
+
+        return report;
+    }
+}

+ 305 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentRegistrationService.java

@@ -0,0 +1,305 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.SecurityUtils;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentSocialSecurityCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentRegistrationMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentSocialSecurityCardMapper;
+import com.jeeplus.sys.feign.IRoleApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-27 14:27
+ */
+@Service
+@Transactional
+public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistrationMapper, EnrollmentRegistration> {
+
+    @Resource
+    private EnrollmentRegistrationMapper mapper;
+
+    @Resource
+    private EnrollmentWageCardService wageCardService;
+
+    @Resource
+    private EnrollmentSocialSecurityCardService securityCardService;
+
+    @Resource
+    private EnrollmentSocialSecurityCardMapper socialSecurityCardMapper;
+
+    @Resource
+    private EnrollmentKeyCardService keyCardService;
+
+    /**
+     * 实习人员登记表信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<EnrollmentRegistration> findList(Page<EnrollmentRegistration> page, EnrollmentRegistration projectReportData) throws Exception{
+        QueryWrapper<EnrollmentRegistration> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,EnrollmentRegistration.class);
+        queryWrapper.eq("a.del_flag","0");
+        IPage<EnrollmentRegistration> list = mapper.findList(page, queryWrapper);
+        return list;
+
+    }
+
+    public EnrollmentRegistration saveRegistration(EnrollmentRegistration registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            EnrollmentRegistration report = mapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentRegistration add(EnrollmentRegistration reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentRegistration report = new EnrollmentRegistration();
+        String id = UUID.randomUUID().toString().replace("-", "");
+        BeanUtils.copyProperties(reportData, report);
+        report.setId(id);
+        report.setCreateById(userDTO.getId());
+        report.setCreateTime(new Date());
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        if (StringUtils.isNotBlank(report.getSocialSecurityNumber())){
+            EnrollmentSocialSecurityCard securityCard = new EnrollmentSocialSecurityCard();
+            String amountId = UUID.randomUUID().toString().replace("-", "");
+            securityCard.setId(amountId);
+            securityCard.setCreateById(userDTO.getId());
+            securityCard.setCreateTime(new Date());
+            securityCard.setUpdateById(userDTO.getId());
+            securityCard.setUpdateTime(new Date());
+            securityCard.setSocialSecurityNumber(report.getSocialSecurityNumber());
+            securityCard.setSocialSecurityBankNumber(report.getSocialSecurityBankNumber());
+            securityCard.setSocialSecurityPictureFront(report.getSocialSecurityPictureFront());
+            securityCard.setSocialSecurityPictureOpposite(report.getSocialSecurityPictureOpposite());
+            securityCard.setEnrollmentRegistrationId(id);
+
+            socialSecurityCardMapper.insert(securityCard);
+        }
+
+        mapper.insert(report);
+
+        return report;
+    }
+
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentRegistration update(EnrollmentRegistration reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentRegistration report = new EnrollmentRegistration();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        //生成一个系统账号
+        // 生成id
+        String amountId = UUID.randomUUID().toString().replace("-", "");
+        report.setUserId(amountId);
+
+        if (StringUtils.isNotBlank(report.getType())){
+            if (report.getType().equals("5")){
+                //获取当前的用户,审核的人
+                UserDTO dto = new UserDTO();
+                //设置信息
+                dto.setId(amountId);
+                dto.setName(report.getName());
+                dto.setPassword(SecurityUtils.encryptPassword("123456"));
+                dto.setLoginName(report.getName());
+                dto.setLoginFlag("1");
+                dto.setMobile(report.getMobilePhone());
+                dto.setTenantDTO(userDTO.getTenantDTO());
+                dto.setCompanyDTO(userDTO.getCompanyDTO());
+                OfficeDTO officeDTO = new OfficeDTO();
+                officeDTO.setId(report.getDepartment());
+                //设置角色
+                RoleDTO roleInfo = SpringUtil.getBean(IRoleApi.class).getRoleDTOByName("兴光会计员工");
+                List <RoleDTO> roleIdList = new ArrayList<>();
+                roleIdList.add(roleInfo);
+                dto.setRoleDTOList(roleIdList);
+                dto.setOfficeDTO(officeDTO);
+                SpringUtil.getBean ( IUserApi.class ).saveOrUpdate(dto);
+
+
+                report.setOnJobStatus("正式");
+                //发送短信通知 (未实现)
+
+                //当流程结束的时候,发起工资卡信息完善流程
+                Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("工资卡信息完善");
+                String procDefId = map.get("id")+"";
+
+                //当流程结束的时候,发起工资卡信息完善流程
+                String uid = UUID.randomUUID().toString().replace("-", "");
+                EnrollmentWageCard wageCard = new EnrollmentWageCard();
+                wageCard.setId(uid);
+                wageCard.setCreateById("1");
+                wageCard.setUpdateById("1");
+                wageCard.setProcessDefinitionId(procDefId);
+                wageCard.setEnrollmentRegistrationId(report.getId());
+                wageCardService.save(wageCard);
+
+                String procDefKey = map.get("key")+"";
+                String businessTable = "human_resources_enrollment_wage_card";
+                String businessId = uid;
+                String title = "工资卡信息完善";
+                String assignee = amountId;
+                String recordType = "";
+                Map<String,String> newMap = new HashMap();
+                newMap.put("procDefId", procDefId);
+                newMap.put("procDefKey", procDefKey);
+                newMap.put("businessTable", businessTable);
+                newMap.put("businessId", businessId);
+                newMap.put("title", title);
+                newMap.put("assignee", assignee);
+                newMap.put("recordType", recordType);
+                String procInsId = SpringUtil.getBean(IFlowableApi.class).startForFen(newMap);
+
+                wageCard.setProcInsId(procInsId);
+                wageCard.setType("2");
+                wageCardService.saveOrUpdate(wageCard);
+
+                //发起社保流程
+                if (StringUtils.isBlank(report.getSocialSecurityNumber())){
+                    Map cardMap = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("社保登记");
+                    String procDefId2 = cardMap.get("id")+"";
+
+                    //当流程结束的时候,发起工资卡信息完善流程
+                    String uuid = UUID.randomUUID().toString().replace("-", "");
+                    EnrollmentSocialSecurityCard securityCard = new EnrollmentSocialSecurityCard();
+                    securityCard.setId(uuid);
+                    securityCard.setCreateById("1");
+                    securityCard.setUpdateById("1");
+                    securityCard.setProcessDefinitionId(procDefId2);
+                    securityCard.setEnrollmentRegistrationId(report.getId());
+                    securityCardService.save(securityCard);
+
+                    String procDefKey2 = cardMap.get("key")+"";
+                    String businessTable2 = "human_resources_enrollment_social_security_card";
+                    String businessId2 = uuid;
+                    String title2 = "社保卡信息完善";
+                    String assignee2 = amountId;
+                    String recordType2 = "";
+                    Map<String,String> newMap2 = new HashMap();
+                    newMap2.put("procDefId", procDefId2);
+                    newMap2.put("procDefKey", procDefKey2);
+                    newMap2.put("businessTable", businessTable2);
+                    newMap2.put("businessId", businessId2);
+                    newMap2.put("title", title2);
+                    newMap2.put("assignee", assignee2);
+                    newMap2.put("recordType", recordType2);
+                    String procInsId2 = SpringUtil.getBean(IFlowableApi.class).startForFen(newMap2);
+
+                    securityCard.setProcInsId(procInsId2);
+                    securityCard.setType("2");
+                    securityCardService.saveOrUpdate(securityCard);
+                }
+                //发起门卡办理通知流程
+                Map keyMap = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("门卡办理");
+                String keyProcDefId = keyMap.get("id")+"";
+
+                //当流程结束的时候,发起工资卡信息完善流程
+                String keyUid = UUID.randomUUID().toString().replace("-", "");
+                EnrollmentKeyCard keyCard = new EnrollmentKeyCard();
+                keyCard.setId(keyUid);
+                keyCard.setCreateById("1");
+                keyCard.setUpdateById("1");
+                keyCard.setProcessDefinitionId(keyProcDefId);
+                keyCard.setEnrollmentRegistrationId(report.getId());
+                keyCardService.save(keyCard);
+
+                String keyProcDefKey = keyMap.get("key")+"";
+                String keyBusinessTable = "human_resources_enrollment_key_card";
+                String keyBusinessId = keyUid;
+                String keyTitle = report.getName() +  "的门卡办理";
+                UserDTO userInfo = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId("赵俐");
+                String keyAssignee = userInfo.getId();
+                String keyRecordType = "";
+                Map<String,String> keyMap2 = new HashMap();
+                keyMap2.put("procDefId", keyProcDefId);
+                keyMap2.put("procDefKey", keyProcDefKey);
+                keyMap2.put("businessTable", keyBusinessTable);
+                keyMap2.put("businessId", keyBusinessId);
+                keyMap2.put("title", keyTitle);
+                keyMap2.put("assignee", keyAssignee);
+                keyMap2.put("recordType", keyRecordType);
+                String procInsId2 = SpringUtil.getBean(IFlowableApi.class).startForFen(keyMap2);
+                keyCard.setProcInsId(procInsId2);
+                keyCard.setType("2");
+                keyCardService.saveOrUpdate(keyCard);
+            }
+        }
+
+        mapper.updateById(report);
+        return report;
+    }
+
+    public EnrollmentRegistration findById(String id) throws Exception {
+        // 查询基础信息表
+        EnrollmentRegistration info = mapper.getById(id);
+        return info;
+    }
+
+    public void updateStatusById(EnrollmentRegistration dto) {
+        mapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public String remove(String id) {
+        // 删除基础信息表
+        mapper.removeById(id);
+        return "操作成功";
+    }
+
+    public Integer findIdCardOnly(String idCard) throws Exception {
+        QueryWrapper<EnrollmentRegistration> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("id_card", idCard);
+        // 删除基础信息表
+        Integer integer = mapper.selectCount(queryWrapper);
+        return integer;
+    }
+
+    public Integer findMobilePhoneOnly(String mobilePhone) throws Exception {
+        QueryWrapper<EnrollmentRegistration> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("mobile_phone", mobilePhone);
+        // 删除基础信息表
+        Integer integer = mapper.selectCount(queryWrapper);
+        return integer;
+    }
+}

+ 102 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentRiceCardService.java

@@ -0,0 +1,102 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRiceCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentRiceCardMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-20 16:50
+ */
+@Service
+@Transactional
+public class EnrollmentRiceCardService extends ServiceImpl<EnrollmentRiceCardMapper,EnrollmentRiceCard> {
+
+    @Resource
+    private EnrollmentRiceCardMapper riceCardMapper;
+
+    public void deleteByRegistrationId(String id){
+        QueryWrapper<EnrollmentRiceCard> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("enrollment_registration_id",id);
+        riceCardMapper.delete(queryWrapper);
+    }
+
+    public EnrollmentRiceCard findById(String id) throws Exception {
+        // 查询基础信息表
+        EnrollmentRiceCard info = riceCardMapper.getById(id);
+        return info;
+    }
+
+    public void updateStatusById(EnrollmentRiceCard dto) {
+        riceCardMapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public EnrollmentRiceCard saveSecurityCard(EnrollmentRiceCard registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            EnrollmentRiceCard report = riceCardMapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentRiceCard add(EnrollmentRiceCard reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentRiceCard report = new EnrollmentRiceCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setCreateById(userDTO.getId());
+        report.setCreateTime(new Date());
+        report.setUpdateTime(new Date());
+        report.setUpdateById(userDTO.getId());
+        riceCardMapper.insert(report);
+
+        return report;
+    }
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentRiceCard update(EnrollmentRiceCard reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentRiceCard report = new EnrollmentRiceCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+        riceCardMapper.updateById(report);
+        if (report.getType().equals("5")){
+            //发送短信
+            System.out.println("我出来了,我出来了");
+        }
+
+        return report;
+    }
+}

+ 92 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentSocialSecurityCardService.java

@@ -0,0 +1,92 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentSocialSecurityCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentSocialSecurityCardMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-16 10:17
+ */
+@Service
+@Transactional
+public class EnrollmentSocialSecurityCardService extends ServiceImpl<EnrollmentSocialSecurityCardMapper, EnrollmentSocialSecurityCard> {
+
+    @Resource
+    private EnrollmentSocialSecurityCardMapper securityCardMapper;
+
+    public void deleteByRegistrationId(String id){
+        QueryWrapper<EnrollmentSocialSecurityCard> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("enrollment_registration_id",id);
+        securityCardMapper.delete(queryWrapper);
+    }
+
+    public EnrollmentSocialSecurityCard findById(String id) throws Exception {
+        // 查询基础信息表
+        EnrollmentSocialSecurityCard info = securityCardMapper.getById(id);
+        return info;
+    }
+
+    public void updateStatusById(EnrollmentSocialSecurityCard dto) {
+        securityCardMapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public EnrollmentSocialSecurityCard saveSecurityCard(EnrollmentSocialSecurityCard registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            EnrollmentSocialSecurityCard report = securityCardMapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentSocialSecurityCard add(EnrollmentSocialSecurityCard reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentSocialSecurityCard report = new EnrollmentSocialSecurityCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setCreateById(userDTO.getId());
+        report.setCreateTime(new Date());
+        report.setUpdateTime(new Date());
+        report.setUpdateById(userDTO.getId());
+        securityCardMapper.insert(report);
+
+        return report;
+    }
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentSocialSecurityCard update(EnrollmentSocialSecurityCard reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentSocialSecurityCard report = new EnrollmentSocialSecurityCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+        securityCardMapper.updateById(report);
+
+        return report;
+    }
+}

+ 98 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentWageCardService.java

@@ -0,0 +1,98 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.SecurityUtils;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentSocialSecurityCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWageCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentWageCardMapper;
+import com.jeeplus.sys.feign.IRoleApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-10-11 15:11
+ */
+@Service
+@Transactional
+public class EnrollmentWageCardService extends ServiceImpl<EnrollmentWageCardMapper, EnrollmentWageCard> {
+
+    @Resource
+    private EnrollmentWageCardMapper wageCardMapper;
+
+    public void deleteByRegistrationId(String id){
+        QueryWrapper<EnrollmentWageCard> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("enrollment_registration_id",id);
+        wageCardMapper.delete(queryWrapper);
+    }
+
+    public EnrollmentWageCard findById(String id) throws Exception {
+        // 查询基础信息表
+        EnrollmentWageCard info = wageCardMapper.getById(id);
+        return info;
+    }
+
+    public void updateStatusById(EnrollmentWageCard dto) {
+        wageCardMapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public EnrollmentWageCard saveWageCard(EnrollmentWageCard registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            EnrollmentWageCard report = wageCardMapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentWageCard add(EnrollmentWageCard reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentWageCard report = new EnrollmentWageCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setCreateById(userDTO.getId());
+        report.setCreateTime(new Date());
+        report.setUpdateTime(new Date());
+        report.setUpdateById(userDTO.getId());
+        wageCardMapper.insert(report);
+
+        return report;
+    }
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public EnrollmentWageCard update(EnrollmentWageCard reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        EnrollmentWageCard report = new EnrollmentWageCard();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+        wageCardMapper.updateById(report);
+
+        return report;
+    }
+}

+ 61 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/ResponseUtil.java

@@ -0,0 +1,61 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Calendar;
+
+public class ResponseUtil {
+    private static Logger logger = LoggerFactory.getLogger(ResponseUtil.class);
+
+    public static void docResponse(String fileName, File file, HttpServletResponse response) {
+        ServletOutputStream out = null;
+        FileInputStream fin = null;
+        try {
+            fin = new FileInputStream(file);
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("application/octet-stream; charset=UTF-8");
+            // 设置浏览器以下载的方式处理该文件名
+            response.setHeader("Content-Disposition", "attachment;filename="
+                    .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
+            out = response.getOutputStream();
+            byte[] buffer = new byte[1024];  // 缓冲区
+            int bytesToRead = -1;
+            // 通过循环将读入的Word文件的内容输出到浏览器中
+            while ((bytesToRead = fin.read(buffer)) != -1) {
+                out.write(buffer, 0, bytesToRead);
+            }
+        } catch (Exception e) {
+            logger.error("导出模板文件发生错误!",e);
+        } finally {
+            try {
+                out.flush();
+                if (fin != null) fin.close();
+                if (out != null) out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+
+    /**
+     * 获取当前时间年月日
+     * @return
+     */
+    public static String datePath(){
+        Calendar date = Calendar.getInstance();
+        String year = String.valueOf(date.get(Calendar.YEAR));
+        String month = String.valueOf(date.get(Calendar.MONTH)+1);
+        String day = String.valueOf(date.get(Calendar.DAY_OF_MONTH));
+        String path = "/"+year+"/"+month+"/"+day;
+        return path;
+    }
+}

+ 140 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/controller/RegistrationWorkLogController.java

@@ -0,0 +1,140 @@
+package com.jeeplus.human.practice.logwrite.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.human.practice.logwrite.domain.HolidayVo;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLog;
+import com.jeeplus.human.practice.logwrite.service.RegistrationWorkLogService;
+import com.jeeplus.human.practice.logwrite.service.dto.RegistrationWorkLogDto;
+import com.jeeplus.human.practice.logwrite.util.HolidayUtil;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 10:02
+ */
+@RestController
+@Api("实习日志信息")
+@RequestMapping(value = "/workLog")
+public class RegistrationWorkLogController {
+
+    @Resource
+    private RegistrationWorkLogService workLogService;
+
+    /**
+     * 查询财务项目信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询实习日志信息列表")
+    @PreAuthorize("hasAuthority('workLog:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<RegistrationWorkLogDto>> data(RegistrationWorkLogDto projectReportData, Page<RegistrationWorkLogDto> page) throws Exception {
+        IPage<RegistrationWorkLogDto> result = new Page<RegistrationWorkLogDto>();
+        result = workLogService.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询财务项目信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询实习日志信息列表")
+    @GetMapping("completeData")
+    public ResponseEntity<IPage<RegistrationWorkLogDto>> completeData(RegistrationWorkLogDto projectReportData, Page<RegistrationWorkLogDto> page) throws Exception {
+        IPage<RegistrationWorkLogDto> result = new Page<RegistrationWorkLogDto>();
+        projectReportData.setType("5");
+        result = workLogService.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 保存实习人员登记信息
+     * @param workLog
+     * @return
+     */
+    @ApiLog(value = "保存实习人员登记信息", type = LogTypeEnum.SAVE)
+    @PreAuthorize("hasAnyAuthority('workLog:add','workLog:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody RegistrationWorkLog workLog) throws Exception {
+        RegistrationWorkLog s = workLogService.saveRegistrationWorkLog(workLog);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_practice_registration_work_log")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<RegistrationWorkLog> findById(@RequestParam String id) throws Exception{
+        RegistrationWorkLog dto = workLogService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id修改状态status
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "updateStatusById")
+    public void updateStatusById(@RequestBody RegistrationWorkLogDto dto) {
+        workLogService.updateStatusById(dto);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = workLogService.remove(id);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 根据开始时间与结束时间获取实际工作天数
+     * @return
+     */
+    @ApiOperation(value = "根据开始时间与结束时间获取实际工作天数")
+    @GetMapping("/getWorkDay")
+    public ResponseEntity<Integer> getWorkDay(@RequestParam String startTime, @RequestParam String endTime) throws IOException, ParseException {
+        //根据当前年份获取今年的所有节假日工作日信息
+        SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 解析日期时间字符串
+        Date dateTime = dateTimeFormat.parse(startTime);
+        Date dateTime2 = dateTimeFormat.parse(endTime);
+        // 创建日期格式化对象,只包含日期部分
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        // 格式化日期对象为日期字符串
+        String start = dateFormat.format(dateTime);
+        String end = dateFormat.format(dateTime2);
+        int holidayCounts = HolidayUtil.getHolidayCounts(start, end);
+        return ResponseEntity.ok(holidayCounts);
+    }
+}

+ 26 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/domain/HolidayVo.java

@@ -0,0 +1,26 @@
+package com.jeeplus.human.practice.logwrite.domain;
+
+import lombok.Data;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-18 15:27
+ */
+@Data
+public class HolidayVo {
+
+    private boolean holiday;
+
+    private boolean after;
+
+    private String date;//日期
+
+    private String name;
+
+    private String target;
+
+    private int wage;
+
+    private int rest;
+}

+ 63 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/domain/RegistrationWorkLog.java

@@ -0,0 +1,63 @@
+package com.jeeplus.human.practice.logwrite.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.List;
+
+/**
+ * 实习日志
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 9:38
+ */
+@Data
+@TableName("human_resources_practice_registration_work_log")
+public class RegistrationWorkLog extends BaseEntity {
+
+    private String type;
+
+    private String taskId;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    //开始时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String startTime;
+    //结束时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String endTime;
+    //实习天数
+    private String internshipDays;
+    //实习地点
+    private String internshipLocation;
+    //跟踪项目名称
+    private String trackingProjectName;
+    //工作内容
+    private String work;
+    //备注
+    private String remarks;
+    //项目经理
+    private String projectManager;
+
+    //实习工作日志名称
+    private String workName;
+
+    @TableField(exist = false)
+    private List<RegistrationWorkLogDetail> amountInfos;
+
+}

+ 28 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/domain/RegistrationWorkLogDetail.java

@@ -0,0 +1,28 @@
+package com.jeeplus.human.practice.logwrite.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 实习日志明细
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 9:54
+ */
+@Data
+@TableName("human_resources_practice_registration_work_log_detail")
+public class RegistrationWorkLogDetail extends BaseEntity {
+    private String year;                //年
+    private String month;               //月
+    private String day;                 //日
+    private String week;                //星期
+    private String auditProjectUnitName;//审计项目单位名称
+    private String location;            //地点
+    @TableField(exist = false)
+    private String locationId;          //地点id
+    private String auditWorkContent;    //审计工作内容
+    private String workLogId;           //实习日志id
+
+}

+ 31 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/RegistrationWorkLogDetailMapper.java

@@ -0,0 +1,31 @@
+package com.jeeplus.human.practice.logwrite.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLogDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 16:18
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface RegistrationWorkLogDetailMapper extends BaseMapper<RegistrationWorkLogDetail> {
+
+    /**
+     * 根据日志id去删除明细数据
+     * @param id
+     */
+    void deleteDetailInfo(String id);
+
+    /**
+     * 根据实习日志表id去查日志明细数据
+     * @param id
+     * @return
+     */
+    List<RegistrationWorkLogDetail> getChildList(String id);
+}

+ 41 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/RegistrationWorkLogMapper.java

@@ -0,0 +1,41 @@
+package com.jeeplus.human.practice.logwrite.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLog;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLogDetail;
+import com.jeeplus.human.practice.logwrite.service.dto.RegistrationWorkLogDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 10:00
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface RegistrationWorkLogMapper extends BaseMapper<RegistrationWorkLog> {
+
+    /**
+     * 实习日志列表信息
+     * @param page
+     * @param queryWrapper
+     * @return
+     */
+    IPage<RegistrationWorkLogDto> findList(Page<RegistrationWorkLogDto> page, @Param(Constants.WRAPPER) QueryWrapper<RegistrationWorkLogDto> queryWrapper);
+
+    void removeById(String id);
+
+    void updateStatusById(@Param("id") String id,@Param("type") String type);
+
+    RegistrationWorkLog getById(String id);
+
+    String getLastWorkDay(String createById);
+}

+ 26 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/xml/RegistrationWorkLogDetailMapper.xml

@@ -0,0 +1,26 @@
+<?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.jeeplus.human.practice.logwrite.mapper.RegistrationWorkLogDetailMapper">
+
+    <sql id="Son_Column_List">
+        b.year,
+        b.month,
+        b.day,
+        b.week,
+        b.audit_project_unit_name,
+        b.audit_work_content,
+        b.audit_work_content
+    </sql>
+    <delete id="deleteDetailInfo">
+        update human_resources_practice_registration_work_log_detail set del_flag = '1' where work_log_id = #{id}
+    </delete>
+
+    <select id="getChildList" resultType="com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLogDetail">
+        select
+        <include refid="Son_Column_List"></include>,
+        sa.name as location
+        from human_resources_practice_registration_work_log_detail b
+        left join sys_area sa on b.location = sa.id
+        where b.del_flag = '0' and b.work_log_id = #{id}
+    </select>
+</mapper>

+ 58 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/mapper/xml/RegistrationWorkLogMapper.xml

@@ -0,0 +1,58 @@
+<?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.jeeplus.human.practice.logwrite.mapper.RegistrationWorkLogMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.start_time,
+        a.end_time,
+        a.internship_days,
+        a.internship_location,
+        a.tracking_project_name,
+        a.work,
+        a.remarks,
+        a.project_manager,
+        a.work_name
+    </sql>
+
+    <update id="removeById">
+        update human_resources_practice_registration_work_log set del_flag = '1' where id = #{id}
+    </update>
+    <update id="updateStatusById">
+        UPDATE human_resources_practice_registration_work_log SET type = #{type}
+		WHERE id = #{id}
+    </update>
+
+    <select id="findList" resultType="com.jeeplus.human.practice.logwrite.service.dto.RegistrationWorkLogDto">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id,
+        su.name as createName,
+        su2.name as projectManagerName
+        from human_resources_practice_registration_work_log a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        left join sys_user su on a.create_by_id = su.id and su.del_flag = '0'
+        left join sys_user su2 on a.project_manager = su2.id and su2.del_flag = '0'
+        ${ew.customSqlSegment}
+        ORDER BY a.create_time DESC
+    </select>
+    <select id="getById" resultType="com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLog">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id
+        from human_resources_practice_registration_work_log a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+    <select id="getLastWorkDay" resultType="java.lang.String">
+        SELECT end_time FROM human_resources_practice_registration_work_log WHERE create_by_id = #{createById} ORDER BY end_time desc limit 1
+    </select>
+</mapper>

+ 199 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/service/RegistrationWorkLogService.java

@@ -0,0 +1,199 @@
+package com.jeeplus.human.practice.logwrite.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.SecurityUtils;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLog;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLogDetail;
+import com.jeeplus.human.practice.logwrite.mapper.RegistrationWorkLogDetailMapper;
+import com.jeeplus.human.practice.logwrite.mapper.RegistrationWorkLogMapper;
+import com.jeeplus.human.practice.logwrite.service.dto.RegistrationWorkLogDto;
+import com.jeeplus.sys.feign.IRoleApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 10:01
+ */
+@Service
+@Transactional
+public class RegistrationWorkLogService extends ServiceImpl<RegistrationWorkLogMapper, RegistrationWorkLog> {
+
+    @Resource
+    private RegistrationWorkLogMapper mapper;
+
+    @Resource
+    private RegistrationWorkLogDetailMapper detailMapper;
+
+    @Resource
+    private IFlowableApi flowTaskService;
+
+    /**
+     * 实习日志信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<RegistrationWorkLogDto> findList(Page<RegistrationWorkLogDto> page, RegistrationWorkLogDto projectReportData) throws Exception{
+        QueryWrapper<RegistrationWorkLogDto> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,RegistrationWorkLogDto.class);
+        queryWrapper.eq("a.del_flag","0");
+        if (StringUtils.isNotBlank(projectReportData.getType())){
+            queryWrapper.eq("a.type",projectReportData.getType());
+        }
+        if (StringUtils.isNotBlank(projectReportData.getWorkName())){
+            queryWrapper.eq("a.work_name",projectReportData.getWorkName());
+        }
+        IPage<RegistrationWorkLogDto> list = mapper.findList(page, queryWrapper);
+        list.getRecords().forEach(item -> {
+            // 入库 修改申请
+            if (com.jeeplus.utils.StringUtils.isNotBlank(item.getTaskId()) && com.jeeplus.utils.StringUtils.isNotBlank(item.getType())) {
+                if ("2".equals(item.getType())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditUserIds(flowTaskService.getTaskAuditUsers(item.getTaskId()));  // 获取数据审核人
+                }
+            }
+        });
+        return list;
+
+    }
+
+    public RegistrationWorkLog saveRegistrationWorkLog(RegistrationWorkLog registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            RegistrationWorkLog report = mapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    public RegistrationWorkLog findById(String id) {
+        // 查询基础信息表
+        RegistrationWorkLog info = mapper.getById(id);
+        List<RegistrationWorkLogDetail> childList = detailMapper.getChildList(id);
+        if (CollectionUtils.isNotEmpty(childList)){
+            info.setAmountInfos(childList);
+        }
+
+        return info;
+    }
+
+    public void updateStatusById(RegistrationWorkLogDto dto) {
+        mapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public String remove(String id) {
+        // 删除基础信息表
+        mapper.removeById(id);
+        //明细对应数据也要同步删除
+        detailMapper.deleteDetailInfo(id);
+        return "操作成功";
+    }
+
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public RegistrationWorkLog update(RegistrationWorkLog reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        RegistrationWorkLog report = new RegistrationWorkLog();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        //实习日志明细数据修改操作 先根据日志id删除对应信息,再重新保存
+        detailMapper.deleteDetailInfo(report.getId());
+        if (CollectionUtils.isNotEmpty(report.getAmountInfos())){
+            List<RegistrationWorkLogDetail> amountInfos = report.getAmountInfos();
+            for (RegistrationWorkLogDetail amountInfo : amountInfos) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                amountInfo.setId(amountId);
+                amountInfo.setCreateById(userDTO.getId());
+                amountInfo.setCreateTime(new Date());
+                amountInfo.setUpdateById(userDTO.getId());
+                amountInfo.setUpdateTime(new Date());
+                amountInfo.setDelFlag(0);
+                // 保存基础表信息主键值
+                amountInfo.setWorkLogId(report.getId());
+                if (StringUtils.isNotBlank(amountInfo.getLocationId())){
+                    amountInfo.setLocation(amountInfo.getLocationId());
+                }
+                detailMapper.insert(amountInfo);
+            }
+        }
+
+        mapper.updateById(report);
+
+        return report;
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public RegistrationWorkLog add(RegistrationWorkLog reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        RegistrationWorkLog report = new RegistrationWorkLog();
+        BeanUtils.copyProperties(reportData, report);
+
+        String id = UUID.randomUUID().toString().replace("-", "");
+        report.setId(id);
+        if (CollectionUtils.isNotEmpty(report.getAmountInfos())){
+            List<RegistrationWorkLogDetail> amountInfos = reportData.getAmountInfos();
+            for (RegistrationWorkLogDetail amountInfo : amountInfos) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                amountInfo.setId(amountId);
+                amountInfo.setCreateById(userDTO.getId());
+                amountInfo.setCreateTime(new Date());
+                amountInfo.setUpdateById(userDTO.getId());
+                amountInfo.setUpdateTime(new Date());
+                amountInfo.setDelFlag(0);
+                // 保存基础表信息主键值
+                amountInfo.setWorkLogId(report.getId());
+                if (StringUtils.isNotBlank(amountInfo.getLocationId())){
+                    amountInfo.setLocation(amountInfo.getLocationId());
+                }
+                detailMapper.insert(amountInfo);
+            }
+        }
+        mapper.insert(report);
+        return report;
+    }
+
+    /**
+     * 根据创建人id去查最后一天的日志
+     * @param createById
+     * @return
+     */
+    public String getLastWorkDay(String createById) {
+        return mapper.getLastWorkDay(createById);
+    }
+}

+ 73 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/service/dto/RegistrationWorkLogDto.java

@@ -0,0 +1,73 @@
+package com.jeeplus.human.practice.logwrite.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.human.practice.logwrite.domain.RegistrationWorkLogDetail;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.List;
+
+/**
+ * 实习日志
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-15 9:38
+ */
+@Data
+@TableName("human_resources_practice_registration_work_log")
+public class RegistrationWorkLogDto extends BaseEntity {
+
+    /**
+     * 数据审核人  入库 修改申请
+     */
+    private List<String> auditUserIds;
+
+    private String createName;
+
+    private String type;
+
+    private String taskId;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    //开始时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String startTime;
+    //结束时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String endTime;
+    //实习天数
+    private String internshipDays;
+    //实习地点
+    private String internshipLocation;
+    //跟踪项目名称
+    private String trackingProjectName;
+    //工作内容
+    private String work;
+    //备注
+    private String remarks;
+    //项目经理
+    private String projectManager;
+
+    //实习工作日志名称
+    private String workName;
+
+    private String projectManagerName;
+
+    private List<RegistrationWorkLogDetail> amountInfos;
+
+
+}

+ 188 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/logwrite/util/HolidayUtil.java

@@ -0,0 +1,188 @@
+package com.jeeplus.human.practice.logwrite.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jeeplus.human.practice.logwrite.domain.HolidayVo;
+import com.fasterxml.jackson.core.type.TypeReference;
+
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 节假日工具类
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-18 15:28
+ */
+public class HolidayUtil {
+    /**
+     * 发送get请求
+     */
+    private static String get(String url){
+        StringBuilder inputLine = new StringBuilder();
+        String read;
+        try {
+            HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
+            urlConnection.setReadTimeout(30 * 1000);
+            urlConnection.setConnectTimeout(30 * 1000);
+            urlConnection.setRequestProperty("Charset", "UTF-8");
+            urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36)");
+            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), StandardCharsets.UTF_8));
+            while ((read = in.readLine()) != null) {
+                inputLine.append(read);
+            }
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return inputLine.toString();
+    }
+
+    /**
+     * 调用免费API查询全年工作日、周末、法定节假日、节假日调休补班数据
+     * 1、调用 https://api.apihubs.cn/holiday/get?size=500&year=2021 查询全年日历(含周末)
+     * 2、调用 https://timor.tech/api/holiday/year/2021 查询全年节假日、调休
+     */
+    public static List<String> getAllHolidayByYear(String year) throws IOException {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+        ArrayList<HolidayVo> holidayVoList = new ArrayList<>();
+        HashMap<String,HolidayVo> hashMap = new HashMap<>();
+
+
+        //查询全年日历包含周末
+        String allDayJson = HolidayUtil.get("https://timor.tech/api/holiday/year/"+year);
+        ObjectMapper mapper = new ObjectMapper();
+        Map allDayMap = mapper.readValue(allDayJson,Map.class);
+        Map allDayData = (Map)allDayMap.get("holiday");
+
+        allDayData.forEach((k,v)->{
+            String s = v.toString();
+            // 去掉大括号
+            String keyValuePairs = s.substring(1, s.length() - 1);
+
+            // 分割键值对
+            String[] pairs = keyValuePairs.split(", ");
+
+            // 创建一个新的 HolidayVo 对象
+            HolidayVo holidayVo = new HolidayVo();
+
+            // 遍历键值对数组
+            for (String pair : pairs) {
+                String[] keyValue = pair.split("=");
+                String key = keyValue[0].trim();
+                String value = keyValue[1].trim();
+
+                // 根据键名设置相应的属性
+                switch (key) {
+                    case "holiday":
+                        holidayVo.setHoliday(Boolean.parseBoolean(value));
+                        break;
+                    case "name":
+                        holidayVo.setName(value);
+                        break;
+                    case "wage":
+                        holidayVo.setWage(Integer.parseInt(value));
+                        break;
+                    case "date":
+                        holidayVo.setDate(value);
+                        break;
+                    case "rest":
+                        holidayVo.setRest(Integer.parseInt(value));
+                        break;
+                    case "after":
+                        holidayVo.setAfter(Boolean.parseBoolean(value));
+                        break;
+                    // 可以根据需要添加其他属性
+                }
+            }
+            holidayVoList.add(holidayVo);
+
+        });
+        List<String> daiList = new ArrayList<>();
+        holidayVoList.forEach(holidayVo -> {
+            daiList.add(holidayVo.getDate());
+        });
+
+        return daiList;
+    }
+
+    //判断区间里面有没有节假日,并返回具体天数
+    public static int getHolidayCounts(String startTime,String endTime) throws IOException {
+        //判断区间内是否有节假日
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate startDate = LocalDate.parse(startTime, formatter);
+        LocalDate endDate = LocalDate.parse(endTime, formatter);
+
+        List<String> dateRange = new ArrayList<>();
+        LocalDate currentDate = startDate;
+
+        while (!currentDate.isAfter(endDate)) {
+            dateRange.add(currentDate.toString());
+            currentDate = currentDate.plusDays(1);
+        }
+        // 获取当前日期
+        LocalDate nowDate = LocalDate.now();
+
+        // 从当前日期中提取年份
+        String currentYear = nowDate.getYear() + "";
+        //获取所有的节假日具体天数
+        List<String> holiday = HolidayUtil.getAllHolidayByYear(currentYear);
+        int count = 0;
+        for (int i=0;i<dateRange.size();i++) {
+            if (holiday.contains(dateRange.get(i))){
+                count ++;
+            }
+        }
+        //判断是否是星期六星期天
+        for (int i=0;i<dateRange.size();i++){
+            // 使用字符串截取获取年、月、日的子字符串
+            String yearStr = dateRange.get(i).substring(0, 4);  // 截取年份部分(从索引0到4,不包括4)
+            String monthStr = dateRange.get(i).substring(5, 7); // 截取月份部分
+            String dayStr = dateRange.get(i).substring(8);      // 截取日份部分(从索引8开始到字符串末尾)
+
+            // 将子字符串解析为整数
+            int year = Integer.parseInt(yearStr);
+            int month = Integer.parseInt(monthStr);
+            int day = Integer.parseInt(dayStr);
+            boolean isRestDay = computeWhetherIsSaturdayAndSunday(new Date(year-1900, month-1, day));
+            if (isRestDay){
+                count ++;
+            }
+        }
+
+
+        return count;
+    }
+
+
+    /**
+     * 计算是周六还是周日
+     */
+    public static boolean computeWhetherIsSaturdayAndSunday(Date date) {
+        // 创建Calendar类实例
+        Calendar instance = Calendar.getInstance();
+        // 根据指定日期获取周几
+        instance.setTime(date);
+        //因为数组下标从0开始,而返回的是数组的内容,是数组{1,2,3,4,5,6,7}中用1~7来表示
+        int week = instance.get(Calendar.DAY_OF_WEEK);
+        // 周日的编号是1,周六的编号是7
+        if (week == Calendar.SUNDAY || week == Calendar.SATURDAY) {
+            // 是周六日返回true
+            return true;
+        }else {
+            // 不是周六日返回false
+            return false;
+        }
+    }
+}

+ 133 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/controller/RegisterController.java

@@ -0,0 +1,133 @@
+package com.jeeplus.human.practice.register.controller;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.human.practice.register.domain.Registration;
+import com.jeeplus.human.practice.register.service.RegistrationService;
+import com.jeeplus.human.practice.register.service.dto.RegistrationDto;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-13 10:55
+ */
+@RestController
+@Api("实习人员登记表信息")
+@RequestMapping(value = "/register")
+public class RegisterController {
+
+    @Resource
+    private RegistrationService service;
+
+    /**
+     * 查询财务项目信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询实习人员登记信息列表")
+    @GetMapping("list")
+    public ResponseEntity<IPage<RegistrationDto>> data(RegistrationDto projectReportData, Page<RegistrationDto> page) throws Exception {
+        IPage<RegistrationDto> result = new Page<RegistrationDto>();
+        result = service.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 根据id查询实习生信息
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询实习人员登记信息列表")
+    @GetMapping("list2")
+    public ResponseEntity<IPage<RegistrationDto>> data2(RegistrationDto projectReportData, Page<RegistrationDto> page) throws Exception {
+        IPage<RegistrationDto> result = new Page<RegistrationDto>();
+        result = service.findList2 (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 保存实习人员登记信息
+     * @param registration
+     * @return
+     */
+    @ApiLog(value = "保存实习人员登记信息", type = LogTypeEnum.SAVE)
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody Registration registration) throws Exception {
+        Registration s = service.saveRegistration(registration);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_practice_registration")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<Registration> findById(@RequestParam String id) throws Exception{
+        Registration dto = service.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id修改状态status
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "updateStatusById")
+    public void updateStatusById(@RequestBody RegistrationDto dto) {
+        service.updateStatusById(dto);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = service.remove(id);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 查询3天未发送日志状态为实习中的人员信息
+     * @return
+     */
+    @GetMapping("getTimeOutRegisters")
+    public String getTimeOutRegisters(){
+        List<Registration> listInfos = service.getTimeOutRegisters();
+        return JSON.toJSONString(listInfos);
+    }
+
+    /**
+     * 获取最后一次发起报销且实习状态为结束,并且报销状态为完成的
+     * @return
+     */
+    @GetMapping("getTimeOutReimburseRegisters")
+    public String getTimeOutReimburseRegisters(){
+        List<Registration> listInfos = service.getTimeOutReimburseRegisters();
+        return JSON.toJSONString(listInfos);
+    }
+}

+ 59 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/domain/Registration.java

@@ -0,0 +1,59 @@
+package com.jeeplus.human.practice.register.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.List;
+
+/**
+ * 实习人员登记表
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-13 11:00
+ */
+@Data
+@TableName("human_resources_practice_registration")
+public class Registration extends BaseEntity {
+    private String name;                //姓名
+    private String sex;                 //性别
+    private String idCard;              //身份证号码
+    private String nativePlace;         //出生地
+    private String nation;              //民族
+    private String politicalOutlook;    //政治面貌
+    private String graduatedFrom;       //毕业院校
+    private String speciality;          //专业
+    private String mobilePhone;         //联系电话
+    private String qqNum;               //QQ
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String practiceStatus;      //实习状态
+    private String userId;              //用户id
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String practiceCompleteDay; //实习结束时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String practiceStartDay;    //实习开始时间
+    private String practiceOffice;    //实习部门
+    private String practiceUnitName;    //实习单位名称
+    private String projectManager;      //项目经理
+    private String remarks;      //备注
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private String lastWorkLogDay;  //最后一次实习日志填写时间
+    //日志名称
+    private String workName;
+
+    @TableField(exist = false)
+    List<RegistrationFamilyMembers> familyMembers;
+    @TableField(exist = false)
+    List<RegistrationExperience> experiences;
+
+}

+ 28 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/domain/RegistrationExperience.java

@@ -0,0 +1,28 @@
+package com.jeeplus.human.practice.register.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 人力资源-实习人员登记表-实习经历
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-21 16:49
+ */
+@Data
+@TableName("human_resources_practice_registration_experience")
+public class RegistrationExperience extends BaseEntity {
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String startTime;       //开始时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String endTime;         //结束时间
+    private String practiceUnit;    //实践单位
+    private String post;            //岗位
+    private String registrationId;  //实习人员登记表id
+}

+ 22 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/domain/RegistrationFamilyMembers.java

@@ -0,0 +1,22 @@
+package com.jeeplus.human.practice.register.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-21 16:53
+ */
+@Data
+@TableName("human_resources_practice_registration_family_members")
+public class RegistrationFamilyMembers extends BaseEntity {
+
+    private String callName;        //称呼
+    private String name;        //姓名
+    private String phone;       //联系方式
+    private String workUnit;    //工作单位
+    private String registrationId;  //实习人员登记表id
+
+}

+ 32 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/FamilyMembersMapper.java

@@ -0,0 +1,32 @@
+package com.jeeplus.human.practice.register.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.practice.register.domain.RegistrationFamilyMembers;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 9:04
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface FamilyMembersMapper extends BaseMapper<RegistrationFamilyMembers> {
+
+    /**
+     * 根据实习人员登记表id删除家庭成员信息
+     * @param registerId
+     */
+    void deleteByRegisterId(@Param("registerId") String registerId);
+
+    /**
+     * 根据实习人员登记表id查询家庭成员信息
+     * @param registerId
+     * @return
+     */
+    List<RegistrationFamilyMembers> getByRegisterId(@Param("registerId") String registerId);
+}

+ 48 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/InterRegistrationMapper.java

@@ -0,0 +1,48 @@
+package com.jeeplus.human.practice.register.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.human.practice.register.domain.Registration;
+import com.jeeplus.human.practice.register.service.dto.RegistrationDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 实习人员登记表 mapper
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-13 14:01
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface InterRegistrationMapper extends BaseMapper<Registration> {
+    @InterceptorIgnore(tenantLine = "true")
+    void updateStatusById(@Param("id") String id, @Param("type") String type);
+    /**
+     * 查询实习人员登记表
+     * @param page
+     * @param queryWrapper
+     * @return
+     */
+    IPage<RegistrationDto> findList(Page<RegistrationDto> page, @Param(Constants.WRAPPER) QueryWrapper<RegistrationDto> queryWrapper);
+
+    IPage<RegistrationDto> findList2(Page<RegistrationDto> page, @Param(Constants.WRAPPER) QueryWrapper<RegistrationDto> queryWrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Registration getById(@Param("id") String id);
+    @InterceptorIgnore(tenantLine = "true")
+    void removeById(String id);
+
+    void updatePracticeStatus(@Param("createById")String createById,@Param("endTime")String endTime);
+
+    List<Registration> getTimeOutRegisters(@Param("threeDayAgo")String threeDayAgo);
+
+    //获取最后一次发起报销且实习状态为结束,并且报销状态为完成的
+    List<Registration> getTimeOutReimburseRegisters();
+}

+ 32 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/RegistrationExperienceMapper.java

@@ -0,0 +1,32 @@
+package com.jeeplus.human.practice.register.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.practice.register.domain.RegistrationExperience;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 9:09
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface RegistrationExperienceMapper extends BaseMapper<RegistrationExperience> {
+
+    /**
+     * 根据实习人员登记表id删除实习经验信息
+     * @param registerId
+     */
+    void deleteByRegisterId(@Param("registerId") String registerId);
+
+    /**
+     * 根据实习人员登记表id查询实习经验信息
+     * @param registerId
+     * @return
+     */
+    List<RegistrationExperience> getByRegisterId(@Param("registerId") String registerId);
+}

+ 29 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/xml/FamilyMembersMapper.xml

@@ -0,0 +1,29 @@
+<?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.jeeplus.human.practice.register.mapper.FamilyMembersMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.registration_id,
+        a.call_name,
+        a.name,
+        a.phone,
+        a.work_unit
+    </sql>
+
+    <delete id="deleteByRegisterId">
+        update human_resources_practice_registration_family_members set del_flag = '1' where registration_id = #{registerId}
+    </delete>
+    <select id="getByRegisterId"
+            resultType="com.jeeplus.human.practice.register.domain.RegistrationFamilyMembers">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_practice_registration_family_members a
+        where a.registration_id = #{registerId} and a.del_flag = '0'
+    </select>
+</mapper>

+ 123 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/xml/InterRegistrationMapper.xml

@@ -0,0 +1,123 @@
+<?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.jeeplus.human.practice.register.mapper.InterRegistrationMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.name,
+        a.sex,
+        a.id_card,
+        a.native_place,
+        a.nation,
+        a.political_outlook,
+        a.graduated_from,
+        a.speciality,
+        a.mobile_phone,
+        a.qq_num,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.practice_status,
+        a.user_id,
+        a.practice_complete_day,
+        a.practice_start_day,
+        a.practice_office,
+        a.practice_unit_name,
+        a.project_manager,
+        a.remarks
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_practice_registration SET type = #{type}
+		WHERE id = #{id}
+    </update>
+    <update id="removeById">
+        update human_resources_practice_registration set del_flag = '1' where id = #{id}
+    </update>
+    <update id="updatePracticeStatus">
+        update human_resources_practice_registration set practice_status = '已结束',practice_complete_day = #{endTime} where user_id = #{createById}
+    </update>
+
+    <select id="findList" resultType="com.jeeplus.human.practice.register.service.dto.RegistrationDto">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id,
+        su.name as projectManagerName
+        from human_resources_practice_registration a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        left join sys_user su on a.project_manager = su.id
+        ${ew.customSqlSegment}
+        ORDER BY a.create_time DESC
+    </select>
+    <select id="getById" resultType="com.jeeplus.human.practice.register.domain.Registration">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_practice_registration a
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+    <select id="getTimeOutRegisters" resultType="com.jeeplus.human.practice.register.domain.Registration">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_practice_registration a
+        left join
+        (
+        SELECT
+        MAX(create_time) AS last_create_time,
+        create_by_id
+        FROM
+        human_resources_practice_registration_work_log
+        WHERE
+        del_flag = 0
+        GROUP BY
+        create_by_id
+        ) b ON a.user_id = b.create_by_id
+        <where>
+            a.del_flag = 0
+            and a.type = 5
+            AND b.last_create_time &lt;= #{threeDayAgo}
+        </where>
+        ORDER BY a.update_time DESC
+    </select>
+    <select id="findList2" resultType="com.jeeplus.human.practice.register.service.dto.RegistrationDto">
+        select a.name,a.practice_start_day,a.practice_complete_day,a.practice_status,a.project_manager,
+        b.last_create_time as lastCreateTime,b.work_name as workName,b.id as workId,su.name as projectManagerName
+        from human_resources_practice_registration a
+        left join (
+        SELECT
+        MAX(create_time) AS last_create_time,
+        create_by_id,work_name,id
+        FROM
+        human_resources_practice_registration_work_log
+        WHERE
+        del_flag = 0
+        GROUP BY
+        create_by_id
+        ) b ON a.user_id = b.create_by_id
+        left join sys_user su on a.project_manager = su.id
+        ${ew.customSqlSegment}
+    </select>
+    <select id="getTimeOutReimburseRegisters"
+            resultType="com.jeeplus.human.practice.register.domain.Registration">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_practice_registration a
+        left join
+        (
+        SELECT
+        MAX(create_time) AS last_create_time,
+        create_by_id
+        FROM
+        human_resources_practice_reimburse_register
+        WHERE
+        del_flag = 0 and type = '5'
+        GROUP BY
+        create_by_id
+        ) b ON a.user_id = b.create_by_id
+        left join sys_user su on a.user_id = su.id
+        where a.practice_status = '结束' and su.del_flag = '0'
+    </select>
+</mapper>

+ 29 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/mapper/xml/RegistrationExperienceMapper.xml

@@ -0,0 +1,29 @@
+<?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.jeeplus.human.practice.register.mapper.RegistrationExperienceMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.start_time,
+        a.end_time,
+        a.practice_unit,
+        a.post,
+        a.registration_id
+    </sql>
+
+    <delete id="deleteByRegisterId">
+        update human_resources_practice_registration_experience set del_flag = '1' where registration_id = #{registerId}
+    </delete>
+    <select id="getByRegisterId"
+            resultType="com.jeeplus.human.practice.register.domain.RegistrationExperience">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_practice_registration_experience a
+        where a.registration_id = #{registerId} and a.del_flag = '0'
+    </select>
+</mapper>

+ 292 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/service/RegistrationService.java

@@ -0,0 +1,292 @@
+package com.jeeplus.human.practice.register.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.SecurityUtils;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.human.practice.register.domain.Registration;
+import com.jeeplus.human.practice.register.domain.RegistrationExperience;
+import com.jeeplus.human.practice.register.domain.RegistrationFamilyMembers;
+import com.jeeplus.human.practice.register.mapper.FamilyMembersMapper;
+import com.jeeplus.human.practice.register.mapper.InterRegistrationMapper;
+import com.jeeplus.human.practice.register.mapper.RegistrationExperienceMapper;
+import com.jeeplus.human.practice.register.service.dto.RegistrationDto;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.feign.*;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import com.jeeplus.sys.service.dto.PostDTO;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-13 14:11
+ */
+@Service
+@Transactional
+public class RegistrationService extends ServiceImpl<InterRegistrationMapper, Registration> {
+
+    @Resource
+    private InterRegistrationMapper mapper;
+
+    @Resource
+    private FamilyMembersMapper familyMembersMapper;
+
+    @Resource
+    private RegistrationExperienceMapper experienceMapper;
+
+    public void updateStatusById(RegistrationDto dto) {
+        mapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public Registration findById(String id) {
+        // 查询基础信息表
+        Registration info = mapper.getById(id);
+        if (null != info){
+            List<RegistrationFamilyMembers> familyMembers = familyMembersMapper.getByRegisterId(id);
+            info.setFamilyMembers(familyMembers);
+            List<RegistrationExperience> experiences = experienceMapper.getByRegisterId(id);
+            info.setExperiences(experiences);
+        }
+        return info;
+    }
+
+    public String remove(String id) {
+        //删除实习经验表的数据
+        experienceMapper.deleteByRegisterId(id);
+        //删除家庭成员表的数据
+        familyMembersMapper.deleteByRegisterId(id);
+        // 删除基础信息表
+        mapper.removeById(id);
+        return "操作成功";
+    }
+
+    /**
+     * 实习人员登记表信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<RegistrationDto> findList(Page<RegistrationDto> page, RegistrationDto projectReportData) throws Exception{
+        QueryWrapper<RegistrationDto> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,RegistrationDto.class);
+        queryWrapper.eq("a.del_flag","0");
+        IPage<RegistrationDto> list = mapper.findList(page, queryWrapper);
+        return list;
+
+    }
+
+    /**
+     * 根据id查实习人员信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<RegistrationDto> findList2(Page<RegistrationDto> page, RegistrationDto projectReportData) throws Exception{
+        QueryWrapper<RegistrationDto> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,RegistrationDto.class);
+        queryWrapper.eq("a.del_flag","0");
+        queryWrapper.eq("a.id",projectReportData.getId());
+        IPage<RegistrationDto> list = mapper.findList2(page, queryWrapper);
+        return list;
+
+    }
+
+    public Registration saveRegistration(Registration registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            Registration report = mapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Registration update(Registration reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        Registration report = new Registration();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        //当审核通过的时候,将该人员加入到实习生角色中,根据联系电话发送短信到该实习生手机中,将实习状态改为“实习中”
+        //根据他的姓名生成一个系统账号,就是创建一个用户信息
+        if (StringUtils.isNotBlank(report.getType())){
+            if (report.getType().equals("5")){
+                //获取当前的用户,审核的人
+                UserDTO dto = new UserDTO();
+                //设置信息
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                dto.setId(amountId);
+                dto.setName(report.getName());
+                dto.setPassword(SecurityUtils.encryptPassword("123456"));
+                dto.setLoginName(report.getName());
+                dto.setLoginFlag("1");
+                dto.setMobile(report.getMobilePhone());
+                dto.setTenantDTO(userDTO.getTenantDTO());
+                dto.setCompanyDTO(userDTO.getCompanyDTO());
+                OfficeDTO officeDTO = new OfficeDTO();
+                officeDTO.setId(report.getPracticeOffice());
+                dto.setOfficeDTO(officeDTO);
+                // 获取实习生角色id
+                RoleDTO roleInfo = SpringUtil.getBean(IRoleApi.class).getRoleDTOByName("实习生");
+                List <RoleDTO> roleIdList = new ArrayList<>();
+                roleIdList.add(roleInfo);
+                dto.setRoleDTOList(roleIdList);
+                SpringUtil.getBean ( IUserApi.class ).saveOrUpdate(dto);
+                //发送短信通知
+
+                report.setPracticeStatus("实习中");
+                report.setUserId(dto.getId());
+            }
+        }
+
+        //先删除家庭成员信息,在重新添加
+        familyMembersMapper.deleteByRegisterId(report.getId());
+        List<RegistrationFamilyMembers> familyMembers = reportData.getFamilyMembers();
+        if (CollectionUtils.isNotEmpty(familyMembers)){
+            familyMembers.forEach(fa->{
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                fa.setId(amountId);
+                fa.setCreateById(userDTO.getId());
+                fa.setCreateTime(new Date());
+                fa.setUpdateById(userDTO.getId());
+                fa.setUpdateTime(new Date());
+                fa.setDelFlag(0);
+                fa.setRegistrationId(report.getId());
+
+                familyMembersMapper.insert(fa);
+            });
+        }
+        //先删除实习经历信息
+        experienceMapper.deleteByRegisterId(report.getId());
+        List<RegistrationExperience> experiences = reportData.getExperiences();
+        if (CollectionUtils.isNotEmpty(experiences)){
+            experiences.forEach(fa->{
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                fa.setId(amountId);
+                fa.setCreateById(userDTO.getId());
+                fa.setCreateTime(new Date());
+                fa.setUpdateById(userDTO.getId());
+                fa.setUpdateTime(new Date());
+                fa.setDelFlag(0);
+                fa.setRegistrationId(report.getId());
+
+                experienceMapper.insert(fa);
+            });
+        }
+        mapper.updateById(report);
+
+        return report;
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Registration add(Registration reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        Registration report = new Registration();
+        BeanUtils.copyProperties(reportData, report);
+        String id = UUID.randomUUID().toString().replace("-", "");
+        report.setId(id);
+
+        //先删除家庭成员信息,在重新添加
+        familyMembersMapper.deleteByRegisterId(report.getId());
+        List<RegistrationFamilyMembers> familyMembers = reportData.getFamilyMembers();
+        if (CollectionUtils.isNotEmpty(familyMembers)){
+
+            for (RegistrationFamilyMembers familyMember : familyMembers) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                familyMember.setId(amountId);
+                familyMember.setCreateById(userDTO.getId());
+                familyMember.setCreateTime(new Date());
+                familyMember.setUpdateById(userDTO.getId());
+                familyMember.setUpdateTime(new Date());
+                familyMember.setDelFlag(0);
+                familyMember.setRegistrationId(report.getId());
+                familyMembersMapper.insert(familyMember);
+            }
+        }
+        //先删除实习经历信息
+        experienceMapper.deleteByRegisterId(report.getId());
+        List<RegistrationExperience> experiences = reportData.getExperiences();
+        if (CollectionUtils.isNotEmpty(experiences)){
+            for (RegistrationExperience experience : experiences) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                experience.setId(amountId);
+                experience.setCreateById(userDTO.getId());
+                experience.setCreateTime(new Date());
+                experience.setUpdateById(userDTO.getId());
+                experience.setUpdateTime(new Date());
+                experience.setDelFlag(0);
+                experience.setRegistrationId(report.getId());
+
+                experienceMapper.insert(experience);
+            }
+        }
+
+        mapper.insert(report);
+
+        return report;
+    }
+
+    /**
+     * 根据实习生的用户id修改实习状态
+     * @param createById
+     */
+    public void updatePracticeStatus(String createById,String endTime) {
+        mapper.updatePracticeStatus(createById,endTime);
+    }
+
+    /**
+     * 查询超过3天未发起日志的实习中的信息
+     * @return
+     */
+    public List<Registration> getTimeOutRegisters() {
+        //获取3天前的时间
+        String threeDayAgo = LocalDateTime.now().plusDays(-3).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        List<Registration> registrations = mapper.getTimeOutRegisters(threeDayAgo);
+        return registrations;
+    }
+
+    /**
+     * 获取最后一次发起报销且实习状态为结束,并且报销状态为完成的
+     * @return
+     */
+    public List<Registration> getTimeOutReimburseRegisters() {
+        List<Registration> registrations = mapper.getTimeOutReimburseRegisters();
+        return registrations;
+    }
+}

+ 60 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/register/service/dto/RegistrationDto.java

@@ -0,0 +1,60 @@
+package com.jeeplus.human.practice.register.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 实习人员登记表
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-13 11:00
+ */
+@Data
+public class RegistrationDto extends BaseDTO {
+
+    private String name;                //姓名
+    private String sex;                 //性别
+    private String idCard;              //身份证号码
+    private String nativePlace;         //出生地
+    private String nation;              //民族
+    private String politicalOutlook;    //政治面貌
+    private String graduatedFrom;       //毕业院校
+    private String speciality;          //专业
+    private String mobilePhone;         //联系电话
+    private String qqNum;               //QQ
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String practiceStatus;      //实习状态
+    private String userId;              //用户id
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String practiceCompleteDay; //实习结束时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String practiceStartDay;    //实习开始时间
+    private String practiceOffice;    //实习部门
+    private String practiceUnitName;    //实习单位名称
+    private String projectManager;      //项目经理
+    private String remarks;      //备注
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private String lastWorkLogDay;  //最后一次实习日志填写时间
+    //日志名称
+    private String workName;
+
+    private String taskId;
+    //项目经理名称
+    private String projectManagerName;
+
+    private String lastCreateTime;
+
+    private String workId;
+}

+ 94 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/controller/ReimburseRegisterController.java

@@ -0,0 +1,94 @@
+package com.jeeplus.human.practice.reimburseRegister.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister;
+import com.jeeplus.human.practice.reimburseRegister.service.ReimburseRegisterService;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-19 13:43
+ */
+@RestController
+@Api("实习报销登记")
+@RequestMapping(value = "/reimburseRegister")
+public class ReimburseRegisterController {
+
+    @Resource
+    private ReimburseRegisterService registerService;
+
+    /**
+     * 查询财务项目信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询实习报销登记列表")
+    @PreAuthorize("hasAuthority('reimburseRegister:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<ReimburseRegister>> data(ReimburseRegister projectReportData, Page<ReimburseRegister> page) throws Exception {
+        IPage<ReimburseRegister> result = new Page<ReimburseRegister>();
+        result = registerService.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<ReimburseRegister> findById(@RequestParam String id) throws Exception{
+        ReimburseRegister dto = registerService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 保存实习人员登记信息
+     * @param reimburseRegister
+     * @return
+     */
+    @ApiLog(value = "保存报销登记信息", type = LogTypeEnum.SAVE)
+    @PreAuthorize("hasAnyAuthority('reimburseRegister:add','reimburseRegister:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody ReimburseRegister reimburseRegister) throws Exception {
+        ReimburseRegister s = registerService.saveReimburseRegister(reimburseRegister);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_practice_reimburse_register")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 根据id修改状态status
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "updateStatusById")
+    public void updateStatusById(@RequestBody ReimburseRegister dto) {
+        registerService.updateStatusById(dto);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = registerService.remove(id);
+        return ResponseEntity.ok(s);
+    }
+}

+ 96 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/controller/ReimburseSubmitAccountController.java

@@ -0,0 +1,96 @@
+package com.jeeplus.human.practice.reimburseRegister.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccount;
+import com.jeeplus.human.practice.reimburseRegister.service.ReimburseSubmitAccountService;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 13:59
+ */
+@RestController
+@Api("实习报销")
+@RequestMapping(value = "/reimburseSubmitAccount")
+public class ReimburseSubmitAccountController {
+
+    @Resource
+    private ReimburseSubmitAccountService accountService;
+
+    /**
+     * 查询实习报销信息列表
+     * @param projectReportData
+     * @param page
+     * @return
+     */
+    @ApiLog("查询实习报销列表")
+    @PreAuthorize("hasAuthority('reimburseSubmitAccount:list')")
+    @GetMapping("list")
+    public ResponseEntity<IPage<ReimburseSubmitAccount>> data(ReimburseSubmitAccount projectReportData, Page<ReimburseSubmitAccount> page) throws Exception {
+        IPage<ReimburseSubmitAccount> result = new Page<ReimburseSubmitAccount>();
+        result = accountService.findList (page,projectReportData);
+        return ResponseEntity.ok (result);
+    }
+
+    /**
+     * 保存实习人员登记信息
+     * @param reimburseRegister
+     * @return
+     */
+    @ApiLog(value = "保存报销登记信息", type = LogTypeEnum.SAVE)
+    @PreAuthorize("hasAnyAuthority('reimburseSubmitAccount:add','reimburseSubmitAccount:edit')")
+    @PostMapping("save")
+    public ResponseEntity save(@Valid @RequestBody ReimburseSubmitAccount reimburseRegister) throws Exception {
+        ReimburseSubmitAccount s = accountService.saveSubmitAccount(reimburseRegister);
+        return ResponseUtil.newInstance().add("businessTable", "human_resources_practice_reimburse_submit_account")
+                .add("businessId", s.getId())
+                .ok ("操作成功");
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<ReimburseSubmitAccount> findById(@RequestParam String id) throws Exception{
+        ReimburseSubmitAccount dto = accountService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 根据id修改状态status
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "updateStatusById")
+    public void updateStatusById(@RequestBody ReimburseSubmitAccount dto) {
+        accountService.updateStatusById(dto);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = accountService.remove(id);
+        return ResponseEntity.ok(s);
+    }
+
+}

+ 67 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseRegister.java

@@ -0,0 +1,67 @@
+package com.jeeplus.human.practice.reimburseRegister.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 实习报销登记
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-19 13:33
+ */
+@Data
+@TableName("human_resources_practice_reimburse_register")
+public class ReimburseRegister extends BaseEntity {
+
+    private String reimbuserName; //报销登记名称
+
+    //总报销金额
+    private String allReimbursementAmount;
+
+    private String remarks;
+    /**
+     * 数据审核人  入库 修改申请
+     */
+    @TableField(exist = false)
+    private List<String> auditUserIds;
+    //银行卡号
+    private String bankCardNumber;
+    //项目经理
+    private String projectManager;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processDefinitionId;
+
+    private String type;
+
+    /**
+     * 是否实习结束 1:是,0:否
+     */
+    private String completePractice;
+
+    @TableField(exist = false)
+    private String taskId;
+
+    @TableField(exist = false)
+    private List<ReimburseRegisterDetail> detailList;
+
+    //项目经理名称
+    @TableField(exist = false)
+    private String projectManagerName;
+
+    //创建人名称
+    @TableField(exist = false)
+    private String createName;
+
+}

+ 29 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseRegisterDetail.java

@@ -0,0 +1,29 @@
+package com.jeeplus.human.practice.reimburseRegister.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-19 13:38
+ */
+@Data
+@TableName("human_resources_practice_reimburse_register_detail")
+public class ReimburseRegisterDetail extends BaseEntity {
+    //实习日志表id
+    private String workLogId;
+    //实习报销登记
+    private String registerId;
+    //报销金额
+    private String reimbursementAmount;
+
+    @TableField(exist = false)
+    private String workName;
+    @TableField(exist = false)
+    private String internshipDays;
+    @TableField(exist = false)
+    private String createName;
+}

+ 52 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseSubmitAccount.java

@@ -0,0 +1,52 @@
+package com.jeeplus.human.practice.reimburseRegister.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 实习-报销
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 13:48
+ */
+@Data
+@TableName("human_resources_practice_reimburse_submit_account")
+public class ReimburseSubmitAccount extends BaseEntity {
+
+    public static final String BIZ_CODE = "31";
+
+    private String remarks;  //备注
+
+    private String procInsId;
+
+    private String processDefinitionId;
+
+    private String type;
+
+    private String operator;        //经办人
+    private String operatorOffice;  //经办人部门
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private String reimDate;        //报销日期
+    private String no;              //报销编号
+    private String totalNum;          //报销金额
+    @TableField(exist = false)
+    private String taskId;
+
+    @TableField(exist = false)
+    private List<WorkAttachmentInfo> files;
+
+    /**
+     * 数据审核人  入库 修改申请
+     */
+    @TableField(exist = false)
+    private List<String> auditUserIds;
+
+    @TableField(exist = false)
+    private List<ReimburseSubmitAccountDetail> accountDetails;
+}

+ 29 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/domain/ReimburseSubmitAccountDetail.java

@@ -0,0 +1,29 @@
+package com.jeeplus.human.practice.reimburseRegister.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 实习-报销详情
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 15:43
+ */
+@Data
+@TableName("human_resources_practice_reimburse_submit_account_detail")
+public class ReimburseSubmitAccountDetail extends BaseEntity {
+
+    private String infoId;          //基础表id
+    private String userId;          //报销人
+    private String userName;        //报销人名称
+    private String deptId;          //报销部门
+    private String deptName;        //报销部门名称
+    private String number;          //费用(元)
+    private String receiptNumber;   //收据张数
+    private String days;            //出差天数
+    private String content;         //内容
+    private String registerName;    //报销登记名称
+    private String registerId;      //报销登记id
+
+}

+ 26 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseRegisterDetailMapper.java

@@ -0,0 +1,26 @@
+package com.jeeplus.human.practice.reimburseRegister.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegisterDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-19 16:32
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface ReimburseRegisterDetailMapper extends BaseMapper<ReimburseRegisterDetail> {
+
+    List<ReimburseRegisterDetail> getChildList(String id);
+
+    /**
+     * 根据报销登记id删除详细表信息
+     * @param id
+     */
+    void deleteDetailInfo(String id);
+}

+ 29 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseRegisterMapper.java

@@ -0,0 +1,29 @@
+package com.jeeplus.human.practice.reimburseRegister.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-19 13:40
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface ReimburseRegisterMapper extends BaseMapper<ReimburseRegister> {
+
+    IPage<ReimburseRegister> findList(Page<ReimburseRegister> page,@Param(Constants.WRAPPER) QueryWrapper<ReimburseRegister> queryWrapper);
+
+    ReimburseRegister getById(String id);
+
+    void updateStatusById(@Param("id")String id,@Param("type") String type);
+
+    void removeById(String id);
+}

+ 24 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseSubmitAccountDetailMapper.java

@@ -0,0 +1,24 @@
+package com.jeeplus.human.practice.reimburseRegister.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccountDetail;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 15:50
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface ReimburseSubmitAccountDetailMapper extends BaseMapper<ReimburseSubmitAccountDetail> {
+
+
+    void deleteByReportId(@Param("id") String id);
+
+    List<ReimburseSubmitAccountDetail> getInfoByInfoId(@Param("id")String id);
+}

+ 36 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/ReimburseSubmitAccountMapper.java

@@ -0,0 +1,36 @@
+package com.jeeplus.human.practice.reimburseRegister.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccount;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 13:56
+ */
+@Mapper
+@InterceptorIgnore(tenantLine = "true")
+public interface ReimburseSubmitAccountMapper extends BaseMapper<ReimburseSubmitAccount> {
+
+    IPage<ReimburseSubmitAccount> findList(Page<ReimburseSubmitAccount> page, @Param(Constants.WRAPPER) QueryWrapper<ReimburseSubmitAccount> queryWrapper);
+
+    ReimburseSubmitAccount getById(String id);
+
+    void updateStatusById(@Param("id")String id, @Param("type")String type);
+
+    List<WorkAttachmentInfo> findFileList(String id);
+
+    Integer findIsExit(@Param("id") String id, @Param("name")String name);
+
+    List<WorkAttachmentInfo> findFiles(@Param("id") String id);
+}

+ 32 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseRegisterDetailMapper.xml

@@ -0,0 +1,32 @@
+<?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.jeeplus.human.practice.reimburseRegister.mapper.ReimburseRegisterDetailMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.work_log_id,
+        a.register_id,
+        a.reimbursement_amount
+    </sql>
+    <update id="deleteDetailInfo">
+        update human_resources_practice_reimburse_register_detail set del_flag = '1' where register_id = #{id}
+    </update>
+
+    <select id="getChildList"
+            resultType="com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegisterDetail">
+        select
+        <include refid="Base_Column_List"></include>,
+        b.work_name as workName,
+        b.internship_days as internshipDays,
+        su.name as createName
+        from human_resources_practice_reimburse_register_detail a
+        left join human_resources_practice_registration_work_log b on a.work_log_id = b.id
+        left join sys_user su on b.create_by_id = su.id
+        where a.del_flag = '0' and a.register_id = #{id}
+    </select>
+</mapper>

+ 51 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseRegisterMapper.xml

@@ -0,0 +1,51 @@
+<?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.jeeplus.human.practice.reimburseRegister.mapper.ReimburseRegisterMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.project_manager,
+        a.bank_card_number,
+        a.remarks,
+        a.complete_practice,
+        a.all_reimbursement_amount,
+        a.reimbuser_name
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_practice_reimburse_register SET type = #{type}
+		WHERE id = #{id}
+    </update>
+    <update id="removeById">
+        update human_resources_practice_reimburse_register set del_flag = '1' where id = #{id}
+    </update>
+
+    <select id="findList" resultType="com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id,
+        su.name as createName,
+        su2.name as projectManagerName
+        from human_resources_practice_reimburse_register a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        left join sys_user su on a.create_by_id = su.id
+        left join sys_user su2 on a.project_manager = su2.id
+        ${ew.customSqlSegment}
+        ORDER BY a.create_time DESC
+    </select>
+    <select id="getById" resultType="com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id
+        from human_resources_practice_reimburse_register a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+</mapper>

+ 35 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseSubmitAccountDetailMapper.xml

@@ -0,0 +1,35 @@
+<?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.jeeplus.human.practice.reimburseRegister.mapper.ReimburseSubmitAccountDetailMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.info_id,
+        a.user_id,
+        a.user_name,
+        a.dept_id,
+        a.dept_name,
+        a.number,
+        a.receipt_number,
+        a.days,
+        a.content,
+        a.register_id,
+        a.register_name
+    </sql>
+
+    <delete id="deleteByReportId">
+        update human_resources_practice_reimburse_submit_account_detail set del_flag = '1' where info_id = #{id}
+    </delete>
+    <select id="getInfoByInfoId"
+            resultType="com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccountDetail">
+        select
+        <include refid="Base_Column_List"></include>
+        from human_resources_practice_reimburse_submit_account_detail a
+        where info_id = #{id} and a.del_flag = '0'
+    </select>
+</mapper>

+ 72 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/mapper/xml/ReimburseSubmitAccountMapper.xml

@@ -0,0 +1,72 @@
+<?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.jeeplus.human.practice.reimburseRegister.mapper.ReimburseSubmitAccountMapper">
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.type,
+        a.proc_ins_id,
+        a.process_definition_id,
+        a.operator,
+        a.operator_office,
+        a.reim_date,
+        a.remarks,
+        a.total_num,
+        a.no
+    </sql>
+    <update id="updateStatusById">
+        UPDATE human_resources_practice_reimburse_submit_account SET type = #{type}
+		WHERE id = #{id}
+    </update>
+
+    <select id="getById"
+            resultType="com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccount">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id
+        from human_resources_practice_reimburse_submit_account a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        where a.id = #{id} and a.del_flag = '0'
+    </select>
+    <select id="findList"
+            resultType="com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccount">
+        select
+        <include refid="Base_Column_List"></include>,
+        d.ID_ AS task_id
+        from human_resources_practice_reimburse_submit_account a
+        LEFT JOIN act_ru_task d ON a.proc_ins_id = d.PROC_INST_ID_
+        ${ew.customSqlSegment}
+        ORDER BY a.create_time DESC
+    </select>
+    <select id="findFileList" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
+        SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id}
+    </select>
+    <select id="findIsExit" resultType="java.lang.Integer">
+        SELECT
+			COUNT( 0 )
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+			AND attachment_name = #{name}
+    </select>
+    <select id="findFiles" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
+        SELECT
+			id,
+			url,
+			attachment_name AS `name`,
+			create_by_id AS `by`,
+			create_time
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+    </select>
+</mapper>

+ 210 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/service/ReimburseRegisterService.java

@@ -0,0 +1,210 @@
+package com.jeeplus.human.practice.reimburseRegister.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.practice.logwrite.service.RegistrationWorkLogService;
+import com.jeeplus.human.practice.register.service.RegistrationService;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegisterDetail;
+import com.jeeplus.human.practice.reimburseRegister.mapper.ReimburseRegisterDetailMapper;
+import com.jeeplus.human.practice.reimburseRegister.mapper.ReimburseRegisterMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-19 13:42
+ */
+@Service
+@Transactional
+public class ReimburseRegisterService extends ServiceImpl<ReimburseRegisterMapper, ReimburseRegister> {
+
+    @Resource
+    private ReimburseRegisterMapper registerMapper;
+
+    @Resource
+    private IFlowableApi flowTaskService;
+
+    @Resource
+    private RegistrationService registrationService;
+
+    @Resource
+    private ReimburseRegisterDetailMapper detailMapper;
+
+    @Resource
+    private RegistrationWorkLogService workLogService;
+
+    public ReimburseRegister saveReimburseRegister(ReimburseRegister registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            ReimburseRegister report = registerMapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 实习报销登记信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<ReimburseRegister> findList(Page<ReimburseRegister> page, ReimburseRegister projectReportData) throws Exception{
+        QueryWrapper<ReimburseRegister> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,ReimburseRegister.class);
+        queryWrapper.eq("a.del_flag","0");
+        if (StringUtils.isNotBlank(projectReportData.getType())){
+            queryWrapper.eq("a.type",projectReportData.getType());
+        }
+        IPage<ReimburseRegister> list = registerMapper.findList(page, queryWrapper);
+        list.getRecords().forEach(item -> {
+            // 入库 修改申请
+            if (com.jeeplus.utils.StringUtils.isNotBlank(item.getTaskId()) && com.jeeplus.utils.StringUtils.isNotBlank(item.getType())) {
+                if ("2".equals(item.getType())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditUserIds(flowTaskService.getTaskAuditUsers(item.getTaskId()));  // 获取数据审核人
+                }
+            }
+        });
+        return list;
+
+    }
+
+    public ReimburseRegister findById(String id) {
+        // 查询基础信息表
+        ReimburseRegister info = registerMapper.getById(id);
+        List<ReimburseRegisterDetail> childList = detailMapper.getChildList(id);
+        if (CollectionUtils.isNotEmpty(childList)){
+            info.setDetailList(childList);
+        }
+
+        return info;
+    }
+
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public ReimburseRegister update(ReimburseRegister reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        ReimburseRegister report = new ReimburseRegister();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        //实习日志明细数据修改操作 先根据日志id删除对应信息,再重新保存
+        detailMapper.deleteDetailInfo(report.getId());
+        if (CollectionUtils.isNotEmpty(report.getDetailList())){
+            List<ReimburseRegisterDetail> amountInfos = report.getDetailList();
+            for (ReimburseRegisterDetail amountInfo : amountInfos) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                amountInfo.setId(amountId);
+                amountInfo.setCreateById(userDTO.getId());
+                amountInfo.setCreateTime(new Date());
+                amountInfo.setUpdateById(userDTO.getId());
+                amountInfo.setUpdateTime(new Date());
+                amountInfo.setDelFlag(0);
+                // 保存基础表信息主键值
+                amountInfo.setRegisterId(report.getId());
+                if (StringUtils.isNotBlank(amountInfo.getWorkLogId())){
+                    amountInfo.setWorkLogId(amountInfo.getWorkLogId());
+                }
+                amountInfo.setReimbursementAmount(amountInfo.getReimbursementAmount());
+                detailMapper.insert(amountInfo);
+            }
+        }
+        if (StringUtils.isNotEmpty(reportData.getProcInsId())) {
+            String currentTask = flowTaskService.getCurrentTaskName(reportData.getProcInsId());
+            if(StringUtils.isNotBlank(currentTask)) {
+                if ("部门主任审核".equals(currentTask)) {
+                    report.setType("5");
+                    //根据创建人去修改实习生实习状态
+                    if (StringUtils.isNotBlank(report.getCompletePractice()) && report.getCompletePractice().equals("1")){
+                        //设置实习结束日期
+                        //查询实习工作日志的最后一天  根据创建人去查,
+                        String endTime = workLogService.getLastWorkDay(report.getCreateById());
+                        registrationService.updatePracticeStatus(report.getCreateById(),endTime);
+
+                        //系统账号冻结
+
+                    }
+                }
+            }
+        }
+
+
+        registerMapper.updateById(report);
+
+        return report;
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public ReimburseRegister add(ReimburseRegister reportData) throws Exception{
+
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        ReimburseRegister report = new ReimburseRegister();
+        BeanUtils.copyProperties(reportData, report);
+
+        String id = UUID.randomUUID().toString().replace("-", "");
+        report.setId(id);
+        if (CollectionUtils.isNotEmpty(report.getDetailList())){
+            List<ReimburseRegisterDetail> amountInfos = reportData.getDetailList();
+            for (ReimburseRegisterDetail amountInfo : amountInfos) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                amountInfo.setId(amountId);
+                amountInfo.setCreateById(userDTO.getId());
+                amountInfo.setCreateTime(new Date());
+                amountInfo.setUpdateById(userDTO.getId());
+                amountInfo.setUpdateTime(new Date());
+                amountInfo.setDelFlag(0);
+                // 保存基础表信息主键值
+                amountInfo.setRegisterId(report.getId());
+                if (StringUtils.isNotBlank(amountInfo.getWorkLogId())){
+                    amountInfo.setWorkLogId(amountInfo.getWorkLogId());
+                }
+                amountInfo.setReimbursementAmount(amountInfo.getReimbursementAmount());
+                detailMapper.insert(amountInfo);
+            }
+        }
+        registerMapper.insert(report);
+        return report;
+    }
+
+    public void updateStatusById(ReimburseRegister dto) {
+        registerMapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public String remove(String id) {
+        // 删除基础信息表
+        registerMapper.removeById(id);
+        //明细对应数据也要同步删除
+        detailMapper.deleteDetailInfo(id);
+        return "操作成功";
+    }
+}

+ 304 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/practice/reimburseRegister/service/ReimburseSubmitAccountService.java

@@ -0,0 +1,304 @@
+package com.jeeplus.human.practice.reimburseRegister.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegister;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseRegisterDetail;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccount;
+import com.jeeplus.human.practice.reimburseRegister.domain.ReimburseSubmitAccountDetail;
+import com.jeeplus.human.practice.reimburseRegister.mapper.ReimburseSubmitAccountDetailMapper;
+import com.jeeplus.human.practice.reimburseRegister.mapper.ReimburseSubmitAccountMapper;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.feign.IWorkAttachmentApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-22 13:58
+ */
+@Service
+@Transactional
+public class ReimburseSubmitAccountService extends ServiceImpl<ReimburseSubmitAccountMapper, ReimburseSubmitAccount> {
+
+    @Resource
+    private ReimburseSubmitAccountMapper accountMapper;
+
+    @Resource
+    private IFlowableApi flowTaskService;
+
+    @Resource
+    private ReimburseSubmitAccountDetailMapper accountDetailMapper;
+
+    /**
+     * 实习报销信息
+     * @param page
+     * @param projectReportData
+     * @return
+     * @throws Exception
+     */
+    public IPage<ReimburseSubmitAccount> findList(Page<ReimburseSubmitAccount> page, ReimburseSubmitAccount projectReportData) throws Exception{
+        QueryWrapper<ReimburseSubmitAccount> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,ReimburseSubmitAccount.class);
+        queryWrapper.eq("a.del_flag","0");
+        IPage<ReimburseSubmitAccount> list = accountMapper.findList(page, queryWrapper);
+        list.getRecords().forEach(item -> {
+            // 入库 修改申请
+            if (com.jeeplus.utils.StringUtils.isNotBlank(item.getTaskId()) && com.jeeplus.utils.StringUtils.isNotBlank(item.getType())) {
+                if ("2".equals(item.getType())) { // “审核中”的数据要获取数据审核人
+                    item.setAuditUserIds(flowTaskService.getTaskAuditUsers(item.getTaskId()));  // 获取数据审核人
+                }
+            }
+        });
+        return list;
+
+    }
+
+    public void updateStatusById(ReimburseSubmitAccount dto) {
+        accountMapper.updateStatusById(dto.getId(), dto.getType());
+    }
+
+    public ReimburseSubmitAccount findById(String id) {
+        // 查询基础信息表
+        ReimburseSubmitAccount info = accountMapper.getById(id);
+        List<ReimburseSubmitAccountDetail> infos = accountDetailMapper.getInfoByInfoId(id);
+        if (CollectionUtils.isNotEmpty(infos)){
+            info.setAccountDetails(infos);
+        }
+        // 查询附件信息
+        List<WorkAttachmentInfo> files = accountMapper.findFiles(id);
+        if (CollectionUtils.isNotEmpty(files)) {
+            for (WorkAttachmentInfo i : files) {
+                i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+            }
+            info.setFiles(files);
+        }
+        return info;
+    }
+
+    public String remove(String id) {
+        // 删除基础信息表
+        accountMapper.deleteById(id);
+        return "操作成功";
+    }
+
+    public ReimburseSubmitAccount saveSubmitAccount(ReimburseSubmitAccount registration) throws Exception {
+        if (StringUtils.isNotEmpty(registration.getId())){
+
+            ReimburseSubmitAccount report = accountMapper.getById(registration.getId());
+            if (report != null){
+                return update(registration);
+            }
+        }
+        return add(registration);
+    }
+
+    /**
+     * 修改
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public ReimburseSubmitAccount update(ReimburseSubmitAccount reportData) throws Exception{
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        ReimburseSubmitAccount report = new ReimburseSubmitAccount();
+        BeanUtils.copyProperties(reportData, report);
+        report.setUpdateById(userDTO.getId());
+        report.setUpdateTime(new Date());
+
+        if (StringUtils.isBlank(report.getNo())){
+            //报销编号生成
+            String serialNum = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNum(userDTO.getCompanyDTO().getId(), ReimburseSubmitAccount.BIZ_CODE, TokenProvider.getCurrentToken());
+            report.setNo(serialNum);
+        }
+
+        //保存报销明细前先删除一下
+        accountDetailMapper.deleteByReportId(report.getId());
+        if (CollectionUtils.isNotEmpty(report.getAccountDetails())){
+            List<ReimburseSubmitAccountDetail> amountInfos = report.getAccountDetails();
+            for (ReimburseSubmitAccountDetail amountInfo : amountInfos) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                amountInfo.setId(amountId);
+                amountInfo.setCreateById(userDTO.getId());
+                amountInfo.setCreateTime(new Date());
+                amountInfo.setUpdateById(userDTO.getId());
+                amountInfo.setUpdateTime(new Date());
+                amountInfo.setDelFlag(0);
+                // 保存基础表信息主键值
+                amountInfo.setInfoId(report.getId());
+                accountDetailMapper.insert(amountInfo);
+            }
+        }
+
+        // 修改附件信息列表
+        if (CollectionUtils.isNotEmpty(reportData.getFiles())) {
+            updateFiles(reportData.getFiles(), userDTO, reportData.getId());
+        }
+
+        accountMapper.updateById(report);
+
+        return report;
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public ReimburseSubmitAccount add(ReimburseSubmitAccount reportData) throws Exception{
+
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+
+        ReimburseSubmitAccount report = new ReimburseSubmitAccount();
+        BeanUtils.copyProperties(reportData, report);
+
+        //报销编号生成
+        String serialNum = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNum(userDTO.getCompanyDTO().getId(), ReimburseSubmitAccount.BIZ_CODE, TokenProvider.getCurrentToken());
+        report.setNo(serialNum);
+        String id = UUID.randomUUID().toString().replace("-", "");
+        report.setId(id);
+
+        //保存报销明细前先删除一下
+        accountDetailMapper.deleteByReportId(report.getId());
+        if (CollectionUtils.isNotEmpty(report.getAccountDetails())){
+            List<ReimburseSubmitAccountDetail> amountInfos = report.getAccountDetails();
+            for (ReimburseSubmitAccountDetail amountInfo : amountInfos) {
+                // 生成id
+                String amountId = UUID.randomUUID().toString().replace("-", "");
+                amountInfo.setId(amountId);
+                amountInfo.setCreateById(userDTO.getId());
+                amountInfo.setCreateTime(new Date());
+                amountInfo.setUpdateById(userDTO.getId());
+                amountInfo.setUpdateTime(new Date());
+                amountInfo.setDelFlag(0);
+                // 保存基础表信息主键值
+                amountInfo.setInfoId(report.getId());
+                accountDetailMapper.insert(amountInfo);
+            }
+        }
+
+        // 保存附件列表信息
+        if (CollectionUtils.isNotEmpty(reportData.getFiles())) {
+            saveFiles(reportData.getFiles(), userDTO, id);
+        }
+
+        accountMapper.insert(report);
+        return report;
+    }
+
+    /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id) {
+        int j = 1;
+        for (WorkAttachmentInfo dto : list) {
+            WorkAttachmentInfo i = new WorkAttachmentInfo();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag("submitAccount");
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+//            ossServiceMapper.insertWorkAttachment(i, userDTO);
+            Map<String,String> map = new HashMap<>();
+            String workAttachment = JSON.toJSONString((i));
+            String userDTOInfo = JSON.toJSONString((userDTO));
+            map.put("workAttachment",workAttachment);
+            map.put("userDTO",userDTOInfo);
+            SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+            j++;
+        }
+    }
+
+    /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentInfo dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachmentInfo> infoList = accountMapper.findFileList(id);
+        if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(infoList)) {
+            for (WorkAttachmentInfo i : infoList) {
+                if (!names.contains(i.getUrl())) {
+//                    ossServiceMapper.deleteById(i.getId());
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentInfo dto : list) {
+            //判断是否存在
+            Integer isExit = accountMapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachmentInfo i = new WorkAttachmentInfo();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag("submitAccount");
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                Map<String,String> map = new HashMap<>();
+                String workAttachment = JSON.toJSONString((i));
+                String userDTOInfo = JSON.toJSONString((userDTO));
+                map.put("workAttachment",workAttachment);
+                map.put("userDTO",userDTOInfo);
+                SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+//                ossServiceMapper.insertWorkAttachment(i, userDTO);
+                j++;
+            }
+        }
+    }
+}

+ 102 - 0
jeeplus-modules/jeeplus-human/src/main/resources/bootstrap.yml

@@ -0,0 +1,102 @@
+# Tomcat
+server:
+  port: 9528
+  servlet:
+    context-path:
+
+#mybatis-plus配置
+#mybatis-plus:
+#  mapper-locations:
+#    - classpath*:com/jeeplus/modules/**/*Mapper.xml
+#    - classpath:/META-INF/admin-mybatis-mappings/*.xml
+#    - classpath:/META-INF/modeler-mybatis-mappings/*.xml
+#  #实体扫描,多个package用逗号或者分号分隔
+#  typeAliasesPackage: com.jeeplus.modules.**.entity
+#  configuration-properties:
+#    prefix:
+#    boolValue: TRUE
+#    blobType: BLOB
+
+# Spring
+spring:
+  main:
+    allow-bean-definition-overriding: true
+  application:
+    # 应用名称
+    name: jeeplus-human
+  boot:
+    admin:
+      client:
+        url: http://localhost:8989
+  profiles:
+    # 环境配置
+    active: pro
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: 127.0.0.1:8848
+        # 命名空间
+        namespace: ${spring.profiles.active}
+#        username: nacos
+#        password: nacos
+      config:
+        # 配置中心地址
+        server-addr: 127.0.0.1:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application.${spring.cloud.nacos.config.file-extension}
+        # 命名空间
+        namespace: ${spring.profiles.active}
+        # username: ${spring.cloud.nacos.discovery.username}
+        # password: ${spring.cloud.nacos.discovery.password}
+    sentinel:
+      transport:
+        dashboard: 127.0.0.1:8858
+  thymeleaf:
+    prefix: classpath:/templates/
+    suffix: .html
+    mode: HTML5
+    encoding: UTF-8
+#ribbon的超时时间
+ribbon:
+  ConnectTimeout: 60000 # 连接超时时间(ms)
+  ReadTimeout: 60000 # 通信超时时间(ms)
+
+hystrix:
+  command:
+    default:
+      execution:
+        isolation:
+          thread:
+            timeoutInMillisecond: 60000 # 熔断超时时长:60000ms
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+#oss配置
+config:
+  accessory:
+    type: minIO       #local, aliyun, minIO
+    baseDir: file
+    local:
+      location: d:\\accessory
+    aliyun:
+      aliyunUrl: http://oss.gangwaninfo.com
+      aliyunDownloadUrl: http://cdn.gangwaninfo.com
+      endpoint: http://oss-cn-hangzhou.aliyuncs.com
+      accessKeyId: LTAI5tQDWoM9c1WyJNPs86rX
+      accessKeySecret: 84dDIx4edT1n78KUOqqSmDZ35pchJv
+      bucketName: xg-pg
+    minIO:
+      endpoint:
+      accessKey:
+      secretKey:
+      bucketName:
+#阿里云文件夹路径
+aliyun_directory: attachment-file/assess
+#签章阿里云文件bucketName
+qzBucketName: xg-qz

+ 631 - 0
jeeplus-modules/jeeplus-human/src/main/resources/freemarker/auditRecordFormAfterBinding.ftl

@@ -0,0 +1,631 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+		  xmlns:o="urn:schemas-microsoft-com:office:office"
+		  xmlns:x="urn:schemas-microsoft-com:office:excel"
+		  xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+		  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+		  xmlns:html="http://www.w3.org/TR/REC-html40">
+	<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+		<Author>徐滕</Author>
+		<LastAuthor>徐滕</LastAuthor>
+		<Created>2022-10-20T05:33:45Z</Created>
+		<LastSaved>2022-10-20T05:53:46Z</LastSaved>
+		<Version>16.00</Version>
+	</DocumentProperties>
+	<CustomDocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+		<ICV dt:dt="string">416D7A18A3A947CA8F5937DF8CC0B323</ICV>
+		<KSOProductBuildVer dt:dt="string">2052-11.1.0.12132</KSOProductBuildVer>
+	</CustomDocumentProperties>
+	<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+		<AllowPNG/>
+	</OfficeDocumentSettings>
+	<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+		<WindowHeight>17790</WindowHeight>
+		<WindowWidth>19200</WindowWidth>
+		<WindowTopX>32767</WindowTopX>
+		<WindowTopY>32767</WindowTopY>
+		<ProtectStructure>False</ProtectStructure>
+		<ProtectWindows>False</ProtectWindows>
+	</ExcelWorkbook>
+	<Styles>
+		<Style ss:ID="Default" ss:Name="Normal">
+			<Alignment ss:Vertical="Center"/>
+											<Borders/>
+													 <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																															<Interior/>
+																																	  <NumberFormat/>
+																																					<Protection/>
+		</Style>
+		<Style ss:ID="m1443364801392">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   </Borders>
+																																																																								 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																																																																						   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364799376">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																																																																						<Interior/>
+		</Style>
+		<Style ss:ID="m1443364799396">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364799416">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						  </Borders>
+																																																							<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																								 <Interior/>
+		</Style>
+		<Style ss:ID="m1443364799436">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   </Borders>
+																																																																								 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																																																																						   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364799456">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						  </Borders>
+																																																							<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																								 <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792656">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																													<Interior/>
+		</Style>
+		<Style ss:ID="m1443364792696">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792716">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792736">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792320">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792340">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792360">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792380">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364792400">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364791312">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364791332">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364791352">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364791372">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																													<Interior/>
+		</Style>
+		<Style ss:ID="m1443364790976">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364790996">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364791016">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																													<Interior/>
+		</Style>
+		<Style ss:ID="m1443364791056">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						  <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							</Borders>
+																																																																							  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																								   <Interior/>
+		</Style>
+		<Style ss:ID="m1443364786332">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																													<Interior/>
+		</Style>
+		<Style ss:ID="s66">
+			<Alignment ss:Vertical="Center"/>
+											<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																												 <Interior/>
+		</Style>
+		<Style ss:ID="s67">
+			<Alignment ss:Vertical="Center"/>
+											<Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																									  <Interior/>
+		</Style>
+		<Style ss:ID="s68">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																														   <Interior/>
+																																	 <NumberFormat ss:Format="yyyy&quot;年&quot;m&quot;月&quot;d&quot;日&quot;;@"/>
+		</Style>
+		<Style ss:ID="s69">
+			<Alignment ss:Horizontal="Justify" ss:Vertical="Center"/>
+																	<Borders/>
+																			 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																				  <Interior/>
+		</Style>
+		<Style ss:ID="s70">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Borders/>
+																		  <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																	<Interior/>
+																																			  <NumberFormat ss:Format="yyyy&quot;年&quot;m&quot;月&quot;d&quot;日&quot;;@"/>
+		</Style>
+		<Style ss:ID="s71">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																	  <Interior/>
+		</Style>
+		<Style ss:ID="s72">
+			<Alignment ss:Horizontal="Justify" ss:Vertical="Center"/>
+																	<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																		 <Interior/>
+		</Style>
+		<Style ss:ID="s73">
+			<Alignment ss:Vertical="Center"/>
+											<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																												 <Interior/>
+		</Style>
+		<Style ss:ID="s81">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																						 <Interior/>
+		</Style>
+		<Style ss:ID="s82">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																						 <Interior/>
+		</Style>
+		<Style ss:ID="s83">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																						<Interior/>
+		</Style>
+		<Style ss:ID="s86">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																																																																																																						  <Interior/>
+		</Style>
+		<Style ss:ID="s87">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																																																																																																						  <Interior/>
+		</Style>
+		<Style ss:ID="s89">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																										<Interior/>
+		</Style>
+		<Style ss:ID="s91">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																					  </Borders>
+																																						<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																							 <Interior/>
+		</Style>
+		<Style ss:ID="s92">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																						<Interior/>
+		</Style>
+		<Style ss:ID="s93">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders/>
+																							<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																								 <Interior/>
+		</Style>
+		<Style ss:ID="s94">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																					   </Borders>
+																																						 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																							  <Interior/>
+		</Style>
+		<Style ss:ID="s103">
+			<Alignment ss:Horizontal="Right" ss:Vertical="Center"/>
+																  <Borders/>
+																		   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																	 <Interior/>
+		</Style>
+		<Style ss:ID="s104">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Font ss:FontName="黑体" x:CharSet="134" x:Family="Modern" ss:Size="16"
+			ss:Color="#000000" ss:Bold="1"/>
+										   <Interior/>
+		</Style>
+		<Style ss:ID="s111">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																													<Interior/>
+		</Style>
+	</Styles>
+	<Worksheet ss:Name="Sheet1">
+		<Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="35" x:FullColumns="1"
+			   x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
+			<Column ss:AutoFitWidth="0" ss:Width="39"/>
+			<Column ss:AutoFitWidth="0" ss:Width="28.5"/>
+			<Column ss:AutoFitWidth="0" ss:Width="314.25"/>
+			<Column ss:AutoFitWidth="0" ss:Width="100.5" ss:Span="1"/>
+			<Row ss:AutoFitHeight="0" ss:Height="15">
+				<Cell ss:MergeAcross="4" ss:StyleID="s103"><Data ss:Type="String">索引号:G-1-6-7</Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="30">
+				<Cell ss:MergeAcross="4" ss:StyleID="s104"><Data ss:Type="String">评估报告装订后浏览审核记录表</Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:StyleID="s66"><ss:Data ss:Type="String"
+												xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																							  html:Color="#000000">项目名称:</Font></ss:Data></Cell>
+				<Cell ss:StyleID="s66"/>
+				<Cell ss:MergeAcross="2" ss:StyleID="s67"><Data ss:Type="String">${projectName}</Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:StyleID="s66"><ss:Data ss:Type="String"
+												xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																							  html:Color="#000000">评估基准日:</Font></ss:Data></Cell>
+				<Cell ss:StyleID="s66"/>
+				<Cell ss:StyleID="s68"><Data ss:Type="String">${assessBaseMessage}</Data></Cell>
+				<Cell ss:StyleID="s66"><ss:Data ss:Type="String"
+												xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																							  html:Color="#000000">项目负责人:</Font></ss:Data></Cell>
+				<Cell ss:StyleID="s67"><Data ss:Type="String">${projectMaster}</Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:StyleID="s66"><ss:Data ss:Type="String"
+												xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																							  html:Color="#000000">项目审核人:</Font></ss:Data></Cell>
+				<Cell ss:StyleID="s66"/>
+				<Cell ss:StyleID="s67"><Data ss:Type="String">${projectauditor}</Data></Cell>
+				<Cell ss:StyleID="s69"><ss:Data ss:Type="String"
+												xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																							  html:Color="#000000">审核日期:</Font></ss:Data></Cell>
+				<Cell ss:StyleID="s70"><Data ss:Type="String">${projectAuditDate}</Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:StyleID="s71"/>
+				<Cell ss:StyleID="s71"/>
+				<Cell ss:StyleID="s71"/>
+				<Cell ss:StyleID="s72"/>
+				<Cell ss:StyleID="s73"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="27">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364786332"><ss:Data ss:Type="String"
+																			  xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																															   x:CharSet="134" html:Color="#000000">一、报告、说明、明细表一致性</Font></B></ss:Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="2" ss:StyleID="s111"><ss:Data ss:Type="String"
+																	xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																													 x:CharSet="134" html:Color="#000000">审核要点</Font></B></ss:Data></Cell>
+				<Cell ss:StyleID="s81"><Data ss:Type="String">审核情况(√/×)</Data></Cell>
+				<Cell ss:StyleID="s82"><Data ss:Type="String">改正情况(√/×)</Data></Cell>
+			</Row>
+
+			<#list assessmentList as assessment>
+				<Row ss:AutoFitHeight="0" ss:Height="18">
+					<Cell ss:StyleID="s83"><Data ss:Type="Number">${assessment.serialNumber}</Data></Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="m1443364790976"><ss:Data ss:Type="String"
+																				  xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																																html:Color="#000000">${assessment.typeName}</Font></ss:Data></Cell>
+					<Cell ss:StyleID="s86"><Data ss:Type="String">${assessment.reviewComments}</Data></Cell>
+					<Cell ss:StyleID="s87"><Data ss:Type="String">${assessment.replyComments}</Data></Cell>
+				</Row>
+			</#list>
+
+
+			<Row ss:AutoFitHeight="0" ss:Height="27">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364791016"><ss:Data ss:Type="String"
+																			  xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																															   x:CharSet="134" html:Color="#000000">二、评估报告</Font></B></ss:Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="2" ss:StyleID="s111"><ss:Data ss:Type="String"
+																	xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																													 x:CharSet="134" html:Color="#000000">审核要点</Font></B></ss:Data></Cell>
+				<Cell ss:StyleID="s81"><Data ss:Type="String">审核情况(√/×)</Data></Cell>
+				<Cell ss:StyleID="s82"><Data ss:Type="String">改正情况(√/×)</Data></Cell>
+			</Row>
+
+			<#list assessmentReportList as assessmentReport>
+				<Row ss:AutoFitHeight="0" ss:Height="18">
+					<Cell ss:StyleID="s83"><Data ss:Type="Number">${assessmentReport.serialNumber}</Data></Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="m1443364791056"><ss:Data ss:Type="String"
+																				  xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																																html:Color="#000000">${assessmentReport.typeName}</Font></ss:Data></Cell>
+					<Cell ss:StyleID="s86"><Data ss:Type="String">${assessmentReport.reviewComments}</Data></Cell>
+					<Cell ss:StyleID="s87"><Data ss:Type="String">${assessmentReport.replyComments}</Data></Cell>
+				</Row>
+			</#list>
+
+
+			<Row ss:AutoFitHeight="0" ss:Height="27">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364791372"><ss:Data ss:Type="String"
+																			  xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																															   x:CharSet="134" html:Color="#000000">三、评估说明</Font></B></ss:Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="2" ss:StyleID="s111"><ss:Data ss:Type="String"
+																	xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																													 x:CharSet="134" html:Color="#000000">审核要点</Font></B></ss:Data></Cell>
+				<Cell ss:StyleID="s81"><Data ss:Type="String">审核情况(√/×)</Data></Cell>
+				<Cell ss:StyleID="s82"><Data ss:Type="String">改正情况(√/×)</Data></Cell>
+			</Row>
+
+			<#list assessmentExplainList as assessmentExplain>
+				<Row ss:AutoFitHeight="0" ss:Height="18">
+					<Cell ss:StyleID="s83"><Data ss:Type="Number">${assessmentExplain.serialNumber}</Data></Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="m1443364792320"><ss:Data ss:Type="String"
+																				  xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																																html:Color="#000000">${assessmentExplain.typeName}</Font></ss:Data></Cell>
+					<Cell ss:StyleID="s86"><Data ss:Type="String">${assessmentExplain.reviewComments}</Data></Cell>
+					<Cell ss:StyleID="s87"><Data ss:Type="String">${assessmentExplain.replyComments}</Data></Cell>
+				</Row>
+			</#list>
+
+
+			<Row ss:AutoFitHeight="0" ss:Height="27">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364792656"><ss:Data ss:Type="String"
+																			  xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																															   x:CharSet="134" html:Color="#000000">四、评估明细表</Font></B></ss:Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="2" ss:StyleID="s111"><ss:Data ss:Type="String"
+																	xmlns="http://www.w3.org/TR/REC-html40"><B><Font html:Face="宋体"
+																													 x:CharSet="134" html:Color="#000000">审核要点</Font></B></ss:Data></Cell>
+				<Cell ss:StyleID="s81"><Data ss:Type="String">审核情况(√/×)</Data></Cell>
+				<Cell ss:StyleID="s82"><Data ss:Type="String">改正情况(√/×)</Data></Cell>
+			</Row>
+
+			<#list assessmentDetailList as assessmentDetail>
+				<Row ss:AutoFitHeight="0" ss:Height="18">
+					<Cell ss:StyleID="s83"><Data ss:Type="Number">${assessmentDetail.serialNumber}</Data></Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="m1443364792320"><ss:Data ss:Type="String"
+																				  xmlns="http://www.w3.org/TR/REC-html40"><Font html:Face="宋体" x:CharSet="134"
+																																html:Color="#000000">${assessmentDetail.typeName}</Font></ss:Data></Cell>
+					<Cell ss:StyleID="s86"><Data ss:Type="String">${assessmentDetail.reviewComments}</Data></Cell>
+					<Cell ss:StyleID="s87"><Data ss:Type="String">${assessmentDetail.replyComments}</Data></Cell>
+				</Row>
+			</#list>
+
+
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:StyleID="s91"/>
+				<Cell ss:StyleID="s92"/>
+				<Cell ss:StyleID="s93"/>
+				<Cell ss:StyleID="s93"/>
+				<Cell ss:StyleID="s94"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364799416"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364799436"><ss:Data ss:Type="String"
+																			  xmlns="http://www.w3.org/TR/REC-html40"><Font html:Color="#000000">审核人员签字:${auditPersonnel}</Font><Font
+								html:Face="Arial Narrow" x:Family="Swiss" html:Color="#000000">                                                                                             </Font>
+						<Font html:Color="#000000">${correctDate}</Font></ss:Data></Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364799456"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18">
+				<Cell ss:MergeAcross="4" ss:StyleID="m1443364801392"><ss:Data ss:Type="String"
+																			  xmlns="http://www.w3.org/TR/REC-html40"><Font html:Color="#000000">改正人员签字:${correctPersonnel}</Font><Font
+								html:Face="Arial Narrow" x:Family="Swiss" html:Color="#000000">                                                                                            </Font>
+						<Font html:Color="#000000">${correctDate}</Font></ss:Data></Cell>
+			</Row>
+		</Table>
+		<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+			<Selected/>
+			<Panes>
+				<Pane>
+					<Number>3</Number>
+					<ActiveRow>16</ActiveRow>
+					<ActiveCol>6</ActiveCol>
+				</Pane>
+			</Panes>
+			<ProtectObjects>False</ProtectObjects>
+			<ProtectScenarios>False</ProtectScenarios>
+		</WorksheetOptions>
+	</Worksheet>
+</Workbook>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1978 - 0
jeeplus-modules/jeeplus-human/src/main/resources/freemarker/firstAudit.ftl


+ 807 - 0
jeeplus-modules/jeeplus-human/src/main/resources/freemarker/proofreadAudit.ftl

@@ -0,0 +1,807 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
+	<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+		<Author>徐滕</Author>
+		<LastAuthor>徐滕</LastAuthor>
+		<Created>2022-10-20T07:26:00Z</Created>
+		<LastSaved>2023-01-12T01:54:05Z</LastSaved>
+		<Version>16.00</Version>
+	</DocumentProperties>
+	<CustomDocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+		<ICV dt:dt="string">33A31C1D1F684C67A27B9367A7E4323E</ICV>
+		<KSOProductBuildVer dt:dt="string">2052-11.1.0.12132</KSOProductBuildVer>
+	</CustomDocumentProperties>
+	<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+		<AllowPNG/>
+	</OfficeDocumentSettings>
+	<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+		<WindowHeight>17940</WindowHeight>
+		<WindowWidth>32760</WindowWidth>
+		<WindowTopX>32760</WindowTopX>
+		<WindowTopY>32760</WindowTopY>
+		<ProtectStructure>False</ProtectStructure>
+		<ProtectWindows>False</ProtectWindows>
+		<DisplayInkNotes>False</DisplayInkNotes>
+	</ExcelWorkbook>
+	<Styles>
+		<Style ss:ID="Default" ss:Name="Normal">
+			<Alignment ss:Vertical="Center"/>
+											<Borders/>
+													 <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																															<Interior/>
+																																	  <NumberFormat/>
+																																					<Protection/>
+		</Style>
+		<Style ss:ID="s64">
+			<Alignment ss:Vertical="Center"/>
+											<Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																												   <Interior/>
+		</Style>
+		<Style ss:ID="s65">
+			<Alignment ss:Vertical="Center"/>
+											<Borders/>
+													 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																														  <Interior/>
+		</Style>
+		<Style ss:ID="s66">
+			<Alignment ss:Vertical="Center"/>
+											<Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																												 <Interior/>
+		</Style>
+		<Style ss:ID="s67">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Borders/>
+																		  <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																			   <Interior/>
+		</Style>
+		<Style ss:ID="s68">
+			<Alignment ss:Vertical="Center"/>
+											<Borders/>
+													 <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																															<Interior/>
+		</Style>
+		<Style ss:ID="s69">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders/>
+																			<Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																																				   <Interior/>
+		</Style>
+		<Style ss:ID="s72">
+			<Alignment ss:Vertical="Center" ss:WrapText="1"/>
+															<Borders/>
+																	 <Font ss:FontName="黑体" x:CharSet="134" x:Family="Modern" ss:Size="12" ss:Color="#000000"/>
+																																							  <Interior/>
+		</Style>
+		<Style ss:ID="s76">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Borders/>
+																		  <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																	<Interior/>
+																																			  <NumberFormat ss:Format="Long Date"/>
+		</Style>
+		<Style ss:ID="s78">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																	  <Interior/>
+		</Style>
+		<Style ss:ID="s79">
+			<Alignment ss:Vertical="Center"/>
+											<Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																									  <Interior/>
+		</Style>
+		<Style ss:ID="s81">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																		<Interior/>
+		</Style>
+		<Style ss:ID="s85">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																									<Interior/>
+		</Style>
+		<Style ss:ID="s86">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			 </Borders>
+																																																																			   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																					 <Interior/>
+		</Style>
+		<Style ss:ID="s87">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																									<Interior/>
+		</Style>
+		<Style ss:ID="s88">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																						<Interior/>
+		</Style>
+		<Style ss:ID="s90">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																																																																																			 <Interior/>
+		</Style>
+		<Style ss:ID="s91">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			 </Borders>
+																																																																			   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																																																																		 <Interior/>
+		</Style>
+		<Style ss:ID="s92">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																																																																																			 <Interior/>
+		</Style>
+		<Style ss:ID="s95">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																						 <Interior/>
+		</Style>
+		<Style ss:ID="s97">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
+																   <Borders>
+																   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																		<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																		   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																			   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																				 </Borders>
+																																																																																				   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																						 <Interior/>
+		</Style>
+		<Style ss:ID="s98">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																										<Interior/>
+		</Style>
+		<Style ss:ID="s100">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																										 <Interior/>
+		</Style>
+		<Style ss:ID="s101">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							 </Borders>
+																																																																							   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																									 <Interior/>
+		</Style>
+		<Style ss:ID="s102">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																										 <Interior/>
+		</Style>
+		<Style ss:ID="s107">
+			<Alignment ss:Horizontal="Right" ss:Vertical="Center"/>
+																  <Borders/>
+																		   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																	 <Interior/>
+		</Style>
+		<Style ss:ID="s108">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders/>
+																							<Font ss:FontName="黑体" x:CharSet="134" x:Family="Modern" ss:Size="16" ss:Color="#000000" ss:Bold="1"/>
+																																																 <Interior/>
+		</Style>
+		<Style ss:ID="s109">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																					  <Interior/>
+		</Style>
+		<Style ss:ID="s110">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																																		   <Interior/>
+		</Style>
+		<Style ss:ID="s111">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																	  <Interior/>
+																																				<NumberFormat ss:Format="Long Date"/>
+		</Style>
+		<Style ss:ID="s112">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																														   <Interior/>
+		</Style>
+		<Style ss:ID="s114">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
+																														   <Interior/>
+																																	 <NumberFormat ss:Format="yyyy&quot;年&quot;m&quot;月&quot;d&quot;日&quot;;@"/>
+		</Style>
+		<Style ss:ID="s115">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																																							   </Borders>
+																																																																																								 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																									   <Interior/>
+		</Style>
+		<Style ss:ID="s116">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																							   </Borders>
+																																																																																								 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																												  <Interior/>
+		</Style>
+		<Style ss:ID="s117">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																													<Interior/>
+		</Style>
+		<Style ss:ID="s118">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																						 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																							   </Borders>
+																																																																																								 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																									  <Interior/>
+		</Style>
+		<Style ss:ID="s119">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																							   </Borders>
+																																																																																								 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																									   <Interior/>
+		</Style>
+		<Style ss:ID="s120">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																										 <Interior/>
+		</Style>
+		<Style ss:ID="s121">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																							 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																							   </Borders>
+																																																																																								 <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
+																																																																																																									   <Interior/>
+		</Style>
+		<Style ss:ID="s122">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
+																 <Borders>
+																 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																	  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																		 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																			 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																			   </Borders>
+																																																																																				 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																					  <Interior/>
+		</Style>
+		<Style ss:ID="s123">
+			<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
+																				   <Borders>
+																				   <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																						<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						   <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							   <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																								 </Borders>
+																																																																																								   <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																										<Interior/>
+		</Style>
+		<Style ss:ID="s124">
+			<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
+																				 <Borders>
+																				 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																					  <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																						 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
+																																																																							 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
+																																																																																							   </Borders>
+																																																																																								 <Font ss:FontName="Arial Narrow" x:Family="Swiss" ss:Color="#000000"/>
+																																																																																																									  <Interior/>
+		</Style>
+		<Style ss:ID="s125">
+			<Alignment ss:Vertical="Center" ss:WrapText="1"/>
+															<Borders/>
+																	 <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
+																																			<Interior/>
+																																					  <NumberFormat/>
+																																									<Protection/>
+		</Style>
+	</Styles>
+	<Worksheet ss:Name="Sheet1">
+		<Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="80" x:FullColumns="1" x:FullRows="1" ss:StyleID="s68" ss:DefaultColumnWidth="51.75" ss:DefaultRowHeight="13.5">
+			<Column ss:StyleID="s68" ss:AutoFitWidth="0" ss:Width="32.25"/>
+			<Column ss:StyleID="s68" ss:AutoFitWidth="0" ss:Width="34.5"/>
+			<Column ss:StyleID="s68" ss:AutoFitWidth="0" ss:Width="369.75"/>
+			<Column ss:StyleID="s69" ss:AutoFitWidth="0" ss:Width="71.25" ss:Span="1"/>
+			<Column ss:Index="6" ss:StyleID="s69" ss:AutoFitWidth="0" ss:Width="76.5"/>
+			<Column ss:StyleID="s68" ss:AutoFitWidth="0" ss:Width="90.75"/>
+			<Row ss:AutoFitHeight="0" ss:Height="15" ss:StyleID="s64">
+				<Cell ss:MergeAcross="5" ss:StyleID="s107">
+					<Data ss:Type="String">索引号:G-1-6-5</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="30">
+				<Cell ss:MergeAcross="5" ss:StyleID="s108">
+					<Data ss:Type="String">资产评估项目(校对)审核记录表</Data>
+				</Cell>
+				<Cell ss:StyleID="s72"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="1" ss:StyleID="s109">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">项目名称:</Font>
+					</ss:Data>
+				</Cell>
+				<Cell ss:MergeAcross="3" ss:StyleID="s110">
+					<Data ss:Type="String">${projectName}</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="1" ss:StyleID="s111">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">评估基准日:</Font>
+					</ss:Data>
+				</Cell>
+				<Cell ss:StyleID="s76">
+					<Data ss:Type="String">${assessBaseMessage}</Data>
+				</Cell>
+				<Cell ss:StyleID="s67">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">项目负责人:</Font>
+					</ss:Data>
+				</Cell>
+				<Cell ss:MergeAcross="1" ss:StyleID="s112">
+					<Data ss:Type="String">${projectMaster}</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="1" ss:StyleID="s78">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">项目审核人</Font>
+						<Font html:Color="#000000"> </Font>
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">:</Font>
+					</ss:Data>
+				</Cell>
+				<Cell ss:StyleID="s79">
+					<Data ss:Type="String">${projectauditor}</Data>
+				</Cell>
+				<Cell ss:StyleID="s67">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">审核日期:</Font>
+					</ss:Data>
+				</Cell>
+				<Cell ss:MergeAcross="1" ss:StyleID="s114">
+					<Data ss:Type="String">${projectAuditDate}</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="9.9375" ss:StyleID="s66">
+				<Cell ss:StyleID="s78"/>
+				<Cell ss:StyleID="s78"/>
+				<Cell ss:StyleID="s78"/>
+				<Cell ss:StyleID="s81"/>
+				<Cell ss:StyleID="s81"/>
+				<Cell ss:StyleID="s81"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="26.0625" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s115">
+					<Data ss:Type="String">一、明细表</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s116">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<B>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">资产基础法</Font>
+							<Font html:Color="#000000">/</Font>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">成本法评估明细表</Font>
+						</B>
+					</ss:Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="2" ss:StyleID="s117">
+					<Data ss:Type="String">审核要点</Data>
+				</Cell>
+				<Cell ss:StyleID="s85">
+					<Data ss:Type="String">审核意见</Data>
+				</Cell>
+				<Cell ss:StyleID="s86">
+					<Data ss:Type="String">是否适用</Data>
+				</Cell>
+				<Cell ss:StyleID="s87">
+					<Data ss:Type="String">回复意见</Data>
+				</Cell>
+			</Row>
+			<#list detailedStatementList as detailedStatement>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s67">
+					<Cell ss:StyleID="s88">
+						<Data ss:Type="Number">${detailedStatement.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+
+						<Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${detailedStatement.typeName}</Font>
+						</Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${detailedStatement.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${detailedStatement.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${detailedStatement.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="26.0625" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s119">
+					<Data ss:Type="String">二、评估说明</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="2" ss:StyleID="s120">
+					<Data ss:Type="String">审核要点</Data>
+				</Cell>
+				<Cell ss:StyleID="s95">
+					<Data ss:Type="String">审核意见</Data>
+				</Cell>
+				<Cell ss:StyleID="s86">
+					<Data ss:Type="String">是否适用</Data>
+				</Cell>
+				<Cell ss:StyleID="s97">
+					<Data ss:Type="String">回复意见</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s116">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<B>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">(一)封面至评估范围 </Font>
+						</B>
+					</ss:Data>
+				</Cell>
+			</Row>
+
+			<#list assessmentInstructions1List as assessmentInstructions1>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+					<Cell ss:StyleID="s98">
+						<Data ss:Type="Number">${assessmentInstructions1.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${assessmentInstructions1.typeName}</Font>
+						</ss:Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${assessmentInstructions1.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${assessmentInstructions1.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${assessmentInstructions1.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s116">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<B>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">(二)资产核实情况总体说明</Font>
+						</B>
+					</ss:Data>
+				</Cell>
+			</Row>
+
+			<#list assessmentInstructions2List as assessmentInstructions2>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+					<Cell ss:StyleID="s98">
+						<Data ss:Type="Number">${assessmentInstructions2.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${assessmentInstructions2.typeName}</Font>
+						</ss:Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${assessmentInstructions2.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${assessmentInstructions2.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${assessmentInstructions2.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s116">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<B>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">(三)资产基础法</Font>
+							<Font html:Color="#000000">/</Font>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">成本法评估技术说明</Font>
+						</B>
+					</ss:Data>
+				</Cell>
+			</Row>
+
+			<#list assessmentInstructions3List as assessmentInstructions3>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+					<Cell ss:StyleID="s98">
+						<Data ss:Type="Number">${assessmentInstructions3.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${assessmentInstructions3.typeName}</Font>
+						</ss:Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${assessmentInstructions3.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${assessmentInstructions3.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${assessmentInstructions3.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s116">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<B>
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">(四)评估结论及分析 </Font>
+						</B>
+					</ss:Data>
+				</Cell>
+			</Row>
+
+			<#list assessmentInstructions4List as assessmentInstructions4>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+					<Cell ss:StyleID="s98">
+						<Data ss:Type="Number">${assessmentInstructions4.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${assessmentInstructions4.typeName}</Font>
+						</ss:Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${assessmentInstructions4.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${assessmentInstructions4.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${assessmentInstructions4.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s119">
+					<Data ss:Type="String">(五)关于评估有关事项的说明</Data>
+				</Cell>
+			</Row>
+
+			<#list assessmentInstructions5List as assessmentInstructions5>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+					<Cell ss:StyleID="s98">
+						<Data ss:Type="Number">${assessmentInstructions5.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${assessmentInstructions5.typeName}</Font>
+						</ss:Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${assessmentInstructions5.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${assessmentInstructions5.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${assessmentInstructions5.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="2" ss:StyleID="s121">
+					<Data ss:Type="String">(六)其他问题</Data>
+				</Cell>
+				<Cell ss:StyleID="s100"/>
+				<Cell ss:StyleID="s101"/>
+				<Cell ss:StyleID="s102"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="26.0625" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s119">
+					<Data ss:Type="String">三、评估报告</Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="2" ss:StyleID="s117">
+					<Data ss:Type="String">审核要点</Data>
+				</Cell>
+				<Cell ss:StyleID="s85">
+					<Data ss:Type="String">审核意见</Data>
+				</Cell>
+				<Cell ss:StyleID="s86">
+					<Data ss:Type="String">是否适用</Data>
+				</Cell>
+				<Cell ss:StyleID="s87">
+					<Data ss:Type="String">回复意见</Data>
+				</Cell>
+
+			</Row>
+
+			<#list assessmentReportList as assessmentReport>
+				<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+					<Cell ss:StyleID="s98">
+						<Data ss:Type="Number">${assessmentReport.serialNumber}</Data>
+					</Cell>
+					<Cell ss:MergeAcross="1" ss:StyleID="s118">
+						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+							<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">${assessmentReport.typeName}</Font>
+						</ss:Data>
+					</Cell>
+					<Cell ss:StyleID="s90">
+						<Data ss:Type="String">${assessmentReport.reviewComments}</Data>
+					</Cell>
+					<Cell ss:StyleID="s91">
+						<Data ss:Type="String">${assessmentReport.isApply}</Data>
+					</Cell>
+					<Cell ss:StyleID="s92">
+						<Data ss:Type="String">${assessmentReport.replyComments}</Data>
+					</Cell>
+				</Row>
+			</#list>
+
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s122">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">经确认,执行人员已按审核意见全部修改处理。</Font>
+					</ss:Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:MergeDown="3" ss:StyleID="s125">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Color="#000000">对下列意见保留:</Font>
+						<Font>       </Font>
+						<Font html:Color="#000000">&#10;${qualifiedOpinion}</Font>
+						<Font>       </Font>
+						<Font html:Color="#000000">&#10;                                     执行人员签字:${executor}              ${executorDate}</Font>
+					</ss:Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65" ss:Span="2"/>
+			<Row ss:Index="75" ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s123"/>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:StyleID="s124">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Face="宋体" x:CharSet="134" html:Color="#000000">经确认,执行人员已按审核意见检查并处理。</Font>
+					</ss:Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65">
+				<Cell ss:MergeAcross="5" ss:MergeDown="3" ss:StyleID="s125">
+					<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
+						<Font html:Color="#000000">对下列意见未修改:</Font>
+						<Font html:Face="Arial Narrow" x:Family="Swiss" html:Color="#000000">&#10;${notModifiedOpinion}</Font>
+						<Font html:Color="#000000">&#10;                                     审核人员签字:${executor}               ${executorDate}</Font>
+					</ss:Data>
+				</Cell>
+			</Row>
+			<Row ss:AutoFitHeight="0" ss:Height="18" ss:StyleID="s65" ss:Span="2"/>
+		</Table>
+		<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+			<Unsynced/>
+			<PageBreakZoom>60</PageBreakZoom>
+			<Selected/>
+			<Panes>
+				<Pane>
+					<Number>3</Number>
+					<ActiveRow>17</ActiveRow>
+					<ActiveCol>8</ActiveCol>
+				</Pane>
+			</Panes>
+			<ProtectObjects>False</ProtectObjects>
+			<ProtectScenarios>False</ProtectScenarios>
+		</WorksheetOptions>
+	</Worksheet>
+</Workbook>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 4317 - 0
jeeplus-modules/jeeplus-human/src/main/resources/freemarker/reportAusstellung.ftl


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1978 - 0
jeeplus-modules/jeeplus-human/src/main/resources/freemarker/secondAuditFtl.ftl


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1978 - 0
jeeplus-modules/jeeplus-human/src/main/resources/freemarker/thirdlyAudit.ftl


+ 13 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/AreaController.java

@@ -119,4 +119,17 @@ public class AreaController {
         return ResponseEntity.ok ( rootTree );
     }
 
+    /**
+     * 获取区域JSON数据。
+     *
+     * @param name 排除的ID
+     * @return
+     */
+    @ApiLog("获取所有区域数据")
+    @GetMapping("getAllArea")
+    public ResponseEntity <List <Area>> getAllArea(@RequestParam(required = false) String name) {
+        List <Area> rootTree = areaService.getAllArea ( name );
+        return ResponseEntity.ok ( rootTree );
+    }
+
 }

+ 7 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/feign/UserApiImpl.java

@@ -52,6 +52,13 @@ public class UserApiImpl implements IUserApi {
         userService.updateById ( UserWrapper.INSTANCE.toEntity ( userDTO ) );
     }
 
+    @Override
+    public void deleteById(String id) {
+        UserDTO dto = new UserDTO();
+        dto.setId(id);
+        userService.deleteUser(dto);
+    }
+
 
     @Override
     public void clearCache(UserDTO userDTO) {

+ 3 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/AreaMapper.java

@@ -6,6 +6,8 @@ package com.jeeplus.sys.mapper;
 import com.jeeplus.core.domain.TreeMapper;
 import com.jeeplus.sys.domain.Area;
 
+import java.util.List;
+
 /**
  * 区域MAPPER接口
  *
@@ -14,4 +16,5 @@ import com.jeeplus.sys.domain.Area;
  */
 public interface AreaMapper extends TreeMapper <Area> {
 
+    List<Area> getAllArea();
 }

+ 7 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/AreaMapper.xml

@@ -2,4 +2,11 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.jeeplus.sys.mapper.AreaMapper">
 
+    <select id="getAllArea" resultType="com.jeeplus.sys.domain.Area">
+        select id,parent_id,parent_ids,name,sort,code,type,create_by_id,create_time,update_by_id,update_time,remarks
+        from sys_area where del_flag = '0'
+        <if test="name != null and name != ''">
+            and name LIKE CONCAT ('%', #{name}, '%')
+        </if>
+    </select>
 </mapper>

+ 7 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/AreaService.java

@@ -12,6 +12,7 @@ import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -24,6 +25,9 @@ import java.util.List;
 @Transactional
 public class AreaService extends TreeService <AreaMapper, Area> {
 
+    @Resource
+    private AreaMapper mapper;
+
     @Cacheable(cacheNames = CacheNames.SYS_CACHE_AREA_LIST)
     public List <Area> findAll() {
         return super.list ( );
@@ -39,4 +43,7 @@ public class AreaService extends TreeService <AreaMapper, Area> {
         return super.removeWithChildrenById ( id );
     }
 
+    public List<Area> getAllArea(String name){
+        return mapper.getAllArea();
+    }
 }

+ 49 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/RegistrationInfo.java

@@ -0,0 +1,49 @@
+package com.jeeplus.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 实习人员登记表
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-13 11:00
+ */
+@Data
+public class RegistrationInfo extends BaseEntity {
+    private String name;                //姓名
+    private String sex;                 //性别
+    private String idCard;              //身份证号码
+    private String nativePlace;         //出生地
+    private String nation;              //民族
+    private String politicalOutlook;    //政治面貌
+    private String graduatedFrom;       //毕业院校
+    private String speciality;          //专业
+    private String mobilePhone;         //联系电话
+    private String qqNum;               //QQ
+    private String type;                //流程状态
+    private String procInsId;
+    private String processDefinitionId;
+    private String practiceStatus;      //实习状态
+    private String userId;              //用户id
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String practiceCompleteDay; //实习结束时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String practiceStartDay;    //实习开始时间
+    private String practiceOffice;    //实习部门
+    private String practiceUnitName;    //实习单位名称
+    private String projectManager;      //项目经理
+    private String remarks;      //备注
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private String lastWorkLogDay;  //最后一次实习日志填写时间
+    //日志名称
+    private String workName;
+}

+ 14 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/HumanFeignApi.java

@@ -0,0 +1,14 @@
+package com.xxl.job.executor.feign;
+
+import com.jeeplus.common.constant.AppNameConstants;
+import com.jeeplus.flowable.feign.IHumanApi;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-21 9:24
+ */
+@FeignClient(contextId = "humanFeignApi", name = AppNameConstants.APP_HUMAN_MODULES)
+public interface HumanFeignApi extends IHumanApi {
+}

+ 14 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/TenantFeignApi.java

@@ -0,0 +1,14 @@
+package com.xxl.job.executor.feign;
+
+import com.jeeplus.common.constant.AppNameConstants;
+import com.jeeplus.sys.feign.ITenantApi;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-09-21 10:20
+ */
+@FeignClient(contextId = "tenantFeignApi", name = AppNameConstants.APP_SYSTEM_SERVICE)
+public interface TenantFeignApi extends ITenantApi {
+}

+ 92 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

@@ -5,13 +5,16 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.jeeplus.domain.MyNoticeList;
 import com.jeeplus.domain.ProgramProjectListInfo;
+import com.jeeplus.domain.RegistrationInfo;
 import com.jeeplus.flowable.feign.IAssessApi;
 import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.sys.feign.ITenantApi;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import com.xxl.job.executor.feign.AssessFeignApi;
+import com.xxl.job.executor.feign.HumanFeignApi;
 import com.xxl.job.executor.feign.UserFeignApi;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -58,6 +61,95 @@ public class SampleXxlJob {
     }
 
     /**
+     * 4、冻结账号发送短信(Bean模式)
+     */
+    @XxlJob("freezeAccount")
+    public void freezeAccount() throws Exception {
+        //每天晚上十二点查询实习生的实习状态为结束,并且报销登记流程走完的实习生用户信息
+        String json = SpringUtil.getBean ( HumanFeignApi.class ).getTimeOutReimburseRegisters();
+        List<RegistrationInfo> infos = JSON.parseObject(json, new TypeReference<List<RegistrationInfo>>() {});
+        //如果没删除则删除
+        for (RegistrationInfo info : infos){
+            SpringUtil.getBean(IUserApi.class).deleteById(info.getUserId());
+        }
+
+    }
+
+    /**
+     * 3、检查超过一定期限未提交实习日志且为【实习状态的】实习生信息 发送通知给杨娟(Bean模式)
+     */
+    @XxlJob("timeOutRegisters")
+    public void timeOutRegisters() throws Exception {
+        //
+        String json = SpringUtil.getBean ( HumanFeignApi.class ).getTimeOutRegisters();
+        List<RegistrationInfo> infos = JSON.parseObject(json, new TypeReference<List<RegistrationInfo>>() {});
+
+        for (RegistrationInfo info : infos) {
+            //对数据进行发送通知
+            String taskName = null;
+            String titleStr = null;
+
+            taskName = "实习日志超时提醒";
+            titleStr = "实习生-"+ info.getName()+"已超过3天未发起日志填写。";
+
+
+            Set<String> noticeUserSet = new HashSet<String>();
+
+            noticeUserSet.add("1603618333764468738");
+            List<String> noticeUserList = new ArrayList<String>(noticeUserSet);
+            if(noticeUserList.size()>0){
+                MyNoticeList myNotice = new MyNoticeList();
+                myNotice.setCreateById("1");
+                myNotice.setCreateTime(new Date());
+                myNotice.setUpdateById("1");
+                myNotice.setUpdateTime(new Date());
+                myNotice.setDelFlag(0);
+                //根据procInsId获取taskId
+                String currentTask = SpringUtil.getBean(IFlowableApi.class).getTaskIdByprocInstId(info.getProcInsId());
+                myNotice.setTaskId(currentTask);
+                myNotice.setDefId(info.getId());
+                myNotice.setTitle(titleStr);
+                myNotice.setTaskName(taskName);
+                myNotice.setLink("结束");
+                myNotice.setType("0");
+                myNotice.setCreateUser("管理员");
+                myNotice.setCreateTime(new Date());
+
+                for (String noticeUserId : noticeUserList) {
+                    myNotice.setNoticeId(noticeUserId);
+                    String byIdForXXL = SpringUtil.getBean(IUserApi.class).getByIdForXXL(info.getCreateById());
+                    UserDTO createUser = JSON.parseObject(byIdForXXL, new TypeReference<UserDTO>() {});
+                    myNotice.setNoticeName(createUser.getName());
+                    //根据taskName和通知人 查询重复数量
+                    String myNoticeInfo = JSON.toJSONString(myNotice);
+                    Map<String,String> map = new HashMap();
+                    map.put("myNoticeInfo", myNoticeInfo);
+                    String jsonInfo = SpringUtil.getBean(IFlowableApi.class).getRepetitionCountBymyNoticeTitle(map);
+                    MyNoticeList repetitionCountBymyNotice = JSON.parseObject(jsonInfo, new TypeReference<MyNoticeList>() {});
+
+                    if(null == repetitionCountBymyNotice){
+                        // 生成id
+                        String id = UUID.randomUUID().toString().replace("-", "");
+                        myNotice.setId(id);
+                        myNotice.setRepetitionCount(0);
+
+                        myNoticeInfo = JSON.toJSONString(myNotice);
+                        map.put("myNoticeInfo", myNoticeInfo);
+                        SpringUtil.getBean ( IFlowableApi.class ).insertMyNotice(map);
+                    }else{
+                        myNotice.setId(repetitionCountBymyNotice.getId());
+                        myNotice.setRepetitionCount(repetitionCountBymyNotice.getRepetitionCount()+1);
+
+                        myNoticeInfo = JSON.toJSONString(myNotice);
+                        map.put("myNoticeInfo", myNoticeInfo);
+                        SpringUtil.getBean ( IFlowableApi.class ).updateMyNotice(map);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
      * 1、简单任务示例(Bean模式)
      */
     @XxlJob("projectArchiveTask")

+ 1 - 0
jeeplus-modules/pom.xml

@@ -26,6 +26,7 @@
         <module>jeeplus-assess</module>
         <module>jeeplus-public-modules</module>
         <module>jeeplus-centrecareful</module>
+        <module>jeeplus-human</module>
     </modules>
 
 </project>

BIN
门禁卡开通注意事项.doc