Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/main/java/com/loan/system/controller/wechat/UploadController.java
#	src/main/java/com/loan/system/controller/wechat/UserController.java
#	src/main/java/com/loan/system/domain/dto/DocumentDTO.java
#	src/main/java/com/loan/system/domain/dto/UserLoginDTO.java
#	src/main/java/com/loan/system/domain/entity/DisbursementRecord.java
#	src/main/java/com/loan/system/domain/entity/LoanCase.java
#	src/main/java/com/loan/system/domain/enums/ExceptionEnum.java
#	src/main/java/com/loan/system/domain/enums/StepPropertyEnum.java
#	src/main/java/com/loan/system/domain/vo/DocumentVO.java
#	src/main/java/com/loan/system/domain/vo/LoanCasePreApprovalVo.java
#	src/main/java/com/loan/system/domain/vo/UserLoginVO.java
#	src/main/java/com/loan/system/interceptor/JwtTokenUserInterceptor.java
#	src/main/java/com/loan/system/repository/CustomerRepository.java
#	src/main/java/com/loan/system/repository/DocumentRepository.java
#	src/main/java/com/loan/system/repository/StepRepository.java
#	src/main/java/com/loan/system/repository/UserRepository.java
#	src/main/java/com/loan/system/service/ApprovalService.java
#	src/main/java/com/loan/system/service/CustomerService.java
#	src/main/java/com/loan/system/service/DocumentService.java
#	src/main/java/com/loan/system/service/Impl/ApprovalServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/CustomerServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/DocumentServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/PermissionService.java
#	src/main/java/com/loan/system/service/Impl/StepServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/UserServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/WxServiceImpl.java
#	src/main/java/com/loan/system/service/StepService.java
#	src/main/java/com/loan/system/service/UserService.java
#	src/main/java/com/loan/system/service/WxService.java
#	src/main/resources/application-dev.yaml
#	src/main/resources/application.yaml
DESKTOP-2HCHTFV\Xu 5 mesi fa
parent
commit
6d8b8555f2
100 ha cambiato i file con 3433 aggiunte e 1183 eliminazioni
  1. 37 0
      pom.xml
  2. 1 1
      src/main/java/com/loan/system/config/WebMvcConfiguration.java
  3. 393 0
      src/main/java/com/loan/system/controller/wechat/ApprovalController.java
  4. 109 0
      src/main/java/com/loan/system/controller/wechat/ContractController.java
  5. 43 0
      src/main/java/com/loan/system/controller/wechat/DictionaryController.java
  6. 149 0
      src/main/java/com/loan/system/controller/wechat/DisbursementController.java
  7. 246 0
      src/main/java/com/loan/system/controller/wechat/LoanController.java
  8. 11 0
      src/main/java/com/loan/system/controller/wechat/RepaymentController.java
  9. 24 0
      src/main/java/com/loan/system/controller/wechat/StepController.java
  10. 52 11
      src/main/java/com/loan/system/controller/wechat/UploadController.java
  11. 199 129
      src/main/java/com/loan/system/controller/wechat/UserController.java
  12. 24 0
      src/main/java/com/loan/system/domain/dto/ApprovalRecordDTO.java
  13. 25 0
      src/main/java/com/loan/system/domain/dto/CollateralDTO.java
  14. 26 0
      src/main/java/com/loan/system/domain/dto/ContractDTO.java
  15. 21 0
      src/main/java/com/loan/system/domain/dto/CustomersOtherDTO.java
  16. 28 0
      src/main/java/com/loan/system/domain/dto/DisbursementDTO.java
  17. 25 0
      src/main/java/com/loan/system/domain/dto/DisbursementRecordDTO.java
  18. 1 0
      src/main/java/com/loan/system/domain/dto/DocumentDTO.java
  19. 39 0
      src/main/java/com/loan/system/domain/dto/LoanCaseDTO.java
  20. 9 2
      src/main/java/com/loan/system/domain/dto/UserLoginDTO.java
  21. 39 0
      src/main/java/com/loan/system/domain/entity/ContractAndCollateral.java
  22. 32 0
      src/main/java/com/loan/system/domain/entity/ContractSeq.java
  23. 3 0
      src/main/java/com/loan/system/domain/entity/CustomersOther.java
  24. 2 2
      src/main/java/com/loan/system/domain/entity/Disbursement.java
  25. 10 0
      src/main/java/com/loan/system/domain/entity/DisbursementRecord.java
  26. 0 6
      src/main/java/com/loan/system/domain/entity/LoanCase.java
  27. 26 0
      src/main/java/com/loan/system/domain/enums/BusinessAttrEnum.java
  28. 3 3
      src/main/java/com/loan/system/domain/enums/ExceptionEnum.java
  29. 1 1
      src/main/java/com/loan/system/domain/enums/StepPropertyEnum.java
  30. 4 0
      src/main/java/com/loan/system/domain/pojo/ContractInformation.java
  31. 16 0
      src/main/java/com/loan/system/domain/pojo/TemplateMessage.java
  32. 22 0
      src/main/java/com/loan/system/domain/vo/ApprovalRecordVO.java
  33. 25 0
      src/main/java/com/loan/system/domain/vo/CollateralVO.java
  34. 28 0
      src/main/java/com/loan/system/domain/vo/ContractVO.java
  35. 23 0
      src/main/java/com/loan/system/domain/vo/CustomerVO.java
  36. 18 0
      src/main/java/com/loan/system/domain/vo/CustomersOtherVO.java
  37. 28 0
      src/main/java/com/loan/system/domain/vo/DisbursementVO.java
  38. 1 3
      src/main/java/com/loan/system/domain/vo/DocumentVO.java
  39. 1 2
      src/main/java/com/loan/system/domain/vo/LoanCasePreApprovalVo.java
  40. 41 0
      src/main/java/com/loan/system/domain/vo/LoanCaseVO.java
  41. 4 4
      src/main/java/com/loan/system/domain/vo/UserLoginVO.java
  42. 3 1
      src/main/java/com/loan/system/exception/FileException.java
  43. 2 5
      src/main/java/com/loan/system/interceptor/JwtTokenUserInterceptor.java
  44. 3 3
      src/main/java/com/loan/system/json/JacksonObjectMapper.java
  45. 5 3
      src/main/java/com/loan/system/loan_system.sql
  46. 10 8
      src/main/java/com/loan/system/properties/WeChatProperties.java
  47. 27 0
      src/main/java/com/loan/system/repository/ApproveRecordRepository.java
  48. 46 0
      src/main/java/com/loan/system/repository/CollateralRepository.java
  49. 25 0
      src/main/java/com/loan/system/repository/ContractAndCollateralRepository.java
  50. 64 0
      src/main/java/com/loan/system/repository/ContractRepository.java
  51. 26 0
      src/main/java/com/loan/system/repository/ContractSeqRepository.java
  52. 43 0
      src/main/java/com/loan/system/repository/CustomerOtherRepository.java
  53. 25 12
      src/main/java/com/loan/system/repository/CustomerRepository.java
  54. 15 0
      src/main/java/com/loan/system/repository/DictAttributeRepository.java
  55. 15 0
      src/main/java/com/loan/system/repository/DictChannelRepository.java
  56. 16 0
      src/main/java/com/loan/system/repository/DictLocationRepository.java
  57. 16 0
      src/main/java/com/loan/system/repository/DictStepRepository.java
  58. 17 0
      src/main/java/com/loan/system/repository/DictTypeRepository.java
  59. 19 0
      src/main/java/com/loan/system/repository/DisbursementRepository.java
  60. 30 3
      src/main/java/com/loan/system/repository/DocumentRepository.java
  61. 48 0
      src/main/java/com/loan/system/repository/LoanRepository.java
  62. 16 0
      src/main/java/com/loan/system/repository/RecommenderRepository.java
  63. 15 0
      src/main/java/com/loan/system/repository/RoleRepository.java
  64. 13 9
      src/main/java/com/loan/system/repository/StepRepository.java
  65. 15 0
      src/main/java/com/loan/system/repository/UploadRepository.java
  66. 12 1
      src/main/java/com/loan/system/repository/UserRepository.java
  67. 7 2
      src/main/java/com/loan/system/service/ApprovalService.java
  68. 19 0
      src/main/java/com/loan/system/service/CollateralService.java
  69. 13 0
      src/main/java/com/loan/system/service/ContractAndCollateralService.java
  70. 11 0
      src/main/java/com/loan/system/service/ContractSeqService.java
  71. 27 0
      src/main/java/com/loan/system/service/ContractService.java
  72. 22 0
      src/main/java/com/loan/system/service/CustomerOtherService.java
  73. 21 2
      src/main/java/com/loan/system/service/CustomerService.java
  74. 16 0
      src/main/java/com/loan/system/service/DictionaryService.java
  75. 11 0
      src/main/java/com/loan/system/service/DisbursementService.java
  76. 7 1
      src/main/java/com/loan/system/service/DocumentService.java
  77. 44 11
      src/main/java/com/loan/system/service/Impl/ApprovalServiceImpl.java
  78. 55 0
      src/main/java/com/loan/system/service/Impl/CollateralServiceImpl.java
  79. 40 0
      src/main/java/com/loan/system/service/Impl/ContractAndCollateralServiceImpl.java
  80. 31 0
      src/main/java/com/loan/system/service/Impl/ContractSeqServiceImpl.java
  81. 87 0
      src/main/java/com/loan/system/service/Impl/ContractServiceImpl.java
  82. 55 0
      src/main/java/com/loan/system/service/Impl/CustomerOtherServiceImpl.java
  83. 40 7
      src/main/java/com/loan/system/service/Impl/CustomerServiceImpl.java
  84. 50 0
      src/main/java/com/loan/system/service/Impl/DictionaryServiceImpl.java
  85. 41 0
      src/main/java/com/loan/system/service/Impl/DisbursementServiceImpl.java
  86. 23 4
      src/main/java/com/loan/system/service/Impl/DocumentServiceImpl.java
  87. 141 0
      src/main/java/com/loan/system/service/Impl/LoanServiceImpl.java
  88. 0 2
      src/main/java/com/loan/system/service/Impl/PermissionService.java
  89. 7 12
      src/main/java/com/loan/system/service/Impl/StepServiceImpl.java
  90. 92 31
      src/main/java/com/loan/system/service/Impl/UserServiceImpl.java
  91. 15 10
      src/main/java/com/loan/system/service/Impl/WxServiceImpl.java
  92. 23 0
      src/main/java/com/loan/system/service/LoanService.java
  93. 1 5
      src/main/java/com/loan/system/service/StepService.java
  94. 18 2
      src/main/java/com/loan/system/service/UserService.java
  95. 1 1
      src/main/java/com/loan/system/service/WxService.java
  96. 0 376
      src/main/java/com/loan/system/utils/ExcelUtil.java
  97. 0 489
      src/main/java/com/loan/system/utils/FileUploadUtil.java
  98. 179 0
      src/main/java/com/loan/system/utils/HttpClientUtil.java
  99. 21 19
      src/main/java/com/loan/system/utils/PoiWordUtil.java
  100. BIN
      test/project--1/contracts/contract-12/1f64604893ced5c46fa6163ac47fd884.xlsx

+ 37 - 0
pom.xml

@@ -75,6 +75,43 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.10.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20231013</version> <!-- 使用最新版本 -->
+        </dependency>
+
+
+        <!-- Apache POI 最新稳定版 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.16</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.16</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>

+ 1 - 1
src/main/java/com/loan/system/config/WebMvcConfiguration.java

@@ -101,7 +101,7 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport {
     protected void addResourceHandlers(ResourceHandlerRegistry registry) {
         log.info("设置静态资源映射");
         registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
-        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        registry.addResourceHandler("/files/**").addResourceLocations("classpath:/META-INF/resources/file_store/");
     }
 
     /*

+ 393 - 0
src/main/java/com/loan/system/controller/wechat/ApprovalController.java

@@ -0,0 +1,393 @@
+package com.loan.system.controller.wechat;
+
+import com.loan.system.domain.dto.ApprovalDTO;
+import com.loan.system.domain.dto.PreApprovalDTO;
+import com.loan.system.domain.entity.*;
+import com.loan.system.domain.enums.DecisionEnum;
+import com.loan.system.domain.enums.StepEnum;
+import com.loan.system.domain.enums.StepPropertyEnum;
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.domain.vo.*;
+import com.loan.system.properties.JwtProperties;
+import com.loan.system.service.*;
+import com.loan.system.service.Impl.UserServiceImpl;
+import com.loan.system.utils.JwtUtil;
+import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+import static com.loan.system.domain.enums.ExceptionEnum.*;
+
+@RestController
+@RequestMapping("/wechat/")
+@Api(tags = "业务审核接口")
+public class ApprovalController {
+    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private LoanService loanCaseService;
+    @Autowired
+    private ApprovalService approvalService;
+    @Autowired
+    private DocumentService documentService;
+    @Autowired
+    private StepService stepService;
+    @Autowired
+    private JwtProperties jwtProperties;
+//    @Autowired
+//    private WxService wxService;
+
+    @GetMapping("/loan_case/{id}")
+    @ApiOperation("获取业务客户信息")
+    //TODO:给前端展示的VO补充完整
+    public Result info(@PathVariable Long id) {
+        log.info("获取业务客户信息: {}", id);
+        LoanCaseVO loanCase = loanCaseService.findLoanCaseByIdAndIsDelete(id,false);
+        CustomerVO customer = customerService.findByCustomerIdAndIsDelete(loanCase.getCustomer().getId(), false);
+        StepVO step = stepService.findByStepNameAndCaseId(StepPropertyEnum.PRE_TRIAL.getLabel(),id);
+        //List<Document> documentList = documentService.findDocumentByCaseIdAndIsDelete(customer.getId());
+        User user1= userService.findByIdAndIsDelete(step.getUserId1());
+        User user2= userService.findByIdAndIsDelete(step.getUserId2());
+        LoanCasePreApprovalVo loanCasePreApprovalVo = new LoanCasePreApprovalVo();
+        if(user1!=null){
+            loanCasePreApprovalVo.setLead_Sales(user1.getRealName());
+        }
+        if(user2!=null){
+            loanCasePreApprovalVo.setAssist_Sales(user2.getRealName());
+        }
+        //TODO 补充业务信息、客户信息
+
+
+        return ResultUtil.success("success",loanCasePreApprovalVo);
+    }
+    @PostMapping("/preapproval-assist/{caseId}/pass")
+    @PreAuthorize("@pms.hasRole('ASSIST_SALES')")
+    @ApiOperation("副业务员审核")
+    public Result pre_approval_save_primary(PreApprovalDTO preApprovalDTO, HttpServletRequest request) {
+        //请求头根据token获取用户信息
+        //String token = request.getHeader("Authorization").substring(7); // 去掉"Bearer "前缀
+        String token = request.getHeader("Authorization");
+        Long userId=Long.parseLong(JwtUtil.parseJWT(jwtProperties.getUserSecretKey(),token).get("userId").toString());
+        log.info("用户id: {}", userId);
+        User user = userService.findByIdAndIsDelete(userId);
+        log.info("用户: {}", user.getMobile());
+        LoanCaseVO loanCase = loanCaseService.findLoanCaseByIdAndIsDelete(preApprovalDTO.getCaseId(),false);
+        if(loanCase == null||loanCase.getIsDelete()){
+            return ResultUtil.error(PROJECT_NOT_EXIST.getCode(), PROJECT_NOT_EXIST.getMsg());
+        }
+        StepVO step = stepService.findByStepNameAndCaseId(StepPropertyEnum.PRE_TRIAL.getLabel(), preApprovalDTO.getCaseId());
+        if(step.getUserId2()!=null&&userId!=step.getUserId2()){
+            return ResultUtil.error(STEP_USER_NOT_EXPECTED.getCode(), "环节处理人不是预期用户");
+        }
+        if(step.getStatus()==StepEnum.COMPLETED.getMsg()){
+            return ResultUtil.error(STEP_HAS_COMPLETEED.getCode(), "环节已完成,无法重复审批");
+        }
+        ApprovalRecordVO approvalRecord_origin = approvalService.findByCaseIdAndIsDeleteAndStepName(preApprovalDTO.getCaseId(),StepPropertyEnum.PRE_TRIAL.getLabel(),userId);
+        if (approvalRecord_origin == null) {
+            // 创建审批记录
+            ApprovalRecord approvalRecord = new ApprovalRecord();
+            approvalRecord.setCaseId(preApprovalDTO.getCaseId());
+            approvalRecord.setStepName(StepPropertyEnum.PRE_TRIAL.getLabel());
+            approvalRecord.setApproverId(user.getId());
+            approvalRecord.setDecision(DecisionEnum.PASS.getMsg());
+            approvalRecord.setComments(preApprovalDTO.getComments());
+            approvalRecord.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setIsDelete(false);
+            // 保存到数据库
+            approvalService.save(approvalRecord);
+            stepService.updateUserId2ByCaseIdAndStepName(StepPropertyEnum.PRE_TRIAL.getLabel(), user.getId(), preApprovalDTO.getCaseId());
+        }else {
+            approvalService.updateDecisionByCaseIdAndStepNameAndIsDelete(DecisionEnum.PASS.getMsg(), preApprovalDTO.getCaseId(), StepPropertyEnum.PRE_TRIAL.getLabel(), preApprovalDTO.getComments(), userId);
+        }
+        stepService.updateUserId2ByCaseIdAndStepName(StepPropertyEnum.PRE_TRIAL.getLabel(),userId,preApprovalDTO.getCaseId());
+        //更新步骤状态
+        stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(), StepPropertyEnum.PRE_TRIAL_PARENT.getLabel(), preApprovalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(), StepPropertyEnum.PRE_TRIAL.getLabel(), preApprovalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(), StepPropertyEnum.APPROVAL_PARENT.getLabel(), preApprovalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(), StepPropertyEnum.APPROVAL.getLabel(), preApprovalDTO.getCaseId());
+        loanCaseService.updateUpdatetimeByIdAndIsDeleted(preApprovalDTO.getCaseId(),false);
+        //TODO:微信推送预审通过消息和通知下一环节
+//        wxService.sendTemplateMessage(loanCase.getCustomer().getMobile(),new TemplateMessage());
+        return ResultUtil.success("success","预审通过");
+    }
+
+//    @PostMapping("/approval-lead/{caseId}/pass")
+//    @PreAuthorize("@pms.hasRole('LEAD_SALES')")
+//    @ApiOperation("主业务员审核")
+//    public Result pre_approval_save_assist(PreApprovalDTO preApprovalDTO, HttpServletRequest request) {
+//        //请求头根据token获取用户信息
+//        //String token = request.getHeader("Authorization").substring(7); // 去掉"Bearer "前缀
+//        String token = request.getHeader("Authorization");
+//        Long userId=Long.parseLong(JwtUtil.parseJWT(jwtProperties.getUserSecretKey(),token).get("userId").toString());
+//        log.info("用户id: {}", userId);
+//        User user = userService.findByIdAndIsDelete(userId);
+//        log.info("用户: {}", user.getMobile());
+//        LoanCase loanCase = loanCaseService.findByIdAndIsDelete(preApprovalDTO.getCaseId());
+//        if(loanCase == null){
+//            return ResultUtil.error(PROJECT_NOT_EXIST.getCode(), PROJECT_NOT_EXIST.getMsg());
+//        }
+//        // TODO: 使用userId进行后续操作
+//        // 创建新的审批记录
+//        ApprovalRecord approvalRecord = new ApprovalRecord();
+//        approvalRecord.setCaseId(preApprovalDTO.getCaseId());
+//        approvalRecord.setStepName(StepPropertyEnum.PRE_TRIAL.getLabel());
+//        approvalRecord.setApproverId(userId);
+//        approvalRecord.setDecision(DecisionEnum.PASS.getMsg());
+//        approvalRecord.setComments(preApprovalDTO.getComments());
+//        approvalRecord.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        approvalRecord.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        approvalRecord.setIsDelete(false);
+//        // 保存到数据库
+//        approvalService.save(approvalRecord);
+//        stepService.updateUserId1ByCaseIdAndStepName(StepPropertyEnum.PRE_TRIAL.getLabel(),userId,preApprovalDTO.getCaseId());
+//        Step step = stepService.findByStepNameAndCaseId(StepPropertyEnum.PRE_TRIAL.getLabel(),preApprovalDTO.getCaseId());
+//        if(step.getUserId1()!=null && step.getUserId2()!=null){
+//            stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(), StepPropertyEnum.PRE_TRIAL_PARENT.getLabel(),preApprovalDTO.getCaseId());
+//            stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(), StepPropertyEnum.PRE_TRIAL.getLabel(),preApprovalDTO.getCaseId());
+//            stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(), StepPropertyEnum.APPROVAL_PARENT.getLabel(),preApprovalDTO.getCaseId());
+//            stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(), StepPropertyEnum.APPROVAL.getLabel(),preApprovalDTO.getCaseId());
+//            //TODO: 添加业务逻辑 ,通知下一个环节审批人
+//        }
+//        log.info("业务id: {}", preApprovalDTO.getCaseId());
+//        loanCaseService.updateUpdatetimeByIdAndIsDeleted(preApprovalDTO.getCaseId(),false);
+//        return ResultUtil.success("success","审批通过");
+//    }
+
+    @PostMapping("/preapproval-records/{caseId}/reject")
+    @PreAuthorize("@pms.hasAnyRoles('LEAD_SALES','ASSIST_SALES')")
+    @ApiOperation("业务预审拒绝")
+    public Result pre_approval_reject(PreApprovalDTO preApprovalDTO, HttpServletRequest request) {
+        //请求头根据token获取用户信息
+        //String token = request.getHeader("Authorization").substring(7); // 去掉"Bearer "前缀
+        String token = request.getHeader("Authorization");
+        Long userId=Long.parseLong(JwtUtil.parseJWT(jwtProperties.getUserSecretKey(),token).get("userId").toString());
+        log.info("用户id: {}", userId);
+        User user = userService.findByIdAndIsDelete(userId);
+        log.info("用户: {}", user.getMobile());
+        LoanCaseVO loanCase = loanCaseService.findLoanCaseByIdAndIsDelete(preApprovalDTO.getCaseId(),false);
+        StepVO step = stepService.findByStepNameAndCaseId(StepPropertyEnum.PRE_TRIAL.getLabel(), preApprovalDTO.getCaseId());
+        //判断过去处理人与目前处理人是否一致
+        if(step.getUserId2()!=null&&userId!=step.getUserId2()){
+            return ResultUtil.error(STEP_USER_NOT_EXPECTED.getCode(), "环节处理人不是预期用户");
+        }
+        if(step.getStatus()==StepEnum.COMPLETED.getMsg()){
+            return ResultUtil.error(STEP_HAS_COMPLETEED.getCode(), "环节已完成,无法重复审批");
+        }
+        if(loanCase == null||loanCase.getIsDelete()){
+            return ResultUtil.error(PROJECT_NOT_EXIST.getCode(), PROJECT_NOT_EXIST.getMsg());
+        }
+        ApprovalRecordVO approvalRecord_origin = approvalService.findByCaseIdAndIsDeleteAndStepName(preApprovalDTO.getCaseId(),StepPropertyEnum.PRE_TRIAL.getLabel(),userId);
+        if(approvalRecord_origin == null) {
+            log.info("没找到对应以前审批记录");
+            // 创建审批记录
+            ApprovalRecord approvalRecord = new ApprovalRecord();
+            approvalRecord.setCaseId(preApprovalDTO.getCaseId());
+            approvalRecord.setStepName(StepPropertyEnum.PRE_TRIAL.getLabel());
+            approvalRecord.setApproverId(userId);
+            approvalRecord.setDecision(DecisionEnum.REJECT.getMsg());
+            approvalRecord.setComments(preApprovalDTO.getComments());
+            approvalRecord.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setIsDelete(false);
+            // 保存到数据库
+            approvalService.save(approvalRecord);
+        }else{
+            log.info("找到对应以前审批记录");
+            approvalService.updateDecisionByCaseIdAndStepNameAndIsDelete(DecisionEnum.REJECT.getMsg(),preApprovalDTO.getCaseId(),StepPropertyEnum.PRE_TRIAL.getLabel(),preApprovalDTO.getComments(),userId);
+        }
+        stepService.updateUserId2ByCaseIdAndStepName(StepPropertyEnum.PRE_TRIAL.getLabel(),userId,preApprovalDTO.getCaseId());
+        loanCaseService.updateUpdatetimeByIdAndIsDeleted(preApprovalDTO.getCaseId(),false);
+        //TODO:微信推送预审拒绝消息和通知下一环节
+//        wxService.sendTemplateMessage(loanCase.getCustomer().getMobile(),new TemplateMessage());
+        return ResultUtil.success("success","预审拒绝");
+    }
+
+    @PostMapping("/approval/{caseId}/pass")
+    @PreAuthorize("@pms.hasRole('APPROVER')")
+    @ApiOperation("业务审批通过")
+    public Result approval_pass(ApprovalDTO approvalDTO, HttpServletRequest request) {
+        String token = request.getHeader("Authorization");
+        Long userId=Long.parseLong(JwtUtil.parseJWT(jwtProperties.getUserSecretKey(),token).get("userId").toString());
+        log.info("用户id: {}", userId);
+        //审批业务逻辑
+        LoanCaseVO loanCase = loanCaseService.findLoanCaseByIdAndIsDelete(approvalDTO.getCaseId(), false);
+        StepVO step = stepService.findByStepNameAndCaseId(StepPropertyEnum.APPROVAL.getLabel(), approvalDTO.getCaseId());
+        //判断过去处理人与目前处理人是否一致
+        if(step.getUserId1()!=null&&step.getUserId2()!=null&&userId != step.getUserId2()&&userId!=step.getUserId1()){
+            return ResultUtil.error(STEP_USER_NOT_EXPECTED.getCode(), "环节处理人不是预期用户");
+        }
+        if(step.getStatus()==StepEnum.COMPLETED.getMsg()){
+            return ResultUtil.error(STEP_HAS_COMPLETEED.getCode(), "环节已完成,无法重复审批");
+        }
+        if(loanCase == null || loanCase.getIsDelete()){
+            return ResultUtil.error(PROJECT_NOT_EXIST.getCode(), PROJECT_NOT_EXIST.getMsg());
+        }
+        ApprovalRecordVO approvalRecord_origin = approvalService.findByCaseIdAndIsDeleteAndStepName(approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),userId);
+        if(approvalRecord_origin == null) {
+            log.info("没找到对应以前审批记录");
+            // 创建审批记录
+            ApprovalRecord approvalRecord = new ApprovalRecord();
+            approvalRecord.setCaseId(approvalDTO.getCaseId());
+            approvalRecord.setStepName(StepPropertyEnum.APPROVAL.getLabel());
+            approvalRecord.setApproverId(userId);
+            approvalRecord.setDecision(DecisionEnum.PASS.getMsg());
+            approvalRecord.setComments(approvalDTO.getComments());
+            approvalRecord.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setIsDelete(false);
+            // 保存到数据库
+            approvalService.save(approvalRecord);
+        }else{
+            log.info("找到对应以前审批记录");
+            approvalService.updateDecisionByCaseIdAndStepNameAndIsDelete(DecisionEnum.PASS.getMsg(),approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),approvalDTO.getComments(),userId);
+        }
+        if(step.getUserId1()== null){
+            stepService.updateUserId1ByCaseIdAndStepName(StepPropertyEnum.APPROVAL.getLabel(),userId,approvalDTO.getCaseId());
+        }else if(step.getUserId2()== null){
+            stepService.updateUserId2ByCaseIdAndStepName(StepPropertyEnum.APPROVAL.getLabel(),userId,approvalDTO.getCaseId());
+        }
+        if(step.getUserId1()!=null&&step.getUserId2()!=null){
+            ApprovalRecordVO approvalRecord_user1 = approvalService.findByCaseIdAndIsDeleteAndStepName(approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),step.getUserId1());
+            ApprovalRecordVO approvalRecord_user2 = approvalService.findByCaseIdAndIsDeleteAndStepName(approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),step.getUserId2());
+            if(approvalRecord_user1.getDecision() == DecisionEnum.PASS.getMsg()&&approvalRecord_user2.getDecision() == DecisionEnum.PASS.getMsg()){
+                stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.APPROVAL_PARENT.getLabel(),approvalDTO.getCaseId());
+                stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.APPROVAL.getLabel(),approvalDTO.getCaseId());
+                stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.CONTRACT_SIGN_PARENT.getLabel(),approvalDTO.getCaseId());
+                stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.CONTRACT_SIGN.getLabel(),approvalDTO.getCaseId());
+                //TODO微信推送审批通过消息和通知下一环节
+            }
+        }else{
+            //TODO微信推送另一个审批人审批
+        }
+
+        return ResultUtil.success("success","审批通过");
+
+    }
+
+    @PostMapping("/approval/{caseId}/reject")
+    @PreAuthorize("@pms.hasRole('APPROVER')")
+    @ApiOperation("业务审批拒绝")
+    public Result approval_reject(ApprovalDTO approvalDTO, HttpServletRequest request) {
+        String token = request.getHeader("Authorization");
+        Long userId=Long.parseLong(JwtUtil.parseJWT(jwtProperties.getUserSecretKey(),token).get("userId").toString());
+        log.info("用户id: {}", userId);
+        //审批业务逻辑
+        LoanCaseVO loanCase = loanCaseService.findLoanCaseByIdAndIsDelete(approvalDTO.getCaseId(),false);
+        if(loanCase == null||loanCase.getIsDelete()){
+            return ResultUtil.error(PROJECT_NOT_EXIST.getCode(), PROJECT_NOT_EXIST.getMsg());
+        }
+        StepVO step = stepService.findByStepNameAndCaseId(StepPropertyEnum.APPROVAL.getLabel(), approvalDTO.getCaseId());
+        //判断过去处理人与目前处理人是否一致
+        if(step.getUserId1()!=null&&step.getUserId2()!=null&&userId!=step.getUserId2()&&userId!=step.getUserId1()){
+            return ResultUtil.error(STEP_USER_NOT_EXPECTED.getCode(), "环节处理人不是预期用户");
+        }
+        if(step.getStatus()==StepEnum.COMPLETED.getMsg()){
+            return ResultUtil.error(STEP_HAS_COMPLETEED.getCode(), "环节已完成,无法重复审批");
+        }
+        //审批记录处理
+        ApprovalRecordVO approvalRecord_origin = approvalService.findByCaseIdAndIsDeleteAndStepName(approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),userId);
+        if(approvalRecord_origin == null) {
+            log.info("没找到对应以前审批记录");
+            // 创建审批记录
+            ApprovalRecord approvalRecord = new ApprovalRecord();
+            approvalRecord.setCaseId(approvalDTO.getCaseId());
+            approvalRecord.setStepName(StepPropertyEnum.APPROVAL.getLabel());
+            approvalRecord.setApproverId(userId);
+            approvalRecord.setDecision(DecisionEnum.REJECT.getMsg());
+            approvalRecord.setComments(approvalDTO.getComments());
+            approvalRecord.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setIsDelete(false);
+            // 保存到数据库
+            approvalService.save(approvalRecord);
+        }else{
+            log.info("找到对应以前审批记录");
+            approvalService.updateDecisionByCaseIdAndStepNameAndIsDelete(DecisionEnum.REJECT.getMsg(),approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),approvalDTO.getComments(),userId);
+        }
+        if(step.getUserId1()== null){
+            stepService.updateUserId1ByCaseIdAndStepName(StepPropertyEnum.APPROVAL.getLabel(),userId,approvalDTO.getCaseId());
+        }else if(step.getUserId2()== null){
+            stepService.updateUserId2ByCaseIdAndStepName(StepPropertyEnum.APPROVAL.getLabel(),userId,approvalDTO.getCaseId());
+        }
+        //更新环节状态
+        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.BUSINESS_ACCEPT_PARENT.getLabel(),approvalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),approvalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.UNSTART.getMsg(),StepPropertyEnum.PRE_TRIAL_PARENT.getLabel(),approvalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.UNSTART.getMsg(),StepPropertyEnum.PRE_TRIAL.getLabel(),approvalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.UNSTART.getMsg(),StepPropertyEnum.APPROVAL_PARENT.getLabel(),approvalDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepEnum.UNSTART.getMsg(),StepPropertyEnum.APPROVAL.getLabel(),approvalDTO.getCaseId());
+        //TODO微信推送审批驳回消息和通知重新受理(到业务受理)
+
+        return ResultUtil.success("success","审批驳回");
+    }
+    @PostMapping("/approval/{caseId}/terminate")
+    @PreAuthorize("@pms.hasRole('APPROVER')")
+    @ApiOperation("业务审批终结")
+    public Result approval_end(ApprovalDTO approvalDTO, HttpServletRequest request) {
+        String token = request.getHeader("Authorization");
+        Long userId=Long.parseLong(JwtUtil.parseJWT(jwtProperties.getUserSecretKey(),token).get("userId").toString());
+        log.info("用户id: {}", userId);
+        //审批业务逻辑
+        LoanCaseVO loanCase = loanCaseService.findLoanCaseByIdAndIsDelete(approvalDTO.getCaseId(),false);
+        if(loanCase == null||loanCase.getIsDelete()){
+            return ResultUtil.error(PROJECT_NOT_EXIST.getCode(), PROJECT_NOT_EXIST.getMsg());
+        }
+        StepVO step = stepService.findByStepNameAndCaseId(StepPropertyEnum.APPROVAL.getLabel(), approvalDTO.getCaseId());
+        //判断过去处理人与目前处理人是否一致
+        if(step.getUserId1()!=null&&step.getUserId2()!=null&&userId!=step.getUserId2()&&userId!=step.getUserId1()){
+            return ResultUtil.error(STEP_USER_NOT_EXPECTED.getCode(), "环节处理人不是预期用户");
+        }
+        if(step.getStatus()==StepEnum.COMPLETED.getMsg()){
+            return ResultUtil.error(STEP_HAS_COMPLETEED.getCode(), "环节已完成,无法重复审批");
+        }
+        //审批记录处理
+        ApprovalRecordVO approvalRecord_origin = approvalService.findByCaseIdAndIsDeleteAndStepName(approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),userId);
+        if(approvalRecord_origin == null) {
+            log.info("没找到对应以前审批记录");
+            // 创建审批记录
+            ApprovalRecord approvalRecord = new ApprovalRecord();
+            approvalRecord.setCaseId(approvalDTO.getCaseId());
+            approvalRecord.setStepName(StepPropertyEnum.APPROVAL.getLabel());
+            approvalRecord.setApproverId(userId);
+            approvalRecord.setDecision(DecisionEnum.TERMINATE.getMsg());
+            approvalRecord.setComments(approvalDTO.getComments());
+            approvalRecord.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            approvalRecord.setIsDelete(false);
+            // 保存到数据库
+            approvalService.save(approvalRecord);
+        }else{
+            log.info("找到对应以前审批记录");
+            approvalService.updateDecisionByCaseIdAndStepNameAndIsDelete(DecisionEnum.TERMINATE.getMsg(),approvalDTO.getCaseId(),StepPropertyEnum.APPROVAL.getLabel(),approvalDTO.getComments(),userId);
+        }
+        if(step.getUserId1()== null){
+            stepService.updateUserId1ByCaseIdAndStepName(StepPropertyEnum.APPROVAL.getLabel(),userId,approvalDTO.getCaseId());
+        }else if(step.getUserId2()== null){
+            stepService.updateUserId2ByCaseIdAndStepName(StepPropertyEnum.APPROVAL.getLabel(),userId,approvalDTO.getCaseId());
+        }
+        //更新项目和环节状态 作逻辑删除
+        loanCaseService.logic_delete(approvalDTO.getCaseId());
+        List<StepVO> steps = stepService.getStepByCaseId(approvalDTO.getCaseId());
+        for (StepVO step_each : steps){
+            stepService.logic_delete(step_each.getId());
+        }
+        //TODO微信推送审批驳回消息和通知重新受理(到业务受理)
+
+        return ResultUtil.success("success","审批驳回");
+    }
+}
+

+ 109 - 0
src/main/java/com/loan/system/controller/wechat/ContractController.java

@@ -0,0 +1,109 @@
+package com.loan.system.controller.wechat;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.server.HttpServerResponse;
+import com.loan.system.domain.dto.DocumentDTO;
+import com.loan.system.domain.entity.Contract;
+import com.loan.system.domain.entity.Document;
+import com.loan.system.domain.pojo.ContractInformation;
+import com.loan.system.utils.PoiWordUtil;
+import com.loan.system.domain.enums.StepEnum;
+import com.loan.system.domain.enums.StepPropertyEnum;
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.domain.vo.ContractVO;
+import com.loan.system.domain.vo.StepVO;
+import com.loan.system.service.ContractService;
+import com.loan.system.service.DocumentService;
+import com.loan.system.service.StepService;
+import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/wechat/contract")
+@Api(tags = "合同签订接口")
+public class ContractController {
+    @Value("${upload.templatePath}")
+    private String contractPath;
+
+    @Autowired
+    private ContractService contractService;
+    @Autowired
+    private StepService stepService;
+    @Autowired
+    private DocumentService documentService;
+
+    @GetMapping("/{caseId}")
+    @ApiOperation("显示所有合同详情(内部人员)")
+    public Result findContractsDetails(@PathVariable("caseId") Long caseId){
+
+        List<ContractVO> contracts = contractService.findContractByCaseId(caseId);
+
+        return ResultUtil.success("success",contracts);
+    }
+
+    @PostMapping("/{id}")
+    @ApiOperation("推送合同")
+    public Result pushContract(@PathVariable("id") Long contractId){
+        contractService.updateIsPushById(contractId);
+        return ResultUtil.success("success");
+    }
+
+    @GetMapping("/case/{caseId}")
+    @ApiOperation("显示所有合同详情(客户)")
+    public Result findContractsByCustomer(@PathVariable("caseId") Long caseId, HttpServletResponse response){
+        //显示已经推送过的合同
+        List<ContractVO> contracts = contractService.findContractByCaseIdAndIsPush(caseId,true);
+        String downloadName = UUID.randomUUID().toString();
+        ContractInformation contractInformation = new ContractInformation();
+
+        PoiWordUtil.writeApprove(response,contractPath,contractInformation,downloadName);
+
+        return ResultUtil.success("success",contracts);
+    }
+    //签署的电子信息先以附件上传
+    //再修改合同状态
+    @PutMapping("/{id}")
+    @ApiOperation("签署合同(客户)")
+    public Result updateContract(@PathVariable("id")Long contractId,@RequestParam Long signId,@RequestParam Long commitedId){
+        contractService.updateContractById1(contractId,commitedId,signId);
+        return ResultUtil.success("success");
+    }
+
+    @PutMapping("/case/{caseId}")
+    @ApiOperation("合同签订完成")
+    public Result completeContract(@PathVariable("caseId")Long caseId){
+        //合同签约完成
+        stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(), StepPropertyEnum.CONTRACT_SIGN_PARENT.getLabel(),caseId);
+        stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.CONTRACT_SIGN.getLabel(),caseId);
+
+//        //出款开始环节
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.DISBURSE_PARENT.getLabel(),caseId);
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.PLAN_REPORT.getLabel(),caseId);
+
+//        //回款开始环节
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.REPAY_PARENT.getLabel(),caseId);
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.REPAY_START.getLabel(),caseId);
+//
+//        //取证开始环节
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.COLLATERAL_RECEIVE.getLabel(),caseId);
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.PLAN_SUBMISSION.getLabel(),caseId);
+//
+//        //送证开始环节
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.COLLATERAL_DELIVERY.getLabel(),caseId);
+//        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.PLAN_SUBMISSION_2.getLabel(),caseId);
+
+        return ResultUtil.success("success");
+    }
+
+
+
+
+}

+ 43 - 0
src/main/java/com/loan/system/controller/wechat/DictionaryController.java

@@ -0,0 +1,43 @@
+package com.loan.system.controller.wechat;
+
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.service.DictionaryService;
+import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/wechat/dictionary")
+@Api(tags = "字典表接口")
+public class DictionaryController {
+    @Autowired
+    private DictionaryService dictionaryService;
+
+    @GetMapping("/attributes")
+    @ApiOperation("查询业务属性")
+    public Result getAttributes(){
+        return ResultUtil.success("success",dictionaryService.getAllDictAttributes(false));
+    }
+
+    @GetMapping("/businessTypes")
+    @ApiOperation("查询业务类型")
+    public Result getBusinessTypes(){
+        return ResultUtil.success("success",dictionaryService.getAllDictTypes(false));
+    }
+
+    @GetMapping("/channels")
+    @ApiOperation("查询业务渠道")
+    public Result getChannels(){
+        return ResultUtil.success("success",dictionaryService.getAllDictChannels(false));
+    }
+
+    @GetMapping("/locations")
+    @ApiOperation("查询房产位置")
+    public Result getLocations(){
+        return ResultUtil.success("success",dictionaryService.getAllLocations(false));
+    }
+}

+ 149 - 0
src/main/java/com/loan/system/controller/wechat/DisbursementController.java

@@ -0,0 +1,149 @@
+package com.loan.system.controller.wechat;
+
+import com.loan.system.context.BaseContext;
+import com.loan.system.domain.dto.DisbursementDTO;
+import com.loan.system.domain.dto.DisbursementRecordDTO;
+import com.loan.system.domain.dto.DocumentDTO;
+import com.loan.system.domain.entity.ContractSeq;
+import com.loan.system.domain.entity.Disbursement;
+import com.loan.system.domain.enums.BusinessAttrEnum;
+import com.loan.system.domain.enums.StepEnum;
+import com.loan.system.domain.enums.StepPropertyEnum;
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.domain.vo.ContractVO;
+import com.loan.system.domain.vo.DisbursementVO;
+import com.loan.system.domain.vo.StepVO;
+import com.loan.system.service.*;
+import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@RestController
+@RequestMapping("/wechat/disbursement")
+@Api(tags = "出款接口")
+public class DisbursementController {
+    @Autowired
+    private DisbursementService disbursementService;
+    @Autowired
+    private StepService stepService;
+    @Autowired
+    private LoanService loanService;
+    @Autowired
+    private DocumentService documentService;
+    @Autowired
+    private ContractService contractService;
+    @Autowired
+    private ContractSeqService contractSeqService;
+
+    @GetMapping("/{caseId}/details")
+    @ApiOperation("显示业务详情")//与loanContraller的方法一致,但为了规范
+    public Result findLoanCaseDetails(@PathVariable("caseId")Long caseId){
+        return ResultUtil.success("success",loanService.findLoanCaseDetailsById(caseId));
+    }
+
+    @GetMapping("/{caseId}/details2")
+    @ApiOperation("显示出款计划详情")
+    public Result findDisbursementDetails(@PathVariable("caseId")Long caseId){
+        return ResultUtil.success("success",disbursementService.findDisbursementDetailsById(caseId));
+    }
+
+    @PostMapping
+    @ApiOperation(value = "上报出款计划")
+    public Result addDisbursement(@RequestBody DisbursementDTO disbursementDTO) {
+
+        //上报计划
+        DisbursementVO disbursementVO = disbursementService.addDisbursement(disbursementDTO);
+
+        //修改状态
+        stepService.updateUserByCaseId(StepPropertyEnum.PLAN_REPORT.getLabel(), BaseContext.getCurrentId(), disbursementDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepPropertyEnum.PLAN_REPORT.getLabel(), StepEnum.COMPLETED.getMsg(), disbursementDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepPropertyEnum.PLAN_AUDIT.getLabel(), StepEnum.PROCESS.getMsg(),disbursementDTO.getCaseId());
+
+        return ResultUtil.success("success",disbursementVO);
+    }
+
+    //上传文件UploadController
+    //显示文件列表
+    @GetMapping("/{caseId}/files")
+    @ApiOperation("显示文件列表")
+    public Result findByCaseId(@PathVariable("caseId")Long caseId){
+
+        return ResultUtil.success("success",documentService.findByCaseId(caseId));
+    }
+
+    @PutMapping("/commit")
+    @ApiOperation(value = "出款启动")
+    @PreAuthorize("@pms.hasRole(RoleEnum.LEAD_SALES.getMsg())")
+    public Result commitDisbursement(@RequestBody DocumentDTO documentDTO) {
+
+        //修改状态
+        stepService.updateUserByCaseId(StepPropertyEnum.DISBURSE_START.getLabel(), BaseContext.getCurrentId(), documentDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepPropertyEnum.DISBURSE_START.getLabel(), StepEnum.COMPLETED.getMsg(),documentDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepPropertyEnum.DISBURSE_AUDIT.getLabel(), StepEnum.PROCESS.getMsg(), documentDTO.getCaseId());
+
+        return ResultUtil.success("success");
+    }
+
+    @PostMapping("/{id}/amount")
+    @ApiOperation(value = "财务出款")
+    public Result disbursement(@RequestBody DisbursementRecordDTO disbursementRecordDTO) {
+        //添加出款记录
+
+        //修改状态
+//        stepService.updateUserByCaseId(StepPropertyEnum.FINANCE_DISBURSE.getLabel(), BaseContext.getCurrentId(), disbursementDTO.getCaseId());
+//        stepService.updateStatusByCaseId(StepPropertyEnum.FINANCE_DISBURSE.getLabel(), StepEnum.COMPLETED.getMsg(),disbursementDTO.getCaseId());
+//        stepService.updateStatusByCaseId(StepPropertyEnum.DISBURSE_CONFIRM.getLabel(), StepEnum.PROCESS.getMsg(), disbursementDTO.getCaseId());
+
+
+        return ResultUtil.success("success");
+    }
+
+    @PostMapping("/confirm")
+    @ApiOperation(value = "业务确认")
+    public Result confirmDisbursement(@RequestBody DisbursementDTO disbursementDTO) {
+        //修改状态
+        stepService.updateUserByCaseId(StepPropertyEnum.DISBURSE_CONFIRM.getLabel(), BaseContext.getCurrentId(), disbursementDTO.getCaseId());
+        stepService.updateStatusByCaseId(StepPropertyEnum.DISBURSE_CONFIRM.getLabel(), StepEnum.COMPLETED.getMsg(),disbursementDTO.getCaseId());
+
+        //填写合同编号
+        List<ContractVO> contractByCaseId = contractService.findContractByCaseId(disbursementDTO.getCaseId());
+        String today = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+
+        contractByCaseId.forEach(contractVO -> {
+            String prefix= contractVO.getBusinessAttr().equals(BusinessAttrEnum.ESTATE_MORTGAGE.getMsg()) ? "宝押字": "宝质字";
+
+            ContractSeq contractSeq = contractSeqService.findSeqBySeqDataAndBusinessAttr(today,prefix);
+            if (ObjectUtils.isEmpty(contractSeq))
+                contractSeq =contractSeqService.addSeq(today,prefix);
+
+            //合同编号
+            String contractNo = String.format("%s%s-%s-%03d",
+                    prefix,
+                    today.substring(0, 4),        // 年份
+                    today.substring(4),           // 月日
+                    contractSeq.getNextSeq());
+
+            //更新号码
+            contractSeqService.updateSeqById(contractSeq.getId(),contractSeq.getNextSeq()+1);
+
+            //更新合同编号
+            contractService.updateContractNoById(contractVO.getId(),contractNo);
+        });
+
+        return ResultUtil.success("success");
+    }
+
+
+
+
+
+
+}

+ 246 - 0
src/main/java/com/loan/system/controller/wechat/LoanController.java

@@ -0,0 +1,246 @@
+package com.loan.system.controller.wechat;
+
+import com.loan.system.context.BaseContext;
+import com.loan.system.domain.dto.*;
+import com.loan.system.domain.entity.*;
+import com.loan.system.domain.enums.ExceptionEnum;
+import com.loan.system.domain.enums.StepEnum;
+import com.loan.system.domain.enums.StepPropertyEnum;
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.domain.vo.LoanCaseVO;
+import com.loan.system.domain.vo.StepVO;
+import com.loan.system.exception.DescribeException;
+import com.loan.system.service.*;
+import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/wechat/case")
+@Api(tags = "业务受理接口")
+public class LoanController {
+
+    @Autowired
+    private LoanService loanService;
+    @Autowired
+    private StepService stepService;
+    @Autowired
+    private ContractService contractService;
+    @Autowired
+    private ApprovalService approveService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private CustomerOtherService customerOtherService;
+    @Autowired
+    private CollateralService collateralService;
+    @Autowired
+    private ContractAndCollateralService contractAndCollateralService;
+
+    @GetMapping("/dealing")
+    @ApiOperation("显示处理中的业务")
+    public Result findLoanCaseByIsComplete(@RequestParam("isComplete") Boolean isComplete ){
+        List<LoanCaseVO> loanCases = loanService.findLoanCaseByIsComplete(isComplete,false);
+        return ResultUtil.success("success",loanCases);
+    }
+
+    @GetMapping("/{id}/details")
+    @ApiOperation("显示业务详情")
+    public Result findLoanCaseDetails(@PathVariable("id")Long caseId){
+        return ResultUtil.success("success",loanService.findLoanCaseDetailsById(caseId));
+    }
+
+    @PostMapping("/create")
+    @ApiOperation("创建业务")
+    public Result createLoanCase(@RequestParam("customerId") Long customerId){
+        //创建订单
+        LoanCaseVO loanCase = loanService.addLoanCaseByCustomerId(customerId);
+        //创建流程
+        stepService.addStepByCaseId(loanCase.getId());
+        return ResultUtil.success("success",loanCase);
+    }
+
+    /*
+    1.添加业务,开启业务流程
+    2.绑定阶段和业务
+     */
+    @PostMapping("/{id}")//请求中操作复杂,putmapping仅适用于更新操作
+    @ApiOperation("提交/保存业务")
+    public Result saveLoanCase(@PathVariable("id")Long caseId, @RequestBody LoanCaseDTO loanCaseDTO, @RequestParam("IsComplete")Boolean isComplete){//isComplete 若保存,则设置为未完成,若提交,则设置为已完成
+        StepVO stepVO = stepService.findByStepNameAndCaseId(StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),caseId);
+        if(stepVO.getStatus().equals(StepEnum.COMPLETED.getMsg()))
+            throw new DescribeException(ExceptionEnum.LOANCASE_IS_Completed);
+
+        //1.补充业务信息
+        loanService.updateLoanCaseById(loanCaseDTO,caseId);
+
+        //2.设置合同(若存在则修改)
+        contractService.deleteAllByCaseId(caseId);
+        List<Contract> contracts = new ArrayList<>();//新增的合同
+        for(ContractDTO contractDTO : loanCaseDTO.getContracts()){
+            Contract c = contractService.saveContract(contractDTO);
+
+            contracts.add(c);
+        }
+
+        //3.设置押品
+        collateralService.deleteAllByCaseId(caseId);
+        List<Long> collateralIds = new ArrayList<>();
+        for(CollateralDTO collateralDTO : loanCaseDTO.getCollateral()){
+            Collateral collateral = collateralService.saveCollateral(collateralDTO);
+
+            collateralIds.add(collateral.getId());
+        }
+
+        //4.设置合同、押品关联
+        contractAndCollateralService.deleteAllByCaseId(caseId);
+        for(int i=0 ; i < loanCaseDTO.getCollateralAndContract().size(); i++){
+            Contract contract = contracts.get( i);
+            List<Integer> collaterals = loanCaseDTO.getCollateralAndContract().get(i).get(contract.getBusinessAttr());
+            for (Integer collateralId : collaterals)
+                contractAndCollateralService.addContractAndCollateral(contract.getId(),collateralIds.get(collateralId-1));
+        }
+//        //4.设置附件
+//        for(DocumentDTO documentDTO : loanCaseDTO.getDocuments()){
+//            //若存在,则修改
+//
+//            //若不存在,则添加
+//        }
+        //5.添加其它客户
+        customerOtherService.deleteAllByCaseId(caseId);
+        if(!ObjectUtils.isEmpty(loanCaseDTO.getCustomers1()))
+            customerOtherService.addCustomers(loanCaseDTO.getCustomers1());
+
+        if (!ObjectUtils.isEmpty(loanCaseDTO.getCustomers2()))
+            customerOtherService.addCustomers(loanCaseDTO.getCustomers2());
+
+
+        //6.设置客户婚姻
+        customerService.updateMarriedStatusById(loanCaseDTO.getCustomerId(),loanCaseDTO.getMarriedStatus());
+
+        //7.设置阶段负责人与状态(如果第一个人是辅办人员,那第二个人必须是主办)
+        stepService.updateUserByCaseId(StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),BaseContext.getCurrentId(),caseId);
+        if(isComplete){
+            stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.BUSINESS_ACCEPT_PARENT.getLabel(),caseId);
+            stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),caseId);
+            //设置当阶段为完成,下阶段为开始
+            stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.PRE_TRIAL_PARENT.getLabel(),caseId);
+            stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.PRE_TRIAL.getLabel(),caseId);
+        }
+
+        //8.消息推送
+
+        return ResultUtil.success("success");
+    }
+
+
+//    @PostMapping("/{id}/save")//请求中操作复杂,putmapping仅适用于更新操作
+//    @ApiOperation("随时保存业务(未)")
+//    public Result saveLoanCase(@PathVariable("id")Long caseId, @RequestBody LoanCaseDTO loanCaseDTO, @RequestParam("IsComplete")Boolean isComplete){//isComplete 若保存,则设置为未完成,若提交,则设置为已完成
+//        //1.补充业务信息
+//       loanService.updateLoanCaseById(loanCaseDTO,caseId);
+//
+//        //2.设置合同(若存在则修改)
+//        List<Contract> contract = new ArrayList<>();//新增的合同
+//        for(ContractDTO contractDTO : loanCaseDTO.getContracts()){
+//            //contract.setCaseId(caseId);
+//            Contract c =contractService.findContractByCaseIdAndBusinessAttr( caseId,contractDTO.getBusinessAttr(),false);
+//            if(ObjectUtils.isEmpty(c))
+//                c = contractService.saveContract(contractDTO);
+//            else
+//                contractService.updateContractById(c.getId(),contractDTO,false);
+//
+//            //考虑删除合同/押品的情况
+//            contract.add(c);
+//        }
+//
+//        //3.设置押品
+//        List<Long> collateralIds = new ArrayList<>();
+//        for(CollateralDTO collateralDTO : loanCaseDTO.getCollateral()){
+//            Collateral collateral = collateralService.findCollateralByNameAndCaseId(collateralDTO.getCollateralName(),caseId,false);
+//            if(ObjectUtils.isEmpty(collateral))
+//                collateral = collateralService.saveCollateral(collateralDTO);
+//            else
+//                collateralService.updateCollateralById(collateral.getId(),collateralDTO,false);
+//
+//            collateralIds.add(collateral.getId());
+//        }
+////        //4.设置附件
+////        for(DocumentDTO documentDTO : loanCaseDTO.getDocuments()){
+////            //若存在,则修改
+////
+////            //若不存在,则添加
+////        }
+//
+//        //5.设置客户婚姻
+//        customerService.updateMarriedStatusById(loanCaseDTO.getCustomerId(),loanCaseDTO.getMarriedStatus());
+//
+//        //6.设置阶段负责人与状态(如果第一个人是辅办人员,那第二个人必须是主办)
+//        stepService.updateUserByCaseId(StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),BaseContext.getCurrentId(),caseId);
+//
+//        return ResultUtil.success("success");
+//    }
+//
+
+
+    @PutMapping("/{id}/preApprove/cancel")
+    @ApiOperation("取消预审")
+    public Result cancelPreApprove(@PathVariable("id")Long caseId){
+        //设置预审核阶段已完成,审批阶段开始
+        completePreApproveMethod(caseId);
+        StepVO stepVO = stepService.updateUserByCaseId(StepPropertyEnum.PRE_TRIAL.getLabel(), BaseContext.getCurrentId(), caseId);
+
+        //添加审批记录
+        approveService.addPreApprovalRecord(StepPropertyEnum.PRE_TRIAL.getLabel(),BaseContext.getCurrentId(),caseId);
+
+        //List<StepVO> list = stepService.getStepByCaseId(caseId);
+
+        return ResultUtil.success("success");
+    }
+
+//    @PutMapping("/{id}/preApprove/commit")
+//    @ApiOperation("预审提交")
+//    public Result preApproveCommit(@RequestBody ApprovalRecordDTO approvalRecordDTO, @PathVariable("id")Long caseId ){
+//        //修改阶段负责人
+//        StepVO  stepVo = stepService.updateUserByCaseId(approvalRecordDTO.getStepName(), approvalRecordDTO.getApproverId(), caseId);
+//        //添加审批记录
+//        approveService.addApprovalRecord(approvalRecordDTO);
+//        //修改阶段状态
+//        if (stepVo.getUserId2()!= null)
+//            completePreApproveMethod(caseId);
+//
+//        List<StepVO> list = stepService.getStepByCaseId(caseId);
+//
+//        return ResultUtil.success("success",list);
+//    }
+//
+//    @PutMapping("/{id}/preApprove/back")
+//    @ApiOperation("预审退回(未)")//驳回后的负责人还是同一个吗
+//    public Result preApproveBack(@RequestBody ApprovalRecordDTO approvalRecordDTO, @PathVariable("id")Long caseId ){
+//        //修改阶段负责人
+//        stepService.updateUserByCaseId(approvalRecordDTO.getStepName(),approvalRecordDTO.getApproverId(),caseId);
+//        //添加审批记录
+//        approveService.addApprovalRecord(approvalRecordDTO);
+//        //修改阶段状态
+//        completePreApproveMethod(caseId);
+//
+//        List<StepVO> list = stepService.getStepByCaseId(caseId);
+//        return ResultUtil.success("success",list);
+//    }
+
+    private void completePreApproveMethod(Long caseId){
+        //设置预审核阶段已完成,审批阶段开始
+        stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.PRE_TRIAL_PARENT.getLabel(),caseId);
+        stepService.updateStatusByCaseId(StepEnum.COMPLETED.getMsg(),StepPropertyEnum.PRE_TRIAL.getLabel(),caseId);
+
+        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.APPROVAL_PARENT.getLabel(),caseId);
+        stepService.updateStatusByCaseId(StepEnum.PROCESS.getMsg(),StepPropertyEnum.APPROVAL.getLabel(),caseId);
+    }
+
+}

+ 11 - 0
src/main/java/com/loan/system/controller/wechat/RepaymentController.java

@@ -0,0 +1,11 @@
+package com.loan.system.controller.wechat;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/wechat/repayment")
+@Api(tags = "还款接口")
+public class RepaymentController {
+}

+ 24 - 0
src/main/java/com/loan/system/controller/wechat/StepController.java

@@ -0,0 +1,24 @@
+package com.loan.system.controller.wechat;
+
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.service.StepService;
+import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/wechat/step")
+@Api(tags = "环节接口")
+public class StepController {
+    @Autowired
+    private StepService stepService;
+
+    @GetMapping
+    public Result findStep(@RequestParam("caseId")Long caseId){
+        return ResultUtil.success("success",stepService.getStepByCaseId(caseId));
+    }
+}

+ 52 - 11
src/main/java/com/loan/system/controller/wechat/UploadController.java

@@ -4,7 +4,7 @@ import com.loan.system.config.FileUploadConfig;
 import com.loan.system.domain.entity.Document;
 import com.loan.system.domain.enums.ExceptionEnum;
 import com.loan.system.domain.pojo.Result;
-import com.loan.system.exception.FileException;
+import com.loan.system.domain.vo.DocumentVO;
 import com.loan.system.service.DocumentService;
 import com.loan.system.utils.ResultUtil;
 import io.swagger.annotations.Api;
@@ -34,9 +34,13 @@ public class UploadController {
 
     /** 上传文件(支持任意类型,只要在白名单内) */
     @PostMapping("/upload/{caseId}/{type}")
-    @ApiOperation("文件上传")
+    @ApiOperation("文件上传")//若合同不是统一提交,则合同1,合同2,合同3
     public Result uploadFile(@PathVariable("caseId") Long caseId,@PathVariable("type") String fileType,@RequestParam("file") MultipartFile[] files) throws IOException{
+        fileService.deleteFileByCaseIdAndDictType(caseId,fileType);
+        //删除本地文件
+        deleteFile(caseId,fileType);
 
+        List<DocumentVO> fileList = new ArrayList<>();
         for (int i=0 ; i < files.length ; i++){
             MultipartFile file =files[i];
 
@@ -60,7 +64,7 @@ public class UploadController {
                 newFileName = String.format("%d-%s-%s(%d).%s", caseId, fileType, originalName, i, ext);
 
             // 创建目录
-            File uploadDir = new File(config.getUploadDir(), String.valueOf(caseId) + "/" + fileType);
+            File uploadDir = new File(config.getUploadDir(), caseId + "/" + fileType);
             if (!uploadDir.exists() && !uploadDir.mkdirs()) {
                 return ResultUtil.error(ExceptionEnum.DIRECTORY_CREATE_ERROR);
             }
@@ -82,10 +86,10 @@ public class UploadController {
             document.setIsDelete( false);
             document.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
             document.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-            fileService.uploadFile(document);
+            fileList.add(fileService.uploadFile(document));
         }
 
-        return ResultUtil.success("上传成功");
+        return ResultUtil.success("上传成功", fileList);
     }
 
 
@@ -114,10 +118,11 @@ public class UploadController {
     }
 
     /** 删除文件 */
-    @DeleteMapping("/delete/{fileName}")
+    @DeleteMapping("/delete/{caseId}/{type}")
     @ApiOperation("文件删除")
-    public Result deleteFile(@PathVariable String fileName) {
-        File file = new File(config.getUploadDir(), fileName);
+    public Result deleteFileByFileName(@RequestParam String fileName ,@PathVariable Long caseId, @PathVariable String fileType) {
+        String newUploadDir = config.getUploadDir() + caseId + "/" + fileType;
+        File file = new File(newUploadDir, fileName);
 
         if (!file.exists())
             return ResultUtil.error(ExceptionEnum.FILE_NOT_EXIST);
@@ -129,8 +134,44 @@ public class UploadController {
         return ResultUtil.success("文件删除成功");
     }
 
-    @PostMapping("save/{caseId}/{type}")
-    public Result saveFile(@PathVariable("caseId") Long caseId,@PathVariable("type") String type,@RequestParam String fileName){
-        return ResultUtil.success();
+    /** 删除文件 */
+    private void deleteFile(Long caseId, String fileType) {
+        // 构造待删除文件所在的目录路径
+        File uploadDir = new File(config.getUploadDir(), caseId + "/" + fileType);
+
+        if (!uploadDir.exists()) {
+            return; // 目录不存在,直接返回
+        }
+
+        // 获取目录下所有文件
+        File[] files = uploadDir.listFiles();
+        if (files == null || files.length == 0) {
+            return; // 没有文件需要删除
+        }
+
+        boolean allDeleted = true;
+        for (File file : files) {
+            if (!file.delete()) { // 尝试删除每个文件
+                allDeleted = false; // 如果有文件未能成功删除,则标记为false
+                break;
+            }
+        }
+
+//        if (allDeleted) {
+//            // 尝试删除空目录
+//            if (!uploadDir.delete()) {
+//                // 如果删除目录失败,可以记录日志或采取其他措施
+//                System.out.println("Failed to delete empty directory: " + uploadDir.getAbsolutePath());
+//            }
+//        } else {
+//            // 如果有文件未能成功删除,可以记录日志或采取其他措施
+//            System.out.println("Failed to delete some files in directory: " + uploadDir.getAbsolutePath());
+//        }
     }
+
+
+//    @PostMapping("save/{caseId}/{type}")
+//    public Result saveFile(@PathVariable("caseId") Long caseId,@PathVariable("type") String type,@RequestParam String fileName){
+//        return ResultUtil.success();
+//    }
 }

+ 199 - 129
src/main/java/com/loan/system/controller/wechat/UserController.java

@@ -1,15 +1,20 @@
 package com.loan.system.controller.wechat;
 
 import com.loan.system.constant.JwtClaimsConstant;
-
 import com.loan.system.domain.dto.UserLoginDTO;
 import com.loan.system.domain.dto.WeChatLoginDTO;
 import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.entity.Role;
 import com.loan.system.domain.entity.User;
+import com.loan.system.domain.enums.ExceptionEnum;
+import com.loan.system.domain.enums.RoleEnum;
 import com.loan.system.domain.pojo.Result;
 import com.loan.system.domain.vo.CustomerLoginVO;
+import com.loan.system.domain.vo.CustomerVO;
 import com.loan.system.domain.vo.UserLoginVO;
+import com.loan.system.exception.DescribeException;
 import com.loan.system.properties.JwtProperties;
+import com.loan.system.repository.RoleRepository;
 import com.loan.system.service.CustomerService;
 import com.loan.system.service.Impl.UserServiceImpl;
 import com.loan.system.service.UserService;
@@ -24,10 +29,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.security.auth.login.LoginException;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -35,154 +41,218 @@ import java.util.Map;
  * @date 2020/9/2 - 19:11
  */
 @RestController
-@RequestMapping("/WeChat")
+@RequestMapping("/wechat")
 @Api(tags = "微信用户接口")
-public class UserController {
+public class UserController {//包含内部人员、外部人员
     @Autowired
     private UserService userService;
     @Autowired
     private JwtProperties jwtProperties;
+
     @Autowired
-    private WxService wxService;
+    private RoleRepository roleRepository;
+
     @Autowired
     private CustomerService customerService;
+
+    @Autowired
+    private WxService wxService;
+
     private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
-    @GetMapping("/get_sessionId")
-    @ApiOperation("获取微信openid")
-    public Result get_sessionId(String code){
-        return userService.get_sessionId(code);
-    }
-    /**
-     * 微信登陆 区分用户还是客户 如果都不是就注册成客户
-     * @param wxAuth
-     * @return
-     */
-//    @PostMapping("/authlogin")
-//    @ApiOperation("微信授权登陆获取openid")
-//    public Result authLogin(@RequestBody WXAuth wxAuth){
-//        try {
-//            String json=wxService.wxDecrypt(wxAuth.getEncryptedData(),wxAuth.getIv(),wxAuth.getSessionKey());
-//            JSONObject jsonObject = JSON.parseObject(json);
-//            String openid=jsonObject.getString("openId");
-//            log.info("获取到的用户openid:{}",openid);
-//            if(openid!=null) {
-//                return ResultUtil.success("success", openid);
-//            }
-////            userLoginDTO.setTel(phoneNumber);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//            log.error("微信登陆异常:{}",e.getMessage());
-//            return ResultUtil.error(ExceptionEnum.WECHAT_LOGIN_ERROR);
-//        }
-//        return ResultUtil.error(ExceptionEnum.WECHAT_LOGIN_ERROR);
-//    }
 
-    /**
-     * 客户登陆
-     * @param customer
-     * @return
+    /*
+    1.先查询user查看是否为内部人员
+    2.若不是内部人员,查询外部人员
+    3.外部人员也不存在,进行注册(因为小程序端直接获取手机号,任何用户都可以登录)
      */
-    public Result customer_login(Customer customer){
-        customer=customerService.findBymobileAndIsDelete(customer.getMobile());
-       if (ObjectUtils.isEmpty(customer))
-            throw new IllegalArgumentException("Customer object is null");
-        //为微信用户生成jwt令牌
-        Map<String ,Object> claims=new HashMap<>();
-        //用openid还是id?
-        //claims.put(JwtClaimsConstant.CUSTOMER_ID,customer.getOpenid());
-        claims.put(JwtClaimsConstant.USER_ID,customer.getId());
-        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
-        log.info("手机号码:{}",customer.getMobile());
-        CustomerLoginVO customerLoginVO = CustomerLoginVO.builder()
-                .id(customer.getId())
-                .openid(customer.getOpenid())
-                .token(token)
-                .name(customer.getName())
-                .is_customer(1)
-                .build();
-
-        return ResultUtil.success("success", customerLoginVO);
-    }
+    @PostMapping("/login")
+    @ApiOperation("微信登陆")
+    public Result login(@RequestBody UserLoginDTO userLoginDTO){
+
+        User user = userService.getUserByMobile(userLoginDTO.getTel());
+        UserLoginVO userLoginVO = new UserLoginVO();
 
-    /**
-     * 用户登陆
-     * @param userLoginDTO
-     * @return
-     */
-    public Result user_login(UserLoginDTO userLoginDTO){
-        User user= userService.findByPhoneNumberAndIsDelete(userLoginDTO.getTel());
-        if (ObjectUtils.isEmpty(user))
-            throw new IllegalArgumentException("User object is null");
         //为微信用户生成jwt令牌
         Map<String ,Object> claims=new HashMap<>();
-        claims.put(JwtClaimsConstant.USER_ID,user.getId());
+        Long userId = null;
+
+        if (!ObjectUtils.isEmpty(user)){
+            userLoginVO.setId(user.getId());
+            userLoginVO.setRole(user.getRole());
+            userLoginVO.setOpenid(user.getOpenid());
+        }else{
+            CustomerVO customer = customerService.getCustomerByMobile(userLoginDTO.getTel());
+            if(ObjectUtils.isEmpty(customer)) {
+                Customer customer1 = new Customer();
+                customer1.setMobile(userLoginDTO.getTel());
+                //补充
+                customerService.addCustomer(customer1);
+
+                customer = customerService.getCustomerByMobile(userLoginDTO.getTel());
+            }
+            userLoginVO.setId(customer.getId());
+            userLoginVO.setRole(RoleEnum.EXTERNAL.getMsg());
+            userLoginVO.setOpenid(customer.getOpenid());
+        }
+
+        claims.put(JwtClaimsConstant.USER_ID,userLoginVO.getId());
         String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
-        log.info("手机号码:{}",userLoginDTO.getTel());
-        log.info("用户ID:{}",user.getId());
-        UserLoginVO userLoginVO = UserLoginVO.builder()
-                .id(user.getId())
-                .openid(user.getOpenid())
-                .token(token)
-                .is_customer(0)
-                .username(user.getUsername())
-                .build();
+        userLoginVO.setToken(token);
 
         return ResultUtil.success("success", userLoginVO);
     }
+//    @GetMapping("/get_sessionId")
+//    @ApiOperation("获取微信openid")
+//    public Result get_sessionId(String code){
+//        return userService.get_sessionId(code);
+//    }
+//    public Result customer_login(Customer customer){
+//        customer=customerService.findBymobileAndIsDelete(customer.getMobile());
+//        if (ObjectUtils.isEmpty(customer))
+//            throw new IllegalArgumentException("Customer object is null");
+//        //为微信用户生成jwt令牌
+//        Map<String ,Object> claims=new HashMap<>();
+//        //用openid还是id?
+//        //claims.put(JwtClaimsConstant.CUSTOMER_ID,customer.getOpenid());
+//        claims.put(JwtClaimsConstant.USER_ID,customer.getId());
+//        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
+//        log.info("手机号码:{}",customer.getMobile());
+//        CustomerLoginVO customerLoginVO = CustomerLoginVO.builder()
+//                .id(customer.getId())
+//                .openid(customer.getOpenid())
+//                .token(token)
+//                .name(customer.getName())
+//                .is_customer(1)
+//                .build();
+//
+//        return ResultUtil.success("success", customerLoginVO);
+//    }
+//
+//    /**
+//     * 用户登陆
+//     * @param userLoginDTO
+//     * @return
+//     */
+//    public Result user_login(UserLoginDTO userLoginDTO){
+//        User user= userService.findByPhoneNumberAndIsDelete(userLoginDTO.getTel());
+//        if (ObjectUtils.isEmpty(user))
+//            throw new IllegalArgumentException("User object is null");
+//        //为微信用户生成jwt令牌
+//        Map<String ,Object> claims=new HashMap<>();
+//        claims.put(JwtClaimsConstant.USER_ID,user.getId());
+//        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
+//        log.info("手机号码:{}",userLoginDTO.getTel());
+//        log.info("用户ID:{}",user.getId());
+//        UserLoginVO userLoginVO = UserLoginVO.builder()
+//                .id(user.getId())
+//                .openid(user.getOpenid())
+//                .token(token)
+//                .role(user.getRole())
+//                .is_customer(0)
+//                .userName(user.getUsername())
+//                .build();
+//
+//        return ResultUtil.success("success", userLoginVO);
+//    }
+//
+//    /**
+//     * 注册客户
+//     * @param customer
+//     * @return
+//     */
+//    public Result register(Customer customer){
+//        customer.setCreateTime(LocalDateTime.now()
+//                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        customer.setUpdateTime(LocalDateTime.now()
+//                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        customer.setIsDelete(false);
+//        customerService.addCustomer(customer);
+//        return this.customer_login(customer);
+//    }
+//
+//    @PostMapping("/login_wechat")
+//    @ApiOperation("微信手机号登陆")
+//    public Result login(@RequestBody WeChatLoginDTO weChatLoginDTO){
+//        String access_token=wxService.getAccessToken();
+//        String phoneNumber=wxService.getUserPhoneNumber(access_token,weChatLoginDTO.getCode());
+//        boolean user_is_exist = userService.existsByMobileAndIsDelete(phoneNumber);
+//        boolean customer_is_exist=customerService.existsBymobileAndIsDelete(phoneNumber);
+//        log.info("code:{}",phoneNumber);
+//        log.info("用户是否存在:{}",user_is_exist);
+//        if(!customer_is_exist&&!user_is_exist){
+//            Customer customer = new Customer();
+//            customer.setMobile(phoneNumber);
+//            customer.setOpenid(weChatLoginDTO.getOpenid());
+//            return this.register(customer);
+//        }else if(customer_is_exist){   //存在客户
+//            Customer customer=customerService.findBymobileAndIsDelete(phoneNumber);
+//            return this.customer_login(customer);
+//        }else { //存在用户
+//            UserLoginDTO userLoginDTO = new UserLoginDTO();
+//            userLoginDTO.setTel(phoneNumber);
+//            return this.user_login(userLoginDTO);
+//        }
+//    }
+//    @PostMapping("/login")
+//    @ApiOperation("账号登陆")
+//    public Result login(@RequestBody UserLoginDTO userLoginDTO){
+//        String phoneNumber=userLoginDTO.getTel();
+//        boolean user_is_exist = userService.existsByMobileAndIsDelete(phoneNumber);
+//        boolean customer_is_exist=customerService.existsBymobileAndIsDelete(phoneNumber);
+//        if(!customer_is_exist&&!user_is_exist){
+//            Customer customer = new Customer();
+//            customer.setMobile(phoneNumber);
+//            customer.setOpenid(userLoginDTO.getOpenid());
+//            return this.register(customer);
+//        }else if(customer_is_exist){
+//            Customer customer=customerService.findBymobileAndIsDelete(phoneNumber);
+//            return this.customer_login(customer);
+//        }else{
+//            return this.user_login(userLoginDTO);
+//        }
+//    }
 
-    /**
-     * 注册客户
-     * @param customer
-     * @return
-     */
-    public Result register(Customer customer){
-        customer.setCreateTime(LocalDateTime.now()
-                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-        customer.setUpdateTime(LocalDateTime.now()
-                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-        customerService.createCustomer(customer);
-        return this.customer_login(customer);
+
+    @PostMapping("/role")
+    @ApiOperation("添加用户角色")
+    public Result addRole(@RequestParam Long userId, @RequestBody Role role){
+        roleRepository.save(role);
+        return ResultUtil.success("success");
     }
 
-    @PostMapping("/login_wechat")
-    @ApiOperation("微信手机号登陆")
-    public Result login(@RequestBody WeChatLoginDTO weChatLoginDTO){
-        String access_token=wxService.getAccessToken();
-        String phoneNumber=wxService.getUserPhoneNumber(access_token,weChatLoginDTO.getCode());
-        boolean user_is_exist = userService.existsByMobileAndIsDelete(phoneNumber);
-        boolean customer_is_exist=customerService.existsBymobileAndIsDelete(phoneNumber);
-        log.info("code:{}",phoneNumber);
-        log.info("用户是否存在:{}",user_is_exist);
-        if(!customer_is_exist&&!user_is_exist){
-            Customer customer = new Customer();
-            customer.setMobile(phoneNumber);
-            customer.setOpenid(weChatLoginDTO.getOpenid());
-            return this.register(customer);
-        }else if(customer_is_exist){   //存在客户
-            Customer customer=customerService.findBymobileAndIsDelete(phoneNumber);
-            return this.customer_login(customer);
-        }else { //存在用户
-            UserLoginDTO userLoginDTO = new UserLoginDTO();
-            userLoginDTO.setTel(phoneNumber);
-            return this.user_login(userLoginDTO);
-        }
+    @GetMapping("/user/info")
+    @ApiOperation("查询用户信息")
+    public Result findUserInfo(){
+        return ResultUtil.success("success");
     }
-    @PostMapping("/login")
-    @ApiOperation("账号登陆")
-    public Result login(@RequestBody UserLoginDTO userLoginDTO){
-        String phoneNumber=userLoginDTO.getTel();
-        boolean user_is_exist = userService.existsByMobileAndIsDelete(phoneNumber);
-        boolean customer_is_exist=customerService.existsBymobileAndIsDelete(phoneNumber);
-        if(!customer_is_exist&&!user_is_exist){
-            Customer customer = new Customer();
-            customer.setMobile(phoneNumber);
-            customer.setOpenid(userLoginDTO.getOpenid());
-            return this.register(customer);
-        }else if(customer_is_exist){
-            Customer customer=customerService.findBymobileAndIsDelete(phoneNumber);
-            return this.customer_login(customer);
-        }else{
-            return this.user_login(userLoginDTO);
-        }
+
+    @GetMapping("/customers")
+    @ApiOperation("查询所有客户")
+    public Result findAllCustomers(){
+        return ResultUtil.success("success", customerService.getAllCustomers(false));
+    }
+
+    @GetMapping("/customers/{id}")
+    @ApiOperation("按id选择客户")
+    public Result findCustomerById(@PathVariable Long id){
+        return ResultUtil.success("success", customerService.findByCustomerIdAndIsDelete( id, false));
+    }
+
+    @GetMapping("/customers/{key}")
+    @ApiOperation("按关键字(姓名/手机号)选择客户")
+    public Result findCustomerByKey(@PathVariable("key") String key){
+        return ResultUtil.success("success", customerService.getCustomerByKey(key,false));
+    }
+
+    @GetMapping("/users")
+    @ApiOperation("查询所有用户")
+    public Result findAllUsers(Boolean isDelete){
+        return ResultUtil.success("success", userService.getAllUsers(isDelete));
+    }
+
+    @GetMapping("/recommenders")
+    @ApiOperation("查询所有推荐人")
+    public Result findAllRecommenders(Boolean isDelete){
+        return ResultUtil.success("success", userService.getAllRecommenders(isDelete));
     }
 }

+ 24 - 0
src/main/java/com/loan/system/domain/dto/ApprovalRecordDTO.java

@@ -0,0 +1,24 @@
+package com.loan.system.domain.dto;
+
+import com.loan.system.domain.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApprovalRecordDTO implements Serializable {
+
+    private Long caseId;//业务ID
+    private String stepName;//环节名称
+    private Long approverId;//审批人ID
+    private String decision;//审批结果
+    private String comments;//审批意见
+
+
+
+}

+ 25 - 0
src/main/java/com/loan/system/domain/dto/CollateralDTO.java

@@ -0,0 +1,25 @@
+package com.loan.system.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CollateralDTO implements Serializable {
+    private Long caseId;//业务id
+    //private Long contractId;//合同id
+    private String collateralName;//押品名称
+    private String collateralType;//押品类型/业务属性
+    private Long ownerCustomerId;//押品所属客户id
+    private BigDecimal allocatedAmount;//押品分配金额
+    private String address;//押品信息地址
+    private String currentAddress;//押品实际地址
+    private Boolean isInvolvedInLitigation;//是否涉及诉讼
+    private String staus;//押品状态
+}

+ 26 - 0
src/main/java/com/loan/system/domain/dto/ContractDTO.java

@@ -0,0 +1,26 @@
+package com.loan.system.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Lob;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractDTO implements Serializable {
+
+    private String businessAttr;//业务属性
+    private Long caseId;//业务id
+    private Long customerId;//客户id
+    private String contractNo;// 合同编号
+    private String contractName;//合同名称
+    private BigDecimal contractAmount;//借款金额
+    private BigDecimal interestRate;//年利率
+    private Integer loanPeriod;//借款期限
+    private String content;//合同内容
+}

+ 21 - 0
src/main/java/com/loan/system/domain/dto/CustomersOtherDTO.java

@@ -0,0 +1,21 @@
+package com.loan.system.domain.dto;
+
+import com.loan.system.domain.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomersOtherDTO implements Serializable {
+    private Long caseId;
+    private String name;
+    private String idNumber;
+    private String mobile;
+}

+ 28 - 0
src/main/java/com/loan/system/domain/dto/DisbursementDTO.java

@@ -0,0 +1,28 @@
+package com.loan.system.domain.dto;
+
+import com.loan.system.domain.entity.BaseEntity;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.math.BigDecimal;
+import java.time.Instant;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DisbursementDTO extends BaseEntity {
+    private Long caseId;//业务id
+    private Long payoutApproveUserId;//出款审批人 id
+    private Long payoutOperatorUserId;//财务出款人
+    private Long applyBy;//出款上报人id
+    //private String disbursementType;//押品/财务
+    private BigDecimal plannedAmount;//计划金额
+    private String plannedLocation;//计划地点
+    private String disbursementStatus;//出款状态
+    //private Long contractId;//合同id
+
+
+}

+ 25 - 0
src/main/java/com/loan/system/domain/dto/DisbursementRecordDTO.java

@@ -0,0 +1,25 @@
+package com.loan.system.domain.dto;
+
+import com.loan.system.domain.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DisbursementRecordDTO implements Serializable {
+    private Long disbursementId;
+    private BigDecimal amount;
+    private String createTime;
+    private String disbursementLocation;
+    private String disbursementAccount;
+    private String disbursementBank;
+
+}

+ 1 - 0
src/main/java/com/loan/system/domain/dto/DocumentDTO.java

@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Column;
 import java.io.Serializable;
 
 @Data

+ 39 - 0
src/main/java/com/loan/system/domain/dto/LoanCaseDTO.java

@@ -0,0 +1,39 @@
+package com.loan.system.domain.dto;
+
+import com.loan.system.domain.entity.Collateral;
+import com.loan.system.domain.entity.Contract;
+import com.loan.system.domain.entity.CustomersOther;
+import com.loan.system.domain.entity.Document;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class LoanCaseDTO implements Serializable {
+    private Long customerId;//客户id
+    //private Long caseId;//业务id
+    private String businessAttrs;//业务属性
+    private List<ContractDTO> contracts;//合同
+    //private String address;//房产实际地点
+    private List<Map<String,List<Integer>> > collateralAndContract;
+    private List<CollateralDTO> collateral;//押品
+    private String channelName;//渠道名称
+    private String group;//组别
+    private Long recommenderId;//推荐人id
+    private String businessType;//业务类型
+    private CustomersOtherDTO customers1;//其它客户1
+    private CustomersOtherDTO customers2;//其它客户2
+    private BigDecimal totalLoanAmount;//总借款金额
+//    private List<DocumentDTO> documents;// 文件
+    private String marriedStatus;//婚姻状况
+    private String currentAddress;// 房产产证地址
+    private Boolean isInvolvedInLitigation;//是否涉及诉讼
+}

+ 9 - 2
src/main/java/com/loan/system/domain/dto/UserLoginDTO.java

@@ -1,11 +1,18 @@
 package com.loan.system.domain.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class UserLoginDTO implements Serializable {
-    private String tel;
-    private String openid;
+    String code;
+    String tel;
+    String openid;
 }

+ 39 - 0
src/main/java/com/loan/system/domain/entity/ContractAndCollateral.java

@@ -0,0 +1,39 @@
+package com.loan.system.domain.entity;
+
+import lombok.*;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+
+@Entity
+@Table(name = "contract_case_collateral", uniqueConstraints = {
+        @UniqueConstraint(name = "uk_contract_collateral_case", columnNames = {"contract_id", "collateral_id", "case_id"})
+})
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractAndCollateral extends BaseEntity{
+    private static final long serialVersionUID = 27L;
+
+    @NotNull
+    @Column(name = "contract_id", nullable = false)
+    private Long contractId;
+
+    @NotNull
+    @Column(name = "collateral_id", nullable = false)
+    private Long collateralId;
+
+    @Column(name = "case_id")
+    private Long caseId;
+
+    @Column(name = "create_time")
+    private String createTime;
+
+    @Column(name = "update_time")
+    private String updateTime;
+
+    @Column(name = "is_delete")
+    private Boolean isDelete;
+
+}

+ 32 - 0
src/main/java/com/loan/system/domain/entity/ContractSeq.java

@@ -0,0 +1,32 @@
+package com.loan.system.domain.entity;
+
+import lombok.*;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+
+@Entity
+@Table(name = "contract_seq", uniqueConstraints = {
+        @UniqueConstraint(name = "uk_seq_data", columnNames = {"seq_data"})
+})
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractSeq extends BaseEntity{
+    private static final long serialVersionUID = 28L;
+
+    @Column(name = "business_attr", nullable = false, length = 20)
+    private  String businessAttr;
+
+    @Size(max = 8)
+    @NotNull
+    @Column(name = "seq_data", nullable = false, length = 8)
+    private String seqData;
+
+    @NotNull
+    @Column(name = "next_seq", nullable = false)
+    private Long nextSeq;
+
+}

+ 3 - 0
src/main/java/com/loan/system/domain/entity/CustomersOther.java

@@ -16,6 +16,9 @@ import java.time.Instant;
 public class CustomersOther extends BaseEntity{
     private static final long serialVersionUID = 6L;
 
+    @Column(name = "case_id",length = 20)
+    private Long caseId;
+
     @Column(name = "name", length = 100)
     private String name;
 

+ 2 - 2
src/main/java/com/loan/system/domain/entity/Disbursement.java

@@ -32,7 +32,7 @@ public class Disbursement extends BaseEntity{
     private Long applyBy;
 
     @Column(name = "apply_at")
-    private Instant applyAt;
+    private String applyAt;
 
     @Column(name = "disbursement_type", length = 10)
     private String disbursementType;
@@ -50,7 +50,7 @@ public class Disbursement extends BaseEntity{
     private Long contractId;
 
     @Column(name = "payout_time")
-    private Instant payoutTime;
+    private String payoutTime;
 
     @Column(name = "create_time")
     private String createTime;

+ 10 - 0
src/main/java/com/loan/system/domain/entity/DisbursementRecord.java

@@ -26,6 +26,16 @@ public class DisbursementRecord extends BaseEntity{
     @Column(name = "create_time")
     private String createTime;
 
+    @Column(name ="disbursement_location" ,length = 255)
+    private String disbursementLocation;
+
+    @Column(name ="disbursement_account" ,length = 20)
+    private String disbursementAccount;
+
+    @Column(name ="disbursement_bank" ,length = 255)
+    private String disbursementBank;
+
+
     @Column(name = "is_delete")
     private Boolean isDelete;
 

+ 0 - 6
src/main/java/com/loan/system/domain/entity/LoanCase.java

@@ -34,12 +34,6 @@ public class LoanCase extends BaseEntity{
     @Column(name = "recommender_id")
     private Long recommenderId;
 
-    @Column(name = "custom1_id")
-    private Long custom1Id;
-
-    @Column(name = "custom2_id")
-    private Long custom2Id;
-
     @Column(name = "requested_amount", precision = 18, scale = 2)
     private BigDecimal requestedAmount;
 

+ 26 - 0
src/main/java/com/loan/system/domain/enums/BusinessAttrEnum.java

@@ -0,0 +1,26 @@
+package com.loan.system.domain.enums;
+
+import io.swagger.models.auth.In;
+
+public enum BusinessAttrEnum {
+
+    ESTATE_MORTGAGE(1,"房产抵押"),
+    EQUITY_PLEDGE(2,"股权质押"),
+    MOVABLE_PLEDGE(3,"动产质押");
+
+    private final Integer  code;
+    private final String msg;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    BusinessAttrEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+}

+ 3 - 3
src/main/java/com/loan/system/domain/enums/ExceptionEnum.java

@@ -14,7 +14,7 @@ public enum ExceptionEnum {
      * -1   ~   -99     一般常见
      * -100 ~   -149    登录
      * -150 ~   -199    用户管理
-     * -200 ~   -249    项目管理
+     * -200 ~   -249    业务管理
      * -250 ~   -299    合同管理
      * -300 ~   -349    模块管理
      * -350 ~   -399    环节管理
@@ -55,7 +55,6 @@ public enum ExceptionEnum {
     TOKEN_EXPIRED(-101,"Token Expired"),
     WITHOUT_TOKEN(-102,"WITHOUT TOKEN"),
     LOGIN_EXPIRED(-103,"登录过期"),
-    WECHAT_LOGIN_ERROR(-104, "微信登录错误"),
 
     USER_NOT_EXIST(-110, "账户不存在"),
     USER_EXIST(-111, "账户已存在"),
@@ -68,7 +67,7 @@ public enum ExceptionEnum {
     PROJECT_NOT_EXIST(-201,"项目不存在"),
     PROJECT_LABEL_EXIST(-202,"项目标签已存在"),
     PROJECT_LABEL_NOT_EXIST(-203,"项目标签不存在"),
-    PROJECT_TYPE_EXIST(-204,"项目类型已存在"),
+    LOANCASE_IS_Completed(-204,"项目已经完成,无法重复提交"),
     PROJECT_TYPE_NOT_EXIST(-205,"项目类型不存在"),
     PROJECT_TYPE_IS_NECESSARY(-206,"项目类型是必须的"),
     PROJECT_LABEL_HAS_NOT_EXIST(-207,"存在项目标签不存在"),
@@ -108,6 +107,7 @@ public enum ExceptionEnum {
     STEP_USER_NOT_EXPECTED(-358,"环节处理人不是预期用户"),
     STEP_HAS_COMPLETEED(-359,"环节已完成,不能重复操作"),
 
+
     FUND_EXIST(-400,"经费已存在"),
     FUND_NOT_EXIST(-401,"经费不存在"),
     FUND_OUTPUT_EXIST(-402,"支出表已存在"),

+ 1 - 1
src/main/java/com/loan/system/domain/enums/StepPropertyEnum.java

@@ -40,7 +40,7 @@ public enum StepPropertyEnum {
     APPROVAL_ASSIGNMENT(522, "审批分派", false),
     EVIDENCE_CONFIRMATION(523, "确认取证", false),
 
-    COLLATERAL_DELIVERY(524, "押品送证环节", false),
+    COLLATERAL_DELIVERY(524, "押品送证环节", true),
     PLAN_SUBMISSION_2(525, "计划上报", false),
     APPROVAL_ASSIGNMENT_2(526, "审批分派", false),
     DELIVERY_CONFIRMATION(527, "送证确认", false);

+ 4 - 0
src/main/java/com/loan/system/domain/pojo/ContractInformation.java

@@ -0,0 +1,4 @@
+package com.loan.system.domain.pojo;
+
+public class ContractInformation {
+}

+ 16 - 0
src/main/java/com/loan/system/domain/pojo/TemplateMessage.java

@@ -0,0 +1,16 @@
+package com.loan.system.domain.pojo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class TemplateMessage {
+    private String touser;              // 接收者 openid
+    private String template_id;         // 模板 ID
+    private String page;                // 小程序内部页面路径(如 pages/review/detail?id=1)
+    private String url;                 // 可选,H5 外部链接
+    private Map<String, Object> miniprogram; // 可选,跳转其他小程序
+    private Map<String, Map<String, String>> data; // 模板数据
+    private String client_msg_id;
+}

+ 22 - 0
src/main/java/com/loan/system/domain/vo/ApprovalRecordVO.java

@@ -0,0 +1,22 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApprovalRecordVO implements Serializable {
+
+    private Long caseId;//业务ID
+    private String stepName;//环节名称
+    private Long approverId;//审批人ID
+    private String decision;//审批结果
+    private String comments;//审批意见
+
+
+
+}

+ 25 - 0
src/main/java/com/loan/system/domain/vo/CollateralVO.java

@@ -0,0 +1,25 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CollateralVO implements Serializable {
+    private Long id;
+    private Long caseId;//业务id
+    //private Long contractId;//合同id
+    private String collateralName;//押品名称
+    private String collateralType;//押品类型/业务属性
+    private Long ownerCustomerId;//押品所属客户id
+    private BigDecimal allocatedAmount;//押品分配金额
+    private String address;//押品信息地址
+    private String currentAddress;//押品实际地址
+    private Boolean isInvolvedInLitigation;//是否涉及诉讼
+    private String staus;//押品状态
+}

+ 28 - 0
src/main/java/com/loan/system/domain/vo/ContractVO.java

@@ -0,0 +1,28 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractVO implements Serializable {
+    private Long id;
+    private String businessAttr;//业务属性
+    private Long caseId;//业务id
+    private Long customerId;//客户id
+    private String contractNo;// 合同编号
+    private String contractName;//合同名称
+    private BigDecimal contractAmount;//借款金额
+    private BigDecimal interestRate;//年利率
+    private Integer loanPeriod;//借款期限
+    private String content;//合同内容
+    private Boolean signedByCustomer;//是否签署
+    private Long sifnedId;//电子签名附件id
+    private String commitedId;//承诺签名id
+    private String signedTime;//签署实际
+}

+ 23 - 0
src/main/java/com/loan/system/domain/vo/CustomerVO.java

@@ -0,0 +1,23 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerVO implements Serializable {
+    private Long id;
+    private String openid;
+    private String name;
+    private String sex;
+    private String idNumber;
+    private String mobile;
+    private String marriedStatus;
+    private String bankAccount;
+    private Boolean faceAuth;
+}

+ 18 - 0
src/main/java/com/loan/system/domain/vo/CustomersOtherVO.java

@@ -0,0 +1,18 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomersOtherVO implements Serializable {
+    private Long id;//其它客户id
+    private Long caseId;
+    private String name;
+    private String idNumber;
+    private String mobile;
+}

+ 28 - 0
src/main/java/com/loan/system/domain/vo/DisbursementVO.java

@@ -0,0 +1,28 @@
+package com.loan.system.domain.vo;
+
+import com.loan.system.domain.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DisbursementVO extends BaseEntity {
+    private Long id;//出款单id
+    private Long caseId;//业务id
+    private Long payoutApproveUserId;//出款审批人 id
+    private Long payoutOperatorUserId;//财务出款人
+    private Long applyBy;//出款上报人id
+    private String applyAt;//出款申请时间
+    //private String disbursementType;//押品/财务
+    private BigDecimal plannedAmount;//计划金额
+    private String plannedLocation;//计划地点
+    private String disbursementStatus;//出款状态
+    private String collateralStatus;//押品状态
+
+
+
+}

+ 1 - 3
src/main/java/com/loan/system/domain/vo/DocumentVO.java

@@ -1,16 +1,14 @@
 package com.loan.system.domain.vo;
 
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 
 @Data
-@Builder
-@NoArgsConstructor
 @AllArgsConstructor
+@NoArgsConstructor
 public class DocumentVO implements Serializable {
     private Long id;//文档ID
     private Long caseId;//业务ID

+ 1 - 2
src/main/java/com/loan/system/domain/vo/LoanCasePreApprovalVo.java

@@ -11,8 +11,7 @@ import java.io.Serializable;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class LoanCasePreApprovalVo implements Serializable
-{
+public class LoanCasePreApprovalVo implements Serializable {
     private String Lead_Sales;
     private String Assist_Sales;
 }

+ 41 - 0
src/main/java/com/loan/system/domain/vo/LoanCaseVO.java

@@ -0,0 +1,41 @@
+package com.loan.system.domain.vo;
+
+import com.loan.system.domain.dto.CollateralDTO;
+import com.loan.system.domain.dto.ContractDTO;
+import com.loan.system.domain.dto.DocumentDTO;
+import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.entity.CustomersOther;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoanCaseVO implements Serializable {
+    private Long id;
+    private CustomerVO customer;
+    //private Long caseId;
+    private String businessAttrs;//业务属性
+    private List<ContractVO> contracts;
+    private String address;//房产实际地点
+    private List<Map<Long,List<Long>>> collateralAndContract;
+    private List<CollateralVO> collateral;//押品
+    private String channelName;//渠道名称
+    private String group;//组别
+    private Long recommenderId;//推荐人id
+    private String businessType;//业务类型
+    private CustomersOtherVO customers1;//其它客户1
+    private CustomersOtherVO customers2;//其它客户2
+    private BigDecimal totalLoanAmount;//总借款金额
+    private List<DocumentVO> documents;// 文件
+    private String currentAddress;// 房产产证地址
+    private Boolean isInvolvedInLitigation;//是否涉及诉讼
+    private Boolean IsDelete;
+}

+ 4 - 4
src/main/java/com/loan/system/domain/vo/UserLoginVO.java

@@ -8,16 +8,16 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
+@Builder
 public class UserLoginVO implements Serializable {
 
     private Long id;
     private String openid;
-    private String username;
     private String token;
-    private int is_customer;
-
+    private String userName;
+    private String role;
+    private Integer is_customer;
 
 }

+ 3 - 1
src/main/java/com/loan/system/exception/FileException.java

@@ -10,6 +10,8 @@ import java.io.IOException;
  * @Description
  */
 public class FileException extends IOException {
+    private static final long serialVersionUID = 716346130825379248L;
+    
     private Integer code;
 
     public FileException(Integer code, String msg){
@@ -19,7 +21,7 @@ public class FileException extends IOException {
 
     public FileException(ExceptionEnum exceptionEnum) {
         super(exceptionEnum.getMsg());
-        this.code = code;
+        this.code = exceptionEnum.getCode();
     }
 
     public Integer getCode() {

+ 2 - 5
src/main/java/com/loan/system/interceptor/JwtTokenUserInterceptor.java

@@ -34,6 +34,7 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
     private JwtProperties jwtProperties;
     @Autowired
     private UserService userService;
+
     /**
      * 在拦截的请求前校验jwt
      */
@@ -43,9 +44,6 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
             //当前拦截到的不是动态方法,直接放行
             return true;
         }
-        log.info("请求头中所有字段: {}", request.getHeaderNames());
-        log.info("Authorization 头: {}", request.getHeader("Authorization"));
-        log.info("用户自定义 token 头: {}", request.getHeader(jwtProperties.getUserTokenName()));
 
         //1、从请求头中获取令牌
         String token = request.getHeader(jwtProperties.getUserTokenName());
@@ -56,8 +54,6 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
             Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
             Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());
             BaseContext.setCurrentId(userId);
-            // 设置Spring Security认证信息
-            setSpringSecurityAuthentication(userId);
             //3、通过,放行
             return true;
         } catch (Exception ex) {
@@ -66,6 +62,7 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
             return false;
         }
     }
+
     /**
      * 设置Spring Security认证信息
      */

+ 3 - 3
src/main/java/com/loan/system/json/JacksonObjectMapper.java

@@ -10,6 +10,7 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
 
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -26,8 +27,7 @@ import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKN
 public class JacksonObjectMapper extends ObjectMapper {
 
     public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
-    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
-    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
+    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
     public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
 
     public JacksonObjectMapper() {
@@ -49,4 +49,4 @@ public class JacksonObjectMapper extends ObjectMapper {
         //注册功能模块 例如,可以添加自定义序列化器和反序列化器
         this.registerModule(simpleModule);
     }
-}
+}

+ 5 - 3
src/main/java/com/loan/system/loan_system.sql

@@ -14,6 +14,7 @@ CREATE TABLE `roles` (
 -- 2. users 表(用户表)
 CREATE TABLE `users` (
                          `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
+                         `openid` VARCHAR(128),
                          `username` VARCHAR(64) UNIQUE,
                          `password_hash` VARCHAR(255),
                          `real_name` VARCHAR(100),
@@ -79,10 +80,10 @@ CREATE TABLE `loan_case` (
                              `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
                              `case_no` VARCHAR(50) UNIQUE,
                              `customer_id` BIGINT,
-                             `business_type_id` BIGINT,
+                             `business_type` VARCHAR(20),
                              `business_attrs` VARCHAR(200),
-                             `channel_id` BIGINT,
-                             `remark_id` BIGINT,
+                             `channel_name` BIGINT,
+                             `remark_id` VARCHAR(20),
                              `custom1_id` BIGINT,
                              `custom2_id` BIGINT,
                              `requested_amount` DECIMAL(18,2),
@@ -101,6 +102,7 @@ CREATE TABLE `documents` (
                              `doc_type` VARCHAR(50),
                              `file_path` VARCHAR(500),
                              `file_name` VARCHAR(255),
+                              `file_size` BIGINT,
                              `is_current` BOOLEAN,
                              `create_time` DATETIME,
                              `update_time` DATETIME,

+ 10 - 8
src/main/java/com/loan/system/properties/WeChatProperties.java

@@ -11,12 +11,14 @@ public class WeChatProperties {
 
     private String appid; //小程序的appid
     private String secret; //小程序的秘钥
-//    private String mchid; //商户号
-//    private String mchSerialNo; //商户API证书的证书序列号
-//    private String privateKeyFilePath; //商户私钥文件
-//    private String apiV3Key; //证书解密的密钥
-//    private String weChatPayCertFilePath; //平台证书
-//    private String notifyUrl; //支付成功的回调地址
-//    private String refundNotifyUrl; //退款成功的回调地址
+    private String loginUrl = "https://api.weixin.qq.com/sns/jscode2session"; // 微信登录URL
+    
+    private String mchid; //商户号
+    private String mchSerialNo; //商户API证书的证书序列号
+    private String privateKeyFilePath; //商户私钥文件
+    private String apiV3Key; //证书解密的密钥
+    private String weChatPayCertFilePath; //平台证书
+    private String notifyUrl; //支付成功的回调地址
+    private String refundNotifyUrl; //退款成功的回调地址
 
-}
+}

+ 27 - 0
src/main/java/com/loan/system/repository/ApproveRecordRepository.java

@@ -0,0 +1,27 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.ApprovalRecord;
+import com.loan.system.domain.entity.Contract;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface ApproveRecordRepository extends JpaRepository<ApprovalRecord,Long> {
+    List<ApprovalRecord> findByCaseIdAndIsDelete(Long id, Boolean isDelete);
+
+    ApprovalRecord findByCaseIdAndIsDeleteAndStepNameAndApproverId(Long caseId, Boolean isDelete, String stepName,Long approverId);
+
+    @Modifying
+    @Transactional
+    @Query(value = "UPDATE approval_record SET decision = ?1, update_time = ?5, comments = ?6 WHERE case_id = ?2 AND step_name = ?3 AND is_delete = ?4 AND approver_id = ?7", nativeQuery = true)
+    void updateDecisionByCaseIdAndStepNameAndIsDeleteAndApproverId(String decision, Long caseId, String stepName, Boolean isDelete,String updateTime,String  comments, Long approverId);
+
+}

+ 46 - 0
src/main/java/com/loan/system/repository/CollateralRepository.java

@@ -0,0 +1,46 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Collateral;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface CollateralRepository extends JpaRepository<Collateral,Long> {
+
+    List<Collateral> findByCaseIdAndIsDelete(Long caseId, boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE Collateral c SET " +
+            "c.caseId = CASE WHEN :#{#collateral.caseId} IS NOT NULL THEN :#{#collateral.caseId} ELSE c.caseId END, " +
+            "c.contractId = CASE WHEN :#{#collateral.contractId} IS NOT NULL THEN :#{#collateral.contractId} ELSE c.contractId END, " +
+            "c.collateralName = CASE WHEN :#{#collateral.collateralName} IS NOT NULL THEN :#{#collateral.collateralName} ELSE c.collateralName END, " +
+            "c.collateralType = CASE WHEN :#{#collateral.collateralType} IS NOT NULL THEN :#{#collateral.collateralType} ELSE c.collateralType END, " +
+            "c.ownerCustomerId = CASE WHEN :#{#collateral.ownerCustomerId} IS NOT NULL THEN :#{#collateral.ownerCustomerId} ELSE c.ownerCustomerId END, " +
+            "c.allocatedAmount = CASE WHEN :#{#collateral.allocatedAmount} IS NOT NULL THEN :#{#collateral.allocatedAmount} ELSE c.allocatedAmount END, " +
+            "c.address = CASE WHEN :#{#collateral.address} IS NOT NULL THEN :#{#collateral.address} ELSE c.address END, " +
+            "c.currentAddress = CASE WHEN :#{#collateral.currentAddress} IS NOT NULL THEN :#{#collateral.currentAddress} ELSE c.currentAddress END, " +
+            "c.evalPrice = CASE WHEN :#{#collateral.evalPrice} IS NOT NULL THEN :#{#collateral.evalPrice} ELSE c.evalPrice END, " +
+            "c.isInvolvedInLitigation = CASE WHEN :#{#collateral.isInvolvedInLitigation} IS NOT NULL THEN :#{#collateral.isInvolvedInLitigation} ELSE c.isInvolvedInLitigation END, " +
+            "c.staus = CASE WHEN :#{#collateral.staus} IS NOT NULL THEN :#{#collateral.staus} ELSE c.staus END, " +
+            "c.updateTime = CASE WHEN :#{#collateral.updateTime} IS NOT NULL THEN :#{#collateral.updateTime} ELSE c.updateTime END, " +
+            "c.isDelete = CASE WHEN :isDelete IS NOT NULL THEN :isDelete ELSE c.isDelete END " +
+            "WHERE c.id = :id and c.isDelete = false")
+    void updateCollateralById(Long id, Collateral collateral, boolean isDelete);
+
+    @Query("SELECT c FROM Collateral c WHERE c.collateralName = ?1 AND c.caseId = ?2 AND c.isDelete = ?3")
+    Collateral findCollateralByNameAndCaseId(String collateralName, Long caseId, boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("delete FROM Collateral c WHERE c.caseId = ?1")
+    void deleteAllByCaseId(Long caseId);
+}

+ 25 - 0
src/main/java/com/loan/system/repository/ContractAndCollateralRepository.java

@@ -0,0 +1,25 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Collateral;
+import com.loan.system.domain.entity.ContractAndCollateral;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface ContractAndCollateralRepository extends JpaRepository<ContractAndCollateral,Long> {
+
+    @Transactional
+    @Modifying
+    @Query("delete from ContractAndCollateral c where c.caseId = ?1")
+    void deleteAllByCaseId(Long caseId);
+
+    List<ContractAndCollateral> findByCaseIdAndIsDelete(Long caseId, Boolean isDelete);
+}

+ 64 - 0
src/main/java/com/loan/system/repository/ContractRepository.java

@@ -0,0 +1,64 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Contract;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface ContractRepository extends JpaRepository<Contract,Long> {
+
+    boolean existsByCaseIdAndBusinessAttrAndIsDelete(Long caseId, String businessAttr, boolean b);
+
+    @Query("SELECT c FROM Contract c WHERE c.caseId = :caseId AND c.businessAttr = :businessAttr AND c.isDelete = :isDelete")
+    Contract findByCaseIdAndBusinessAttrAndIsDelete(Long caseId, String businessAttr, boolean b);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE Contract c SET " +
+            "c.businessAttr = CASE WHEN :#{#contract.businessAttr} IS NOT NULL THEN :#{#contract.businessAttr} ELSE c.businessAttr END, " +
+            "c.caseId = CASE WHEN :#{#contract.caseId} IS NOT NULL THEN :#{#contract.caseId} ELSE c.caseId END, " +
+            "c.customerId = CASE WHEN :#{#contract.customerId} IS NOT NULL THEN :#{#contract.customerId} ELSE c.customerId END, " +
+            "c.contractNo = CASE WHEN :#{#contract.contractNo} IS NOT NULL THEN :#{#contract.contractNo} ELSE c.contractNo END, " +
+            "c.contractName = CASE WHEN :#{#contract.contractName} IS NOT NULL THEN :#{#contract.contractName} ELSE c.contractName END, " +
+            "c.contractVersion = CASE WHEN :#{#contract.contractVersion} IS NOT NULL THEN :#{#contract.contractVersion} ELSE c.contractVersion END, " +
+            "c.contractAmount = CASE WHEN :#{#contract.contractAmount} IS NOT NULL THEN :#{#contract.contractAmount} ELSE c.contractAmount END, " +
+            "c.interestRate = CASE WHEN :#{#contract.interestRate} IS NOT NULL THEN :#{#contract.interestRate} ELSE c.interestRate END, " +
+            "c.loanPeriod = CASE WHEN :#{#contract.loanPeriod} IS NOT NULL THEN :#{#contract.loanPeriod} ELSE c.loanPeriod END, " +
+            "c.content = CASE WHEN :#{#contract.content} IS NOT NULL THEN :#{#contract.content} ELSE c.content END, " +
+            "c.signedByCustomer = CASE WHEN :#{#contract.signedByCustomer} IS NOT NULL THEN :#{#contract.signedByCustomer} ELSE c.signedByCustomer END, " +
+            "c.sifnedId = CASE WHEN :#{#contract.sifnedId} IS NOT NULL THEN :#{#contract.sifnedId} ELSE c.sifnedId END, " +
+            "c.signedTime = CASE WHEN :#{#contract.signedTime} IS NOT NULL THEN :#{#contract.signedTime} ELSE c.signedTime END, " +
+            "c.updateTime = CASE WHEN :#{#contract.updateTime} IS NOT NULL THEN :#{#contract.updateTime} ELSE c.updateTime END, " +
+            "c.isDelete = CASE WHEN :isDelete IS NOT NULL THEN :isDelete ELSE c.isDelete END " +
+            "WHERE c.id = :id and c.isDelete = :isDelete")
+    void updateContractById(Long id, Contract contract, boolean isDelete);
+
+    List<Contract> findByCaseIdAndIsDelete(Long caseId, boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE Contract c SET c.isPush = true WHERE c.id = :contractId")
+    void updateIsPushById(Long contractId);
+
+    @Query("SELECT c FROM Contract c WHERE c.caseId = ?1 AND c.isPush = ?2 AND c.isDelete = ?3 ")
+    List<Contract> findByCaseIdAndIsPush(Long caseId,Boolean isPush,boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("delete FROM Contract c WHERE c.caseId = ?1")
+    void deleteAllByCaseId(Long caseID);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE Contract c SET c.contractNo = ?2 WHERE c.id = ?1")
+    void updateContractNoById(Long id, String contractNo);
+}

+ 26 - 0
src/main/java/com/loan/system/repository/ContractSeqRepository.java

@@ -0,0 +1,26 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Contract;
+import com.loan.system.domain.entity.ContractSeq;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface ContractSeqRepository extends JpaRepository<ContractSeq,Long> {
+
+    @Query("select c from ContractSeq c where c.seqData = ?1 AND c.businessAttr = ?2")
+    ContractSeq findSeqBySeqDataAndBusinessAttr(String tody,String businessAttr);
+
+    @Transactional
+    @Modifying
+    @Query("update ContractSeq c set c.nextSeq = ?2 where c.id = ?1")
+    void updateSeqById(Long id, long l);
+}

+ 43 - 0
src/main/java/com/loan/system/repository/CustomerOtherRepository.java

@@ -0,0 +1,43 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.dto.CustomersOtherDTO;
+import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.entity.CustomersOther;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface CustomerOtherRepository extends JpaRepository<CustomersOther,Long> {
+
+    @Query("select c from CustomersOther c where c.idNumber = ?1 AND c.isDelete = ?2")
+    CustomersOther findByIdNumberAndIsDelete(String idNumber, boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE CustomersOther c SET " +
+           "c.name = CASE WHEN :#{#customersOtherDTO.name} IS NOT NULL THEN :#{#customersOtherDTO.name} ELSE c.name END, " +
+           "c.idNumber = CASE WHEN :#{#customersOtherDTO.idNumber} IS NOT NULL THEN :#{#customersOtherDTO.idNumber} ELSE c.idNumber END, " +
+           "c.mobile = CASE WHEN :#{#customersOtherDTO.mobile} IS NOT NULL THEN :#{#customersOtherDTO.mobile} ELSE c.mobile END " +
+           "WHERE c.id = :id")
+    void updateCustomerById(@Param("customersOtherDTO") CustomersOtherDTO customersOtherDTO, @Param("id") Long id);
+
+    @Query("select c from CustomersOther c where c.id = ?1 and c.isDelete = ?2")
+    CustomersOther findByCustomerOtherId(Long Id, boolean isDelete);
+
+    List<CustomersOther> findByCaseIdAndIsDelete(Long caseId, boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("DELETE FROM CustomersOther c WHERE c.caseId = ?1")
+    void deleteAllByCaseId(Long caseId);
+}

+ 25 - 12
src/main/java/com/loan/system/repository/CustomerRepository.java

@@ -1,25 +1,38 @@
 package com.loan.system.repository;
 
 import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.entity.CustomersOther;
 import com.loan.system.domain.entity.User;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.time.Instant;
-import java.util.Date;
+import javax.transaction.Transactional;
+import java.util.List;
 
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
 public interface CustomerRepository extends JpaRepository<Customer,Long> {
-    boolean existsBymobileAndIsDelete(String mobile,Boolean isDelete);
+    boolean existsByMobileAndIsDelete(String mobile,Boolean isDelete);
+
+    @Query("select c from Customer c where c.mobile = ?1 and c.isDelete = ?2")
+    Customer findByMobile(String mobile,Boolean isDelete);
+
+    List<Customer> findByIsDelete(Boolean isDelete);
+
+    Customer findByIdAndIsDelete(Long id, Boolean isDelete);
+    
+    @Query("select c from Customer c where (c.mobile = ?1 or c.name = ?1) and c.isDelete = ?2")
+    Customer findByKey(String key, boolean b);
+
     @Transactional
     @Modifying
-    @Query(value = "INSERT INTO customers (openid, name, sex, id_number, mobile, register_source, bank_account, face_auth, create_time, update_time, is_delete) " +
-            "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?9, 0)", nativeQuery = true)
-    void createCustomer(String openid, String name, String sex, String idNumber, String mobile,
-                        String registerSource, String bankAccount, Boolean faceAuth, String createTime,String updateTime);
-
-    Customer findByMobileAndIsDelete(String phoneNumber,Boolean isDelete);
+    @Query("update Customer c set c.marriedStatus = ?2 where c.id = ?1")
+    void updateMarriedStatusById(Long customerId, String marriedStatus);
 
-    Customer findByIdAndIsDelete(Long id,Boolean isDelete);
-}
+    @Query("select co from Customer co where co.id = ?1 and co.isDelete = ?2")
+    Customer findByCustomerId(Long customerId , Boolean isDelete);
+}

+ 15 - 0
src/main/java/com/loan/system/repository/DictAttributeRepository.java

@@ -0,0 +1,15 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.DictAttribute;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface DictAttributeRepository extends JpaRepository<DictAttribute,Long> {
+    List<DictAttribute> findByIsDelete(Boolean isDelete);
+}

+ 15 - 0
src/main/java/com/loan/system/repository/DictChannelRepository.java

@@ -0,0 +1,15 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.DictChannel;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface DictChannelRepository extends JpaRepository<DictChannel,Long> {
+    List<DictChannel> findByIsDelete(Boolean isDelete);
+}

+ 16 - 0
src/main/java/com/loan/system/repository/DictLocationRepository.java

@@ -0,0 +1,16 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.DictAttribute;
+import com.loan.system.domain.entity.DictLocation;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface DictLocationRepository extends JpaRepository<DictLocation,Long> {
+    List<DictLocation> findByIsDelete(Boolean isDelete);
+}

+ 16 - 0
src/main/java/com/loan/system/repository/DictStepRepository.java

@@ -0,0 +1,16 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.DictStep;
+import com.loan.system.domain.entity.DictType;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface DictStepRepository extends JpaRepository<DictStep,Long> {
+    List<DictStep> findByIsDelete(Boolean isDelete);
+}

+ 17 - 0
src/main/java/com/loan/system/repository/DictTypeRepository.java

@@ -0,0 +1,17 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.DictAttribute;
+import com.loan.system.domain.entity.DictBusinessType;
+import com.loan.system.domain.entity.DictType;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface DictTypeRepository extends JpaRepository<DictBusinessType,Long> {
+    List<DictBusinessType> findByIsDelete(Boolean isDelete);
+}

+ 19 - 0
src/main/java/com/loan/system/repository/DisbursementRepository.java

@@ -0,0 +1,19 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Collateral;
+import com.loan.system.domain.entity.Disbursement;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface DisbursementRepository extends JpaRepository<Disbursement,Long> {
+
+    @Query("select d from Disbursement d where d.caseId = ?1")
+    Disbursement findDisbursementDetailsById(Long caseId);
+}

+ 30 - 3
src/main/java/com/loan/system/repository/DocumentRepository.java

@@ -1,14 +1,41 @@
 package com.loan.system.repository;
 
+import com.loan.system.domain.dto.DocumentDTO;
+import com.loan.system.domain.entity.DictBusinessType;
 import com.loan.system.domain.entity.Document;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
 public interface DocumentRepository extends JpaRepository<Document,Long> {
-    List<Document> findDocumentByCaseIdAndIsDelete(Long CaseId, Boolean IsDelete);
+
+    List<Document> findByCaseId(Long caseId);
 
     @Query("select d from Document d where d.id = ?1")
-    Document findByDocumentIdAndIsDelete(Long signId);
-}
+    Document findByDocumentId(Long signId);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE Document d SET " +
+            "d.ownerId = CASE WHEN :#{#document.ownerId} IS NOT NULL THEN :#{#document.ownerId} ELSE d.ownerId END, " +
+            "d.docType = CASE WHEN :#{#document.docType} IS NOT NULL THEN :#{#document.docType} ELSE d.docType END, " +
+            "d.filePath = CASE WHEN :#{#document.filePath} IS NOT NULL THEN :#{#document.filePath} ELSE d.filePath END, " +
+            "d.fileName = CASE WHEN :#{#document.fileName} IS NOT NULL THEN :#{#document.fileName} ELSE d.fileName END, " +
+            "d.fileSize = CASE WHEN :#{#document.fileSize} IS NOT NULL THEN :#{#document.fileSize} ELSE d.fileSize END ," +
+            "d.updateTime = CASE WHEN :#{#document.updateTime} IS NOT NULL THEN :#{#document.updateTime} ELSE d.updateTime END " +
+            "WHERE d.caseId = :caseId AND d.dictType = :dictType")
+    void updateByCaseIdAndDictType(Long caseId, String dictType, Document document);
+
+    @Transactional
+    @Modifying
+    @Query("DELETE FROM Document d WHERE d.caseId = :caseId AND d.dictType = :fileType")
+    void deleteFileByCaseIdAndDictType(Long caseId, String fileType);
+}

+ 48 - 0
src/main/java/com/loan/system/repository/LoanRepository.java

@@ -0,0 +1,48 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.LoanCase;
+import com.loan.system.domain.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface LoanRepository extends JpaRepository<LoanCase,Long> {
+
+    List<LoanCase> findByIsCompleteAndIsDelete(Boolean isComplete, boolean isDelete);
+
+    @Transactional
+    @Modifying
+    @Query("UPDATE LoanCase l SET " +
+           "l.customerId = CASE WHEN :#{#loanCase.customerId} IS NOT NULL THEN :#{#loanCase.customerId} ELSE l.customerId END, " +
+           "l.businessType = CASE WHEN :#{#loanCase.businessType} IS NOT NULL THEN :#{#loanCase.businessType} ELSE l.businessType END, " +
+           "l.businessAttrs = CASE WHEN :#{#loanCase.businessAttrs} IS NOT NULL THEN :#{#loanCase.businessAttrs} ELSE l.businessAttrs END, " +
+           "l.channelName = CASE WHEN :#{#loanCase.channelName} IS NOT NULL THEN :#{#loanCase.channelName} ELSE l.channelName END, " +
+           "l.recommenderId = CASE WHEN :#{#loanCase.recommenderId} IS NOT NULL THEN :#{#loanCase.recommenderId} ELSE l.recommenderId END, " +
+           "l.totalLoanAmount = CASE WHEN :#{#loanCase.totalLoanAmount} IS NOT NULL THEN :#{#loanCase.totalLoanAmount} ELSE l.totalLoanAmount END, " +
+           "l.isComplete = CASE WHEN :#{#loanCase.isComplete} IS NOT NULL THEN :#{#loanCase.isComplete} ELSE l.isComplete END, " +
+           "l.updateTime = CASE WHEN :#{#loanCase.updateTime} IS NOT NULL THEN :#{#loanCase.updateTime} ELSE l.updateTime END " +
+           "WHERE l.id = :caseId")
+    void updateLoanCaseById(@Param("loanCase") LoanCase loanCase, @Param("caseId") Long caseId);
+
+    @Query("SELECT l FROM LoanCase l WHERE l.id = :caseId and l.isDelete = :isDelete")
+    LoanCase findLoanCaseById(Long caseId, boolean isDelete);
+
+    @Modifying
+    @Transactional
+    @Query("update LoanCase set updateTime = ?3 where id = ?1 and isDelete = ?2")
+    void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete,String updateTime);
+
+    @Modifying
+    @Transactional
+    @Query("UPDATE LoanCase SET updateTime = ?3, isDelete = ?2 WHERE id = ?1 AND isDelete = ?2")
+    void logic_delete(Long id, boolean isDelete, String updateTime);
+}

+ 16 - 0
src/main/java/com/loan/system/repository/RecommenderRepository.java

@@ -0,0 +1,16 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.BizRecommender;
+import com.loan.system.domain.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface RecommenderRepository extends JpaRepository<BizRecommender,Long> {
+    List<BizRecommender> findByIsDelete(Boolean isDelete);
+}

+ 15 - 0
src/main/java/com/loan/system/repository/RoleRepository.java

@@ -0,0 +1,15 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Role;
+import com.loan.system.domain.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface RoleRepository extends JpaRepository<Role,Long> {
+}

+ 13 - 9
src/main/java/com/loan/system/repository/StepRepository.java

@@ -17,33 +17,37 @@ import java.util.List;
  */
 public interface StepRepository extends JpaRepository<Step,Long> {
 
-    @Modifying
     @Transactional
+    @Modifying
     @Query("update Step set status = ?1, " +
             "beginTime = CASE WHEN ?1 = '进行中' THEN ?4 ELSE beginTime END ," +
             "updateTime = CASE WHEN ?1 = '已完成' THEN ?4 ELSE updateTime END " +
             "where caseId = ?3 and stepName = ?2")
-
     void updateStatusByCaseIdAndStepName(String msg, String stepName, Long caseId,String currentTime);
 
     Step findByStepNameAndCaseId(String stepName, Long caseId);
 
-    @Modifying
     @Transactional
+    @Modifying
     @Query("update Step set userId1 = ?2 where caseId = ?3 and  stepName = ?1")
-    void updateUser1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId,String currentTime);
+    void updateUser1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
 
-    @Modifying
     @Transactional
+    @Modifying
     @Query("update Step set userId2 = ?2 where caseId = ?3 and  stepName = ?1")
-    void updateUser2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId,String currentTime);
+    void updateUser2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
 
     List<StepVO> findByCaseId(Long caseId);
 
-    @Query("select userId1 from Step where caseId = ?1 and stepName = ?2 and isDelete = ?3")
-    Long getLeadSalesIdAndIsDelete(Long caseId, String stepName,boolean isDelete);
+    @Modifying
+    @Transactional
+    @Query("update Step set userId1 = ?2 where caseId = ?3 and  stepName = ?1")
+    void updateUser1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId,String currentTime);
 
-    List<Step> findAllByCaseId(Long caseId);
+    @Modifying
+    @Transactional
+    @Query("update Step set userId2 = ?2 where caseId = ?3 and  stepName = ?1")
+    void updateUser2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId,String currentTime);
 
     @Modifying
     @Transactional

+ 15 - 0
src/main/java/com/loan/system/repository/UploadRepository.java

@@ -0,0 +1,15 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.entity.Document;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface UploadRepository extends JpaRepository<Document,Long> {
+}

+ 12 - 1
src/main/java/com/loan/system/repository/UserRepository.java

@@ -7,10 +7,21 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
+import java.util.List;
 import java.util.Set;
 
-
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
 public interface UserRepository extends JpaRepository<User,Long> {
+    User findByMobile(String mobile);
+
+    List<User> findByIsDelete(Boolean isDelete);
+
+    @Query("select u from User u where u.id in ?1 and u.isDelete = ?2")
+    User findByUserIdAndIsDelete(Long userId, Boolean isDelete);
 
     boolean existsByMobileAndIsDelete(String mobile,Boolean isDelete);
 

+ 7 - 2
src/main/java/com/loan/system/service/ApprovalService.java

@@ -1,16 +1,21 @@
 package com.loan.system.service;
 
+import com.loan.system.domain.dto.ApprovalRecordDTO;
 import com.loan.system.domain.entity.ApprovalRecord;
+import com.loan.system.domain.vo.ApprovalRecordVO;
 
 import java.util.List;
 
 public interface ApprovalService {
+    void addApprovalRecord(ApprovalRecordDTO approvalRecordDTO);
 
-    List<ApprovalRecord> findByCaseIdAndIsDelete(Long caseId);
+    List<ApprovalRecordVO> findByCaseIdAndIsDelete(Long caseId);
+
+    void addPreApprovalRecord(String label, Long currentId, Long caseId);
 
     void save(ApprovalRecord approvalRecord);
 
     void updateDecisionByCaseIdAndStepNameAndIsDelete(String decision, Long caseId, String stepName,String  comments,Long approverId);
 
-    ApprovalRecord findByCaseIdAndIsDeleteAndStepName(Long caseId, String stepName,Long approverId);
+    ApprovalRecordVO findByCaseIdAndIsDeleteAndStepName(Long caseId, String stepName, Long approverId);
 }

+ 19 - 0
src/main/java/com/loan/system/service/CollateralService.java

@@ -0,0 +1,19 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.dto.CollateralDTO;
+import com.loan.system.domain.entity.Collateral;
+import com.loan.system.domain.vo.CollateralVO;
+
+import java.util.List;
+
+public interface CollateralService {
+    List<CollateralVO> findByCaseId(Long caseId);
+
+    Collateral findCollateralByNameAndCaseId(String collateralName, Long caseId, boolean isDelete);
+
+    Collateral saveCollateral(CollateralDTO collateralDTO);
+
+    void updateCollateralById(Long id, CollateralDTO collateralDTO, boolean isDelete);
+
+    void deleteAllByCaseId(Long caseId);
+}

+ 13 - 0
src/main/java/com/loan/system/service/ContractAndCollateralService.java

@@ -0,0 +1,13 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.entity.ContractAndCollateral;
+
+import java.util.List;
+
+public interface ContractAndCollateralService {
+    void addContractAndCollateral(Long contractId, Long collateralId);
+
+    void deleteAllByCaseId(Long caseId);
+
+    List<ContractAndCollateral> findContractAndCollateralByCaseId(Long caseId);
+}

+ 11 - 0
src/main/java/com/loan/system/service/ContractSeqService.java

@@ -0,0 +1,11 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.entity.ContractSeq;
+
+public interface ContractSeqService {
+    ContractSeq findSeqBySeqDataAndBusinessAttr(String tody,String businessAttr);
+
+    ContractSeq addSeq(String tody,String businessAttr);
+
+    void updateSeqById(Long id, long l);
+}

+ 27 - 0
src/main/java/com/loan/system/service/ContractService.java

@@ -0,0 +1,27 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.dto.ContractDTO;
+import com.loan.system.domain.entity.Contract;
+import com.loan.system.domain.vo.ContractVO;
+
+import java.util.List;
+
+public interface ContractService {
+    Contract saveContract(ContractDTO contract);
+
+    Contract findContractByCaseIdAndBusinessAttr(Long caseId, String businessAttr, boolean b);
+
+    void updateContractById(Long id, ContractDTO contract, boolean isDelete);
+
+    List<ContractVO> findContractByCaseId(Long caseId);
+
+    void updateContractById1(Long contractId, Long commitedId,Long signId);
+
+    void updateIsPushById(Long contractId);
+
+    List<ContractVO> findContractByCaseIdAndIsPush(Long caseId, boolean isPush);
+
+    void deleteAllByCaseId(Long caseId);
+
+    void updateContractNoById(Long id, String contractNo);
+}

+ 22 - 0
src/main/java/com/loan/system/service/CustomerOtherService.java

@@ -0,0 +1,22 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.dto.CustomersOtherDTO;
+import com.loan.system.domain.dto.LoanCaseDTO;
+import com.loan.system.domain.entity.CustomersOther;
+import com.loan.system.domain.vo.CustomersOtherVO;
+
+import java.util.List;
+
+public interface CustomerOtherService {
+    CustomersOther addCustomers(CustomersOtherDTO customersOtherDTO);
+
+    CustomersOther findByIdNumber(String idNumber);
+
+    void updateCustomerById(CustomersOtherDTO customers1, Long id);
+
+    CustomersOtherVO findById(Long custom1Id);
+
+    List<CustomersOtherVO> findByCaseId(Long caseId);
+
+    void deleteAllByCaseId(Long caseId);
+}

+ 21 - 2
src/main/java/com/loan/system/service/CustomerService.java

@@ -1,10 +1,29 @@
 package com.loan.system.service;
 
 import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.vo.CustomerVO;
+
+import java.util.List;
 
 public interface CustomerService {
+    /**
+     * 新增客户
+     * @param customer 客户信息
+     * @return 保存后的客户信息
+     */
+    Customer addCustomer(Customer customer);
+
+    void updateMarriedStatusById(Long customerId, String marriedStatus);
+
+    CustomerVO findByCustomerIdAndIsDelete(Long customerId,Boolean isDelete);
+
+    List<CustomerVO> getAllCustomers(boolean b);
+
+    CustomerVO getCustomerByKey(String key, boolean b);
+
+    CustomerVO getCustomerByMobile(String tel);
+
     Customer findBymobileAndIsDelete(String phoneNumber);
     boolean existsBymobileAndIsDelete(String phoneNumber);
-    void createCustomer(Customer customer);
     Customer findByIdAndIsDelete(Long id);
-}
+}

+ 16 - 0
src/main/java/com/loan/system/service/DictionaryService.java

@@ -0,0 +1,16 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.entity.*;
+
+import java.util.List;
+
+public interface DictionaryService {
+
+    List<DictAttribute> getAllDictAttributes(Boolean isDelete);
+
+    List<DictBusinessType> getAllDictTypes(Boolean isDelete);
+
+    List<DictChannel> getAllDictChannels(Boolean isDelete);
+
+    List<DictLocation> getAllLocations(Boolean isDelete);
+}

+ 11 - 0
src/main/java/com/loan/system/service/DisbursementService.java

@@ -0,0 +1,11 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.dto.DisbursementDTO;
+import com.loan.system.domain.entity.Disbursement;
+import com.loan.system.domain.vo.DisbursementVO;
+
+public interface DisbursementService {
+    DisbursementVO addDisbursement(DisbursementDTO disbursementDTO);
+
+    DisbursementVO findDisbursementDetailsById(Long caseId);
+}

+ 7 - 1
src/main/java/com/loan/system/service/DocumentService.java

@@ -1,13 +1,19 @@
 package com.loan.system.service;
 
+import com.loan.system.domain.dto.DocumentDTO;
 import com.loan.system.domain.entity.Document;
 import com.loan.system.domain.vo.DocumentVO;
 
 import java.util.List;
 
 public interface DocumentService {
-    List<Document> findDocumentByCaseIdAndIsDelete(Long caseId);
+    List<DocumentVO> findByCaseId(Long caseId);
+
     DocumentVO uploadFile(Document document);
 
     Document findById(Long signId);
+
+    void updateDocumentByCaseIdAndDicType(Long caseId, String dictType, DocumentDTO documentDTO);
+
+    void deleteFileByCaseIdAndDictType(Long caseId, String fileType);
 }

+ 44 - 11
src/main/java/com/loan/system/service/Impl/ApprovalServiceImpl.java

@@ -1,34 +1,67 @@
 package com.loan.system.service.Impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.ApprovalRecordDTO;
 import com.loan.system.domain.entity.ApprovalRecord;
-import com.loan.system.repository.ApprovalRepository;
+import com.loan.system.domain.enums.StepPropertyEnum;
+import com.loan.system.domain.vo.ApprovalRecordVO;
+import com.loan.system.repository.ApproveRecordRepository;
 import com.loan.system.service.ApprovalService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Service
 public class ApprovalServiceImpl implements ApprovalService {
-    @Autowired
-    ApprovalRepository approvalRepository;
+    private final ApproveRecordRepository approveRecordRepository;
+
+    public ApprovalServiceImpl(ApproveRecordRepository approveRecordRepository) {
+        this.approveRecordRepository = approveRecordRepository;
+    }
+    @Override
+    public void addApprovalRecord(ApprovalRecordDTO approvalRecordDTO) {
+        ApprovalRecord approvalRecord = BeanUtil.copyProperties(approvalRecordDTO, ApprovalRecord.class);
+        approvalRecord.setIsDelete( false);
+        approvalRecord.setCreateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        approvalRecord.setUpdateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+        approveRecordRepository.save(approvalRecord);
+    }
 
     @Override
+    public void addPreApprovalRecord(String label, Long currentId, Long caseId) {
+        ApprovalRecord approvalRecord = new ApprovalRecord();
+        approvalRecord.setCaseId(caseId);
+        approvalRecord.setStepName(StepPropertyEnum.PRE_TRIAL.getLabel());
+        approvalRecord.setApproverId(currentId);
+        approvalRecord.setDecision("通过");
+        approvalRecord.setComments("跳过审批环节");
+        approvalRecord.setIsDelete( false);
+        approvalRecord.setCreateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        approvalRecord.setUpdateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
 
-    public List<ApprovalRecord> findByCaseIdAndIsDelete(Long id){
-        return approvalRepository.findByCaseIdAndIsDelete(id, false);
+        approveRecordRepository.save(approvalRecord);
+    }
+    @Override
+    public List<ApprovalRecordVO> findByCaseIdAndIsDelete(Long id){
+        return BeanUtil.copyToList(approveRecordRepository.findByCaseIdAndIsDelete(id, false), ApprovalRecordVO.class);
     }
 
     public void save(ApprovalRecord approvalRecord){
-        approvalRepository.save(approvalRecord);
+        approveRecordRepository.save(approvalRecord);
     }
 
     public void updateDecisionByCaseIdAndStepNameAndIsDelete(String decision, Long caseId, String stepName,String  comments,Long approverId){
-        approvalRepository.updateDecisionByCaseIdAndStepNameAndIsDeleteAndApproverId(decision, caseId, stepName, false, java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),comments,approverId);
+        approveRecordRepository.updateDecisionByCaseIdAndStepNameAndIsDeleteAndApproverId(decision, caseId, stepName, false, java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),comments,approverId);
     }
 
-    public ApprovalRecord findByCaseIdAndIsDeleteAndStepName(Long caseId,  String stepName,Long approverId){
-        return approvalRepository.findByCaseIdAndIsDeleteAndStepNameAndApproverId(caseId, false, stepName, approverId);
+    public ApprovalRecordVO findByCaseIdAndIsDeleteAndStepName(Long caseId, String stepName, Long approverId){
+        return BeanUtil.copyProperties(approveRecordRepository.findByCaseIdAndIsDeleteAndStepNameAndApproverId(caseId, false, stepName, approverId), ApprovalRecordVO.class);
     }
-
 }

+ 55 - 0
src/main/java/com/loan/system/service/Impl/CollateralServiceImpl.java

@@ -0,0 +1,55 @@
+package com.loan.system.service.Impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.CollateralDTO;
+import com.loan.system.domain.entity.Collateral;
+import com.loan.system.domain.vo.CollateralVO;
+import com.loan.system.repository.CollateralRepository;
+import com.loan.system.service.CollateralService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Service
+public class CollateralServiceImpl implements CollateralService {
+    private final CollateralRepository collateralRepository;
+
+    @Autowired
+    public CollateralServiceImpl(CollateralRepository collateralRepository) {
+        this.collateralRepository = collateralRepository;
+    }
+    @Override
+    public List<CollateralVO> findByCaseId(Long caseId) {
+        return BeanUtil.copyToList(collateralRepository.findByCaseIdAndIsDelete(caseId,false), CollateralVO.class);
+    }
+
+    @Override
+    public Collateral findCollateralByNameAndCaseId(String collateralName, Long caseId, boolean isDelete) {
+        return collateralRepository.findCollateralByNameAndCaseId(collateralName, caseId, isDelete);
+    }
+
+    @Override
+    public Collateral saveCollateral(CollateralDTO collateralDTO) {
+        Collateral collateral = BeanUtil.copyProperties(collateralDTO, Collateral.class);
+        collateral.setIsDelete( false);
+        collateral.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        collateral.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+        return collateralRepository.save(collateral);
+    }
+
+    @Override
+    public void updateCollateralById(Long id, CollateralDTO collateralDTO, boolean isDelete) {
+        Collateral collateral = BeanUtil.copyProperties(collateralDTO, Collateral.class);
+        collateral.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        collateralRepository.updateCollateralById(id,collateral,isDelete);
+    }
+
+    @Override
+    public void deleteAllByCaseId(Long caseId) {
+        collateralRepository.deleteAllByCaseId(caseId);
+    }
+}

+ 40 - 0
src/main/java/com/loan/system/service/Impl/ContractAndCollateralServiceImpl.java

@@ -0,0 +1,40 @@
+package com.loan.system.service.Impl;
+
+import com.loan.system.domain.entity.ContractAndCollateral;
+import com.loan.system.repository.ContractAndCollateralRepository;
+import com.loan.system.service.ContractAndCollateralService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Service
+public class ContractAndCollateralServiceImpl implements ContractAndCollateralService {
+    private final ContractAndCollateralRepository contractAndCollateralRepository;
+
+    public ContractAndCollateralServiceImpl(ContractAndCollateralRepository contractAndCollateralRepository) {
+        this.contractAndCollateralRepository = contractAndCollateralRepository;
+    }
+    @Override
+    public void addContractAndCollateral(Long contractId, Long collateralId) {
+        ContractAndCollateral contractAndCollateral = new ContractAndCollateral();
+        contractAndCollateral.setContractId(contractId);
+        contractAndCollateral.setCollateralId(collateralId);
+        contractAndCollateral.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        contractAndCollateral.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        contractAndCollateral.setIsDelete(false);
+
+        contractAndCollateralRepository.save(contractAndCollateral);
+    }
+
+    @Override
+    public void deleteAllByCaseId(Long caseId) {
+        contractAndCollateralRepository.deleteAllByCaseId(caseId);
+    }
+
+    @Override
+    public List<ContractAndCollateral> findContractAndCollateralByCaseId(Long caseId) {
+        return contractAndCollateralRepository.findByCaseIdAndIsDelete(caseId,false);
+    }
+}

+ 31 - 0
src/main/java/com/loan/system/service/Impl/ContractSeqServiceImpl.java

@@ -0,0 +1,31 @@
+package com.loan.system.service.Impl;
+
+import com.loan.system.domain.entity.ContractSeq;
+import com.loan.system.repository.ContractSeqRepository;
+import com.loan.system.service.ContractSeqService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ContractSeqServiceImpl implements ContractSeqService {
+    private final ContractSeqRepository contractSeqRepository;
+
+    @Autowired
+    public ContractSeqServiceImpl(ContractSeqRepository contractSeqRepository) {
+        this.contractSeqRepository = contractSeqRepository;
+    }
+    @Override
+    public ContractSeq findSeqBySeqDataAndBusinessAttr(String tody,String businessAttr) {
+        return contractSeqRepository.findSeqBySeqDataAndBusinessAttr(tody, businessAttr);
+    }
+
+    @Override
+    public ContractSeq addSeq(String tody,String businessAttr) {
+        return contractSeqRepository.save(new ContractSeq(businessAttr,tody, 1L));
+    }
+
+    @Override
+    public void updateSeqById(Long id, long l) {
+        contractSeqRepository.updateSeqById(id, l);
+    }
+}

+ 87 - 0
src/main/java/com/loan/system/service/Impl/ContractServiceImpl.java

@@ -0,0 +1,87 @@
+package com.loan.system.service.Impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.ContractDTO;
+import com.loan.system.domain.entity.Contract;
+import com.loan.system.domain.vo.ContractVO;
+import com.loan.system.repository.ContractRepository;
+import com.loan.system.service.ContractService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Service
+public class ContractServiceImpl implements ContractService {
+    private  final ContractRepository contractRepository;
+
+    @Autowired
+    public ContractServiceImpl(ContractRepository contractRepository) {
+        this.contractRepository = contractRepository;
+    }
+    @Override
+    public Contract saveContract(ContractDTO contractDTO) {
+        Contract contract = BeanUtil.copyProperties(contractDTO, Contract.class);
+        contract.setIsDelete( false);
+        contract.setSignedByCustomer(false);
+        contract.setCreateTime( LocalDateTime.now()
+                .format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" ) ) );
+        contract.setUpdateTime( LocalDateTime.now()
+                .format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" ) ) );
+        return contractRepository.save( contract );
+    }
+
+    @Override
+    public Contract findContractByCaseIdAndBusinessAttr(Long caseId, String businessAttr, boolean b) {
+        return contractRepository.findByCaseIdAndBusinessAttrAndIsDelete(caseId,businessAttr,b);
+    }
+
+    @Override
+    public void updateContractById(Long id, ContractDTO contractDTO, boolean isDelete) {
+        Contract contract = BeanUtil.copyProperties(contractDTO, Contract.class);
+        contract.setUpdateTime( LocalDateTime.now().format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" )));
+        contractRepository.updateContractById(id,contract,isDelete);
+    }
+
+    @Override
+    public List<ContractVO> findContractByCaseId(Long caseId) {
+        List<Contract> contract = contractRepository.findByCaseIdAndIsDelete(caseId, false);
+        return BeanUtil.copyToList(contract, ContractVO.class);
+    }
+
+    @Override
+    public void updateContractById1(Long contractId, Long commitedId,Long signId) {
+        Contract contract = new Contract();
+        contract.setCommitedId(commitedId);
+        contract.setSifnedId(signId);
+        contract.setSignedByCustomer(true);
+        contract.setSignedTime( LocalDateTime.now().format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" )));
+        contract.setUpdateTime( LocalDateTime.now().format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" )));
+
+        contractRepository.updateContractById(contractId,contract,false);
+    }
+
+    @Override
+    public void updateIsPushById(Long contractId) {
+        contractRepository.updateIsPushById(contractId);
+    }
+
+    @Override
+    public List<ContractVO> findContractByCaseIdAndIsPush(Long caseId, boolean isPush) {
+        return BeanUtil.copyToList(contractRepository.findByCaseIdAndIsPush(caseId,isPush, false), ContractVO.class);
+    }
+
+    @Override
+    public void deleteAllByCaseId(Long caseId) {
+        contractRepository.deleteAllByCaseId(caseId);
+    }
+
+    @Override
+    public void updateContractNoById(Long id, String contractNo) {
+        contractRepository.updateContractNoById(id,contractNo);
+    }
+
+}

+ 55 - 0
src/main/java/com/loan/system/service/Impl/CustomerOtherServiceImpl.java

@@ -0,0 +1,55 @@
+package com.loan.system.service.Impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.CustomersOtherDTO;
+import com.loan.system.domain.dto.LoanCaseDTO;
+import com.loan.system.domain.entity.CustomersOther;
+import com.loan.system.domain.vo.CustomersOtherVO;
+import com.loan.system.repository.CustomerOtherRepository;
+import com.loan.system.repository.CustomerRepository;
+import com.loan.system.service.CustomerOtherService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CustomerOtherServiceImpl implements CustomerOtherService {
+    private final CustomerOtherRepository customerOtherRepository;
+
+    CustomerOtherServiceImpl(CustomerOtherRepository customerOtherRepository, CustomerRepository customerRepository) {
+        this.customerOtherRepository = customerOtherRepository;
+    }
+
+    @Override
+    public CustomersOther addCustomers(CustomersOtherDTO customersOtherDTO) {
+        CustomersOther customersOther = BeanUtil.copyProperties(customersOtherDTO, CustomersOther.class);
+        customersOther.setIsDelete( false);
+        return customerOtherRepository.save(customersOther);
+    }
+
+    @Override
+    public CustomersOther findByIdNumber(String idNumber) {
+        return customerOtherRepository.findByIdNumberAndIsDelete(idNumber,false);
+    }
+
+    @Override
+    public void updateCustomerById(CustomersOtherDTO customers1, Long id) {
+        customerOtherRepository.updateCustomerById(customers1,id);
+    }
+
+    @Override
+    public CustomersOtherVO findById(Long custom1Id) {
+        return BeanUtil.copyProperties(customerOtherRepository.findByCustomerOtherId(custom1Id,false),CustomersOtherVO.class);
+    }
+
+    @Override
+    public List<CustomersOtherVO> findByCaseId(Long caseId) {
+        return BeanUtil.copyToList(customerOtherRepository.findByCaseIdAndIsDelete(caseId,false),CustomersOtherVO.class);
+    }
+
+    @Override
+    public void deleteAllByCaseId(Long caseId) {
+        customerOtherRepository.deleteAllByCaseId(caseId);
+    }
+
+}

+ 40 - 7
src/main/java/com/loan/system/service/Impl/CustomerServiceImpl.java

@@ -1,30 +1,63 @@
 package com.loan.system.service.Impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.vo.CustomerVO;
 import com.loan.system.repository.CustomerRepository;
 import com.loan.system.service.CustomerService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class CustomerServiceImpl implements CustomerService {
+
     @Autowired
     private CustomerRepository customerRepository;
+
     @Override
+    public Customer addCustomer(Customer customer) {
+        // 可以在这里添加业务逻辑,如校验等
+        return customerRepository.save(customer);
+    }
 
-    public boolean existsBymobileAndIsDelete(String phoneNumber){
-        return customerRepository.existsBymobileAndIsDelete(phoneNumber,false);
+    @Override
+    public void updateMarriedStatusById(Long customerId, String marriedStatus) {
+        customerRepository.updateMarriedStatusById(customerId,marriedStatus);
     }
+
     @Override
-    public Customer findBymobileAndIsDelete(String phoneNumber){
-        return customerRepository.findByMobileAndIsDelete(phoneNumber,false);
+    public CustomerVO findByCustomerIdAndIsDelete(Long customerId, Boolean isDelete) {
+
+        return BeanUtil.copyProperties(customerRepository.findByCustomerId(customerId,isDelete),CustomerVO.class);
     }
+
     @Override
-    public void createCustomer(Customer customer){
-        customerRepository.createCustomer(customer.getOpenid(),customer.getName(),customer.getSex(),customer.getIdNumber(),customer.getMobile(),customer.getRegisterSource(),customer.getBankAccount(),customer.getFaceAuth(),customer.getCreateTime(),customer.getUpdateTime());
+    public List<CustomerVO> getAllCustomers(boolean b) {
+        return BeanUtil.copyToList(customerRepository.findByIsDelete(b),CustomerVO.class);
+    }
+
+    @Override
+    public CustomerVO getCustomerByKey(String key, boolean b) {
+        return BeanUtil.copyProperties(customerRepository.findByKey(key,b),CustomerVO.class);
+    }
+
+    @Override
+    public CustomerVO getCustomerByMobile(String tel) {
+        return  BeanUtil.copyProperties(customerRepository.findByMobile(tel, false),CustomerVO.class);
+    }
+
+    @Override
+    public boolean existsBymobileAndIsDelete(String phoneNumber){
+        return customerRepository.existsByMobileAndIsDelete(phoneNumber,false);
+    }
+    @Override
+    public Customer findBymobileAndIsDelete(String phoneNumber){
+        return customerRepository.findByMobile(phoneNumber,false);
     }
     @Override
     public Customer findByIdAndIsDelete(Long id){
         return customerRepository.findByIdAndIsDelete(id,false);
     }
-}
+}

+ 50 - 0
src/main/java/com/loan/system/service/Impl/DictionaryServiceImpl.java

@@ -0,0 +1,50 @@
+package com.loan.system.service.Impl;
+
+import com.loan.system.domain.entity.*;
+import com.loan.system.repository.DictAttributeRepository;
+import com.loan.system.repository.DictChannelRepository;
+import com.loan.system.repository.DictLocationRepository;
+import com.loan.system.repository.DictTypeRepository;
+import com.loan.system.service.DictionaryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class DictionaryServiceImpl implements DictionaryService {
+    private final DictAttributeRepository dictAttributeRepository;
+    private final DictTypeRepository dictTypeRepository;
+    private final DictChannelRepository dictChannelRepository;
+    private final DictLocationRepository dictLocationRepository;
+
+
+    @Autowired
+    public DictionaryServiceImpl(DictAttributeRepository dictAttributeRepository, DictTypeRepository dictTypeRepository,
+                                 DictChannelRepository dictChannelRepository, DictLocationRepository dictLocationRepository) {
+        this.dictAttributeRepository= dictAttributeRepository;
+        this.dictTypeRepository = dictTypeRepository;
+        this.dictChannelRepository = dictChannelRepository;
+        this.dictLocationRepository = dictLocationRepository;
+    }
+
+    @Override
+    public List<DictAttribute> getAllDictAttributes(Boolean isDelete) {
+        return dictAttributeRepository.findByIsDelete(isDelete);
+    }
+
+    @Override
+    public List<DictBusinessType> getAllDictTypes(Boolean isDelete) {
+        return dictTypeRepository.findByIsDelete(isDelete);
+    }
+
+    @Override
+    public List<DictChannel> getAllDictChannels(Boolean isDelete) {
+        return dictChannelRepository.findByIsDelete(isDelete);
+    }
+
+    @Override
+    public List<DictLocation> getAllLocations(Boolean isDelete) {
+        return dictLocationRepository.findByIsDelete(isDelete);
+    }
+}

+ 41 - 0
src/main/java/com/loan/system/service/Impl/DisbursementServiceImpl.java

@@ -0,0 +1,41 @@
+package com.loan.system.service.Impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.DisbursementDTO;
+import com.loan.system.domain.entity.Disbursement;
+import com.loan.system.domain.vo.DisbursementVO;
+import com.loan.system.repository.DisbursementRepository;
+import com.loan.system.service.DisbursementService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Service
+public class DisbursementServiceImpl implements DisbursementService {
+    private final DisbursementRepository disbursementRepository;
+
+    @Autowired
+    public DisbursementServiceImpl(DisbursementRepository disbursementRepository) {
+        this.disbursementRepository = disbursementRepository;
+    }
+    @Override
+    public DisbursementVO addDisbursement(DisbursementDTO disbursementDTO) {
+        Disbursement disbursement = BeanUtil.copyProperties(disbursementDTO, Disbursement.class);
+        disbursement.setApplyAt(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        disbursement.setCreateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        disbursement.setUpdateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        disbursement.setIsDelete(false);
+
+        return  BeanUtil.copyProperties(disbursementRepository.save(disbursement), DisbursementVO.class);
+    }
+
+    @Override
+    public DisbursementVO findDisbursementDetailsById(Long caseId) {
+        return BeanUtil.copyProperties(disbursementRepository.findDisbursementDetailsById(caseId), DisbursementVO.class);
+    }
+}

+ 23 - 4
src/main/java/com/loan/system/service/Impl/DocumentServiceImpl.java

@@ -1,6 +1,7 @@
 package com.loan.system.service.Impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.DocumentDTO;
 import com.loan.system.domain.entity.Document;
 import com.loan.system.domain.vo.DocumentVO;
 import com.loan.system.repository.DocumentRepository;
@@ -8,17 +9,23 @@ import com.loan.system.service.DocumentService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Service
 public class DocumentServiceImpl implements DocumentService {
+    private final DocumentRepository documentRepository;
 
     @Autowired
-    DocumentRepository documentRepository;
+    public DocumentServiceImpl(DocumentRepository documentRepository) {
+        this.documentRepository = documentRepository;
+    }
     @Override
-    public List<Document> findDocumentByCaseIdAndIsDelete(Long caseId){
-        return documentRepository.findDocumentByCaseIdAndIsDelete(caseId,false);
+    public List<DocumentVO> findByCaseId(Long caseId) {
+        return BeanUtil.copyToList(documentRepository.findByCaseId(caseId), DocumentVO.class);
     }
+
     @Override
     public DocumentVO uploadFile(Document document) {
         return BeanUtil.copyProperties(documentRepository.save(document), DocumentVO.class);
@@ -26,6 +33,18 @@ public class DocumentServiceImpl implements DocumentService {
 
     @Override
     public Document findById(Long signId) {
-        return documentRepository.findByDocumentIdAndIsDelete(signId);
+        return documentRepository.findByDocumentId(signId);
+    }
+
+    @Override
+    public void updateDocumentByCaseIdAndDicType(Long caseId, String dictType, DocumentDTO documentDTO) {
+        Document document = BeanUtil.copyProperties(documentDTO, Document.class);
+        document.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        documentRepository.updateByCaseIdAndDictType(caseId, dictType, document);
+    }
+
+    @Override
+    public void deleteFileByCaseIdAndDictType(Long caseId, String fileType) {
+        documentRepository.deleteFileByCaseIdAndDictType(caseId, fileType);
     }
 }

+ 141 - 0
src/main/java/com/loan/system/service/Impl/LoanServiceImpl.java

@@ -0,0 +1,141 @@
+package com.loan.system.service.Impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.domain.dto.CustomersOtherDTO;
+import com.loan.system.domain.dto.LoanCaseDTO;
+import com.loan.system.domain.entity.*;
+import com.loan.system.domain.vo.*;
+import com.loan.system.repository.CustomerOtherRepository;
+import com.loan.system.repository.CustomerRepository;
+import com.loan.system.repository.LoanRepository;
+import com.loan.system.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class LoanServiceImpl implements LoanService {
+
+    private final CustomerOtherService customerOtherService;
+    private final LoanRepository loanRepository;
+    private final CustomerService customerService;
+    private final DocumentService documentService;
+    private final CollateralService collateralService;
+    private final ContractService contractService;
+    private final StepService stepService;
+    private final ContractAndCollateralService contractAndCollateralService;
+
+    @Autowired
+    public LoanServiceImpl(LoanRepository loanRepository, CustomerOtherService customerOtherService,CustomerService customerRepository ,
+                           DocumentService documentService, CollateralService collateralService, ContractService contractService,
+                           StepService stepService, ContractAndCollateralService contractAndCollateralService) {
+        this.loanRepository = loanRepository;
+        this.customerOtherService = customerOtherService;
+        this.customerService = customerRepository;
+        this.documentService = documentService;
+        this.collateralService = collateralService;
+        this.contractService = contractService;
+        this.stepService = stepService;
+        this.contractAndCollateralService = contractAndCollateralService;
+    }
+
+    @Override
+    public List<LoanCaseVO> findLoanCaseByIsComplete(Boolean isComplete, boolean isDelete) {
+        return BeanUtil.copyToList(loanRepository.findByIsCompleteAndIsDelete(isComplete,isDelete), LoanCaseVO.class);
+    }
+
+    @Override
+    public LoanCaseVO addLoanCaseByCustomerId(Long customerId) {
+        LoanCase loanCase = new LoanCase();
+        loanCase.setCustomerId(customerId);
+        loanCase.setIsComplete(false);
+        loanCase.setCreateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        loanCase.setUpdateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        loanCase.setIsDelete(false);
+
+        return BeanUtil.copyProperties(loanRepository.save(loanCase), LoanCaseVO.class);
+    }
+
+    @Override
+    public void updateLoanCaseById(LoanCaseDTO loanCaseDTO, Long caseId) {
+        LoanCase loanCase = BeanUtil.copyProperties(loanCaseDTO, LoanCase.class);
+
+        loanCase.setIsComplete(false);
+        loanCase.setUpdateTime(LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+        loanRepository.updateLoanCaseById(loanCase,caseId);
+    }
+
+    @Override
+    public LoanCaseVO findLoanCaseDetailsById(Long caseId) {
+        //1.获取业务信息
+        LoanCase loanCase = loanRepository.findLoanCaseById(caseId, false);
+        LoanCaseVO loanCaseVO = BeanUtil.copyProperties(loanCase, LoanCaseVO.class);
+        //2.获取客户信息
+        loanCaseVO.setCustomer(customerService.findByCustomerIdAndIsDelete(loanCase.getCustomerId(),false));
+        //3.获取合同信息
+        List<ContractVO> contracts = contractService.findContractByCaseId(caseId);
+        loanCaseVO.setContracts(contracts);
+        //4.获取押品信息
+        List<CollateralVO> collaterals = collateralService.findByCaseId(caseId);
+        loanCaseVO.setCollateral(collaterals);
+        //5.获取合同押品关联信息
+        List<ContractAndCollateral> contractAndCollaterals = contractAndCollateralService.findContractAndCollateralByCaseId(caseId);
+        List<Map<Long,List<Long>>> relations = new ArrayList<>();
+
+        Map<Long,List<Long>> relation = new java.util.HashMap<>();
+        List<Long> collateralIds = new ArrayList<>();
+        for(int i=0 ,j=0; i < contractAndCollaterals.size() && j < contracts.size(); i++) {
+            if (contractAndCollaterals.get(i).getContractId().equals(contracts.get(j).getId())) {
+                collateralIds.add(contractAndCollaterals.get(i).getCollateralId());
+            }else{
+                relation.put(contracts.get(j).getId(),collateralIds);
+                relations.add(relation);
+                j++;
+                relation = new java.util.HashMap<>();
+                collateralIds = new ArrayList<>();
+                i--;
+            }
+        }
+        loanCaseVO.setCollateralAndContract(relations);
+
+        //5.获取其它客户信息
+        List<CustomersOtherVO> customersOtherVOS = customerOtherService.findByCaseId(caseId);
+        for (int i =0;i< customersOtherVOS.size();i++){
+            if(i==0)
+                loanCaseVO.setCustomers1(customersOtherVOS.get(i));
+            else
+                loanCaseVO.setCustomers2(customersOtherVOS.get(i));
+        }
+        //6.获取附件信息
+        loanCaseVO.setDocuments(BeanUtil.copyToList(documentService.findByCaseId(caseId), DocumentVO.class));
+//        //7.获取步骤信息
+//        loanCaseVO.setSteps(stepService.getStepByCaseId(caseId));
+
+        return loanCaseVO;
+    }
+
+    @Override
+    public LoanCaseVO findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete) {
+        return BeanUtil.copyProperties(loanRepository.findLoanCaseById(caseId, isDelete), LoanCaseVO.class);
+    }
+
+    @Override
+    public void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete){
+        loanRepository.updateUpdatetimeByIdAndIsDeleted(id,false, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+    @Override
+    public void logic_delete(Long id){
+        loanRepository.logic_delete(id, true, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+}

+ 0 - 2
src/main/java/com/loan/system/service/Impl/PermissionService.java

@@ -19,8 +19,6 @@ import java.util.stream.Collectors;
 public class PermissionService {
     private static final Logger logger = LoggerFactory.getLogger(PermissionService.class);
 
-
-
     public boolean hasRole(String role){
         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
         if (authentication == null) {

+ 7 - 12
src/main/java/com/loan/system/service/Impl/StepServiceImpl.java

@@ -96,9 +96,10 @@ public class StepServiceImpl implements StepService {
     public StepVO updateUserByCaseId(String stepName, Long approverId, Long caseId) {
         Step step = stepRepository.findByStepNameAndCaseId(stepName, caseId);
         if(step.getUserId1() == null)
-            stepRepository.updateUser1ByCaseIdAndStepName(stepName,approverId,caseId,LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            stepRepository.updateUser1ByCaseIdAndStepName(stepName,approverId,caseId);
         else
-            stepRepository.updateUser2ByCaseIdAndStepName(stepName,approverId,caseId,LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            if(!step.getUserId1().equals(approverId))
+                stepRepository.updateUser2ByCaseIdAndStepName(stepName,approverId,caseId);
 
         step = stepRepository.findByStepNameAndCaseId(stepName, caseId);
 
@@ -110,18 +111,12 @@ public class StepServiceImpl implements StepService {
     public List<StepVO> getStepByCaseId(Long caseId) {
         return stepRepository.findByCaseId(caseId);
     }
+
     @Override
-    public List<Step> getAllStepByCaseId(Long caseId){
-        return stepRepository.findAllByCaseId(caseId);
-    }
-    @Override
-    public Long getLeadSalesIdAndIsDelete(Long caseId, String stepName) {
-        return stepRepository.getLeadSalesIdAndIsDelete(caseId,stepName,false);
-    }
-    @Override
-    public Step findByStepNameAndCaseId(String stepName, Long caseId){
-        return stepRepository.findByStepNameAndCaseId(stepName,caseId);
+    public StepVO findByStepNameAndCaseId(String stepName,Long caseId) {
+        return BeanUtil.copyProperties(stepRepository.findByStepNameAndCaseId(stepName, caseId), StepVO.class);
     }
+
     @Override
     public void updateUserId1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId){
 

+ 92 - 31
src/main/java/com/loan/system/service/Impl/UserServiceImpl.java

@@ -1,65 +1,125 @@
 package com.loan.system.service.Impl;
 
 import com.alibaba.fastjson.JSON;
+import com.loan.system.constant.MessageConstant;
 import com.loan.system.domain.dto.UserLoginDTO;
-import com.loan.system.domain.pojo.Result;
+import com.loan.system.domain.entity.BizRecommender;
+import com.loan.system.domain.entity.Customer;
 import com.loan.system.domain.entity.User;
+import com.loan.system.domain.enums.ExceptionEnum;
+import com.loan.system.domain.pojo.Result;
+import com.loan.system.exception.DescribeException;
+import com.loan.system.properties.WeChatProperties;
+import com.loan.system.repository.CustomerRepository;
+import com.loan.system.repository.RecommenderRepository;
 import com.loan.system.repository.UserRepository;
 import com.loan.system.service.UserService;
-import com.loan.system.utils.RedisUtil;
+import com.loan.system.utils.HttpClientUtil;
 import com.loan.system.utils.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 
-import java.io.IOException;
-import java.net.URI;
+import java.time.LocalDateTime;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 @Service
 public class UserServiceImpl implements UserService {
-    UserRepository userRepository;
-    /**
-     * 微信公众号appid
-     */
-    @Value("${wechat.appid}")
-    private String appId;
-    /**
-     * 微信公众号secret
-     */
-    @Value("${wechat.secret}")
-    private String appSecret;
-
     private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
 
+    private final UserRepository userRepository;
+    private final CustomerRepository customerRepository;
+    private final RecommenderRepository recommenderRepository;
+    private final WeChatProperties weChatProperties;
+    private final StringRedisTemplate redisTemplate;
+    public static final String WX_LOGIN="https://api.weixin.qq.com/sns/jscode2session";
+
     @Autowired
-    public UserServiceImpl(UserRepository userRepository) {
+    public UserServiceImpl(UserRepository userRepository, CustomerRepository customerRepository, RecommenderRepository recommenderRepository,
+                           WeChatProperties weChatProperties, StringRedisTemplate redisTemplate) {
         this.userRepository = userRepository;
+        this.customerRepository = customerRepository;
+        this.recommenderRepository = recommenderRepository;
+        this.weChatProperties = weChatProperties;
+        this.redisTemplate = redisTemplate;
     }
-    @Autowired
-    private StringRedisTemplate redisTemplate;
 
-    /**
-     * 获取微信openid
-     * @param code
-     * @return
-     */
+    @Override
+    public User getUserByMobile(String mobile) {
+        return userRepository.findByMobile(mobile);
+    }
+
+
+    @Override
+    public List<Customer> getAllCustomers(Boolean isDelete) {
+        return customerRepository.findByIsDelete(isDelete);
+    }
+
+    @Override
+    public List<User> getAllUsers(Boolean isDelete) {
+        return userRepository.findByIsDelete(isDelete);
+    }
+
+    @Override
+    public List<BizRecommender> getAllRecommenders(Boolean isDelete) {
+        return recommenderRepository.findByIsDelete(isDelete);
+    }
+
+
+//    @Override
+//    public User wxLogin(UserLoginDTO userLoginDTO) {
+//        //调用微信接口服务,获得当前微信用户的openid
+//        String openid=getOpenid(userLoginDTO.getCode());
+//
+//        //判断openid是否为空,如果为空表示登录失败,抛出业务异常
+//        if (openid==null)
+//            throw new DescribeException(ExceptionEnum.LOGIN_EXPIRED);
+//
+//        //判断当前用户是否为新用户
+//        User user = userRepository.findByMobile(userLoginDTO.getTel());
+////        if(user==null)
+////        {
+////            user = User.builder()
+////                    .openid(openid)
+////                    .createTime(LocalDateTime.now())
+////                    .build();
+////            userMapper.insert(user);
+////        }
+//
+//
+//        //返回这个用户对象
+//        return user;
+//    }
+
+//    private String getOpenid(String code){
+//        Map<String,String> map=new HashMap<>();
+//        map.put("appid",weChatProperties.getAppid());
+//        map.put("secret",weChatProperties.getSecret());
+//        map.put("js_code",code);
+//        map.put("grant_type","authorization_code");
+//        String json = HttpClientUtil.doGet(weChatProperties.getLoginUrl(), map);
+//
+//        JSONObject jsonObject= JSON.parseObject(json);
+//        String openid = jsonObject.getString("openid");
+//
+//        return openid;
+//    }
+
     @Override
     public Result get_sessionId(String code) {
         String url = "https://api.weixin.qq.com/sns/jscode2session"
-                + "?appid=" + appId
-                + "&secret=" + appSecret
+                + "?appid=" + weChatProperties.getAppid()
+                + "&secret=" + weChatProperties.getSecret()
                 + "&js_code=" + code
                 + "&grant_type=authorization_code";
 
@@ -123,4 +183,5 @@ public class UserServiceImpl implements UserService {
     public User findByIdAndIsDelete(Long id){
         return userRepository.findByIdAndIsDelete(id,false);
     }
-}
+
+}

+ 15 - 10
src/main/java/com/loan/system/service/Impl/WxServiceImpl.java

@@ -2,7 +2,8 @@ package com.loan.system.service.Impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.loan.system.domain.entity.TemplateMessage;
+import com.loan.system.domain.pojo.TemplateMessage;
+import com.loan.system.properties.WeChatProperties;
 import com.loan.system.service.WxService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -24,15 +25,19 @@ public class WxServiceImpl implements WxService {
     /**
      * 微信公众号appid
      */
-    @Value("${wechat.appid}")
-    private String appId;
-    /**
-     * 微信公众号secret
-     */
-    @Value("${wechat.secret}")
-    private String appSecret;
+//    @Value("${wechat.appid}")
+//    private String appId;
+//    /**
+//     * 微信公众号secret
+//     */
+//    @Value("${wechat.secret}")
+//    private String appSecret;
     @Autowired
     private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    WeChatProperties weChatProperties;
+
     @Override
 
     public String wxDecrypt(String encryptedData, String sessionId, String vi) throws Exception {
@@ -55,10 +60,10 @@ public class WxServiceImpl implements WxService {
     @Override
 
     public String getAccessToken() {
-        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret;
+        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+weChatProperties.getAppid()+"&secret="+weChatProperties.getSecret();
 
         RestTemplate restTemplate = new RestTemplate();
-        Map<String, Object> response = restTemplate.getForObject(url, Map.class, appId, appSecret);
+        Map<String, Object> response = restTemplate.getForObject(url, Map.class, weChatProperties.getAppid(), weChatProperties.getSecret());
 
         if (response != null && response.containsKey("access_token")) {
             return (String) response.get("access_token");

+ 23 - 0
src/main/java/com/loan/system/service/LoanService.java

@@ -0,0 +1,23 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.dto.LoanCaseDTO;
+import com.loan.system.domain.entity.LoanCase;
+import com.loan.system.domain.vo.LoanCaseVO;
+
+import java.util.List;
+
+public interface LoanService {
+    List<LoanCaseVO> findLoanCaseByIsComplete(Boolean isComplete, boolean isDelete) ;
+
+    LoanCaseVO addLoanCaseByCustomerId(Long customerId);
+    
+    void updateLoanCaseById(LoanCaseDTO loanCaseDTO, Long caseId);
+
+    LoanCaseVO findLoanCaseDetailsById(Long caseId);
+
+    LoanCaseVO findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete);
+
+    void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete);
+
+    void logic_delete(Long id);
+}

+ 1 - 5
src/main/java/com/loan/system/service/StepService.java

@@ -16,11 +16,7 @@ public interface StepService {
 
     List<StepVO> getStepByCaseId(Long caseId);
 
-    List<Step> getAllStepByCaseId(Long caseId);
-
-    Long getLeadSalesIdAndIsDelete(Long caseId, String stepName);
-
-    Step findByStepNameAndCaseId(String stepName, Long caseId);
+    StepVO findByStepNameAndCaseId(String stepName,Long caseId);
 
     void updateUserId1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
 

+ 18 - 2
src/main/java/com/loan/system/service/UserService.java

@@ -1,13 +1,29 @@
 package com.loan.system.service;
 
 import com.loan.system.domain.dto.UserLoginDTO;
+import com.loan.system.domain.entity.BizRecommender;
+import com.loan.system.domain.entity.Customer;
 import com.loan.system.domain.entity.User;
 import com.loan.system.domain.pojo.Result;
 
+import java.util.List;
+
 public interface UserService {
+    User getUserByMobile(String  mobile);
+
+
+    List<Customer> getAllCustomers(Boolean isDelete);
+
+    List<User> getAllUsers(Boolean isDelete);
+
+    List<BizRecommender> getAllRecommenders(Boolean isDelete);
+
+
+    //User wxLogin(UserLoginDTO userLoginDTO);
+
+    User findByIdAndIsDelete(Long userId);
+
     Result get_sessionId(String code);
     User findByPhoneNumberAndIsDelete(String phoneNumber);
-    User findByIdAndIsDelete(Long id);
     boolean existsByMobileAndIsDelete(String phoneNumber);
-
 }

+ 1 - 1
src/main/java/com/loan/system/service/WxService.java

@@ -1,6 +1,6 @@
 package com.loan.system.service;
 
-import com.loan.system.domain.entity.TemplateMessage;
+import com.loan.system.domain.pojo.TemplateMessage;
 
 public interface WxService {
     String wxDecrypt(String encryptedData, String sessionId, String vi) throws Exception;

+ 0 - 376
src/main/java/com/loan/system/utils/ExcelUtil.java

@@ -1,376 +0,0 @@
-package com.loan.system.utils;
-
-import com.loan.system.annotation.ExcelColumn;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.CharUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.poi.hssf.usermodel.HSSFDateUtil;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.*;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.math.BigDecimal;
-import java.net.URLEncoder;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author : EdwinXu
- * @date : Created in 2020/11/25 21:53
- */
-public class ExcelUtil {
-    private final static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
-    private final static String EXCEL2003 = "xls";
-    private final static String EXCEL2007 = "xlsx";
-
-    public static <T> List<T> readExcel(String path, Class<T> cls, MultipartFile file){
-        String fileName = file.getOriginalFilename();
-        if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
-            logger.error("上传文件格式不正确");
-        }
-        List<T> dataList = new ArrayList<>();
-        Workbook workbook = null;
-        try {
-            InputStream is = file.getInputStream();
-            if (fileName.endsWith(EXCEL2007)) {
-//                FileInputStream is = new FileInputStream(new File(path));
-                workbook = new XSSFWorkbook(is);
-            }
-            if (fileName.endsWith(EXCEL2003)) {
-//                FileInputStream is = new FileInputStream(new File(path));
-                workbook = new HSSFWorkbook(is);
-            }
-            if (workbook != null) {
-                //类映射  注解 value-->bean columns
-                Map<String, List<Field>> classMap = new HashMap<>();
-                List<Field> fields = Stream.of(cls.getDeclaredFields()).collect(Collectors.toList());
-                fields.forEach(
-                        field -> {
-                            ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
-                            if (annotation != null) {
-                                String value = annotation.value();
-                                if (StringUtils.isBlank(value)) {
-                                    return;//return起到的作用和continue是相同的 语法
-                                }
-                                if (!classMap.containsKey(value)) {
-                                    classMap.put(value, new ArrayList<>());
-                                }
-                                field.setAccessible(true);
-                                classMap.get(value).add(field);
-                            }
-                        }
-                );
-                //索引-->columns
-                Map<Integer, List<Field>> reflectionMap = new HashMap<>(16);
-                //默认读取第一个sheet
-                Sheet sheet = workbook.getSheetAt(0);
-
-                boolean firstRow = true;
-                for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
-                    Row row = sheet.getRow(i);
-                    //首行  提取注解
-                    if (firstRow) {
-                        for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
-                            Cell cell = row.getCell(j);
-                            String cellValue = getCellValue(cell);
-                            if (classMap.containsKey(cellValue)) {
-                                reflectionMap.put(j, classMap.get(cellValue));
-                            }
-                        }
-                        firstRow = false;
-                    } else {
-                        //忽略空白行
-                        if (row == null) {
-                            continue;
-                        }
-                        try {
-                            T t = cls.newInstance();
-                            //判断是否为空白行
-                            boolean allBlank = true;
-                            for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
-                                if (reflectionMap.containsKey(j)) {
-                                    Cell cell = row.getCell(j);
-                                    String cellValue = getCellValue(cell);
-                                    if (StringUtils.isNotBlank(cellValue)) {
-                                        allBlank = false;
-                                    }
-                                    List<Field> fieldList = reflectionMap.get(j);
-                                    fieldList.forEach(
-                                            x -> {
-                                                try {
-                                                    handleField(t, cellValue, x);
-                                                } catch (Exception e) {
-                                                    logger.error(String.format("reflect field:%s value:%s exception!", x.getName(), cellValue), e);
-                                                }
-                                            }
-                                    );
-                                }
-                            }
-                            if (!allBlank) {
-                                dataList.add(t);
-                            } else {
-                                logger.warn(String.format("row:%s is blank ignore!", i));
-                            }
-                        } catch (Exception e) {
-                            logger.error(String.format("parse row:%s exception!", i), e);
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            logger.error("parse excel exception!", e);
-        } finally {
-            if (workbook != null) {
-                try {
-                    workbook.close();
-                } catch (Exception e) {
-                    logger.error("parse excel exception!", e);
-                }
-            }
-        }
-        return dataList;
-    }
-
-    private static <T> void handleField(T t, String value, Field field) throws Exception {
-        Class<?> type = field.getType();
-        if (type == void.class || StringUtils.isBlank(value)) {
-            return;
-        }
-        if (type == Object.class) {
-            field.set(t, value);
-            //数字类型
-        } else if (type.getSuperclass() == null || type.getSuperclass() == Number.class) {
-            if (type == int.class || type == Integer.class) {
-                field.set(t, NumberUtils.toInt(value));
-            } else if (type == long.class || type == Long.class) {
-                field.set(t, NumberUtils.toLong(value));
-            } else if (type == byte.class || type == Byte.class) {
-                field.set(t, NumberUtils.toByte(value));
-            } else if (type == short.class || type == Short.class) {
-                field.set(t, NumberUtils.toShort(value));
-            } else if (type == double.class || type == Double.class) {
-                field.set(t, NumberUtils.toDouble(value));
-            } else if (type == float.class || type == Float.class) {
-                field.set(t, NumberUtils.toFloat(value));
-            } else if (type == char.class || type == Character.class) {
-                field.set(t, CharUtils.toChar(value));
-            } else if (type == boolean.class) {
-                field.set(t, BooleanUtils.toBoolean(value));
-            } else if (type == BigDecimal.class) {
-                field.set(t, new BigDecimal(value));
-            }
-        } else if (type == Boolean.class) {
-            field.set(t, BooleanUtils.toBoolean(value));
-        } else if (type == Date.class) {
-            //
-            field.set(t, value);
-        } else if (type == String.class) {
-            field.set(t, value);
-        } else {
-            Constructor<?> constructor = type.getConstructor(String.class);
-            field.set(t, constructor.newInstance(value));
-        }
-    }
-
-    private static String getCellValue(Cell cell) {
-        if (cell == null) {
-            return "";
-        }
-        if (cell.getCellType() == CellType.NUMERIC) {
-            if (HSSFDateUtil.isCellDateFormatted(cell)) {
-                return HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();
-            } else {
-                return BigDecimal.valueOf(cell.getNumericCellValue()).toString();
-            }
-        } else if (cell.getCellType() == CellType.STRING) {
-            return StringUtils.trimToEmpty(cell.getStringCellValue());
-        } else if (cell.getCellType() == CellType.FORMULA) {
-            return StringUtils.trimToEmpty(cell.getCellFormula());
-        } else if (cell.getCellType() == CellType.BLANK) {
-            return "";
-        } else if (cell.getCellType() == CellType.BOOLEAN) {
-            return String.valueOf(cell.getBooleanCellValue());
-        } else if (cell.getCellType() == CellType.ERROR) {
-            return "ERROR";
-        } else {
-            return cell.toString().trim();
-        }
-
-    }
-
-    public static <T> void writeExcel(HttpServletResponse response, List<T> dataList, Class<T> cls){
-        Field[] fields = cls.getDeclaredFields();
-        // 获得行标题
-        List<Field> fieldList = Arrays.stream(fields)
-                .filter(field -> {
-                    ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
-                    if (annotation != null && annotation.col() > 0) {
-                        field.setAccessible(true);
-                        return true;
-                    }
-                    return false;
-                }).collect(Collectors.toList());
-        // 这个排序没有必要
-//        .sorted(Comparator.comparing(field -> {
-//                    int col = 0;
-//                    ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
-//                    if (annotation != null) {
-//                        col = annotation.col();
-//                    }
-//                    return col;
-//                }))
-
-        // 创建工作簿
-        Workbook wb = new XSSFWorkbook();
-        // 创建工作表
-        Sheet sheet = wb.createSheet("Sheet1");
-        AtomicInteger ai = new AtomicInteger();
-        {
-            // 行
-            Row row = sheet.createRow(ai.getAndIncrement());
-            AtomicInteger aj = new AtomicInteger();
-            //写入头部
-            fieldList.forEach(field -> {
-                ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
-                String columnName = "";
-                if (annotation != null) {
-                    columnName = annotation.value();
-                }
-//                int i = fieldList.indexOf(field);
-//                sheet.setColumnWidth(i,annotation.col());
-                Cell cell = row.createCell(aj.getAndIncrement());
-                CellStyle cellStyle = wb.createCellStyle();
-//                cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); // 设置背景色
-//                cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //
-                cellStyle.setAlignment(HorizontalAlignment.LEFT); // 居中
-                cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
-                cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
-                cellStyle.setBorderTop(BorderStyle.THIN);//上边框
-                cellStyle.setBorderRight(BorderStyle.THIN);//右边框
-                Font font = wb.createFont();
-                font.setFontName("宋体");
-                cellStyle.setFont(font);
-                cell.setCellStyle(cellStyle);
-                cell.setCellValue(columnName);
-            });
-        }
-        // 写入内容
-        if (CollectionUtils.isNotEmpty(dataList)) {
-            dataList.forEach(t -> {
-                Row row1 = sheet.createRow(ai.getAndIncrement());
-                AtomicInteger aj = new AtomicInteger();
-                fieldList.forEach(field -> {
-//                    Class<?> type = field.getType();
-                    Object value = "";
-                    try {
-                        value = field.get(t);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    Cell cell = row1.createCell(aj.getAndIncrement());
-                    CellStyle cellStyle = wb.createCellStyle();
-
-                    cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
-                    cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
-                    cellStyle.setBorderTop(BorderStyle.THIN);//上边框
-                    cellStyle.setBorderRight(BorderStyle.THIN);//右边框
-
-                    Font font = wb.createFont();
-                    font.setFontName("宋体");
-                    cellStyle.setFont(font);
-                    cell.setCellStyle(cellStyle);
-
-                    if (value != null) {
-                        cell.setCellValue(value.toString());
-                    }
-                });
-            });
-        }
-        for (int i = 0; i < fieldList.size(); i++) {
-            sheet.autoSizeColumn((short)i);
-        }
-        Sheet sheetAt = wb.getSheetAt(0);
-        int physicalNumberOfRows = sheetAt.getPhysicalNumberOfRows();
-        int col = 0;
-        if (physicalNumberOfRows > 1 && sheet.getRow(0) != null) {
-            col = sheet.getRow(0).getPhysicalNumberOfCells();
-        }
-        for(int i = 0;i<col;i++){
-            Row row = sheetAt.getRow(0);
-            Cell cell = row.getCell(i);
-            if(cell != null&& cell.getStringCellValue().contains("金额") ){
-                for(int j = 1;j<physicalNumberOfRows;j++){
-                    Row row1 = sheetAt.getRow(j);
-                    Cell cell1 = row1.getCell(i);
-                    if(cell1 != null) {
-                        if(StringUtils.isNotEmpty(cell1.getStringCellValue()))
-                            row1.getCell(i).setCellValue(Double.parseDouble(cell1.getStringCellValue()));
-                    }
-                    else{
-                        continue;
-                    }
-                }
-            }
-
-        }
-
-        //冻结窗格
-//        wb.getSheet("Sheet1").createFreezePane(0, 1, 0, 1);
-        //浏览器下载excel
-        buildExcelDocument(UUID.randomUUID().toString()+".xlsx",wb,response);
-        //生成excel文件
-//        buildExcelFile(".\\default.xlsx",wb);
-    }
-
-    /**
-     * 浏览器下载excel
-     * @param fileName
-     * @param wb
-     * @param response
-     */
-
-    private static void buildExcelDocument(String fileName, Workbook wb, HttpServletResponse response){
-        try {
-            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
-            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));
-            response.flushBuffer();
-            wb.write(response.getOutputStream());
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 生成excel文件
-     * @param path 生成excel路径
-     * @param wb
-     */
-    private static void buildExcelFile(String path, Workbook wb){
-
-        File file = new File(path);
-        if (file.exists()) {
-            file.delete();
-        }
-        try {
-            wb.write(new FileOutputStream(file));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-}

+ 0 - 489
src/main/java/com/loan/system/utils/FileUploadUtil.java

@@ -1,489 +0,0 @@
-package com.loan.system.utils;
-
-import com.loan.system.domain.enums.ExceptionEnum;
-import com.loan.system.exception.DescribeException;
-import com.loan.system.exception.FileException;
-import net.coobird.thumbnailator.Thumbnails;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.*;
-import java.util.*;
-
-/**
- * @author EdwinXu
- * @date 2020/9/26 - 20:52
- * 使用前请指定 path 路径,直接设置即可
- * 图片缩略图未具体实现
- * 文件目录样例
- *  |maintenance|uploads|project-1|contracts|contract-1|xxxxxxxxxxxx.pdf
- *  ---------------------------------------------------|xxxxxxxxxxxx.jpg
- *  ---------------------------------------------------|chunks |tempFile
- *  ------------------------------|steps
- *  ------------------------------|taskBook
- */
-@Component
-public class FileUploadUtil {
-//    private static final Logger logger = LoggerFactory.getLogger(FileUploadUtil.class);
-//
-//    private static final String PNG = "png";
-//    private static String path;
-//    private static String host;
-//    private static String extensions;
-//
-//    @Value("${upload.location}")
-//    public void setPath(String path) {
-//        FileUploadUtil.path = path;
-//    }
-//    @Value("${upload.host}")
-//    public void setHost(String host) {
-//        FileUploadUtil.host = host;
-//    }
-//    @Value("${upload.extensions}")
-//    public void setExtensions(String extensions) {
-//        FileUploadUtil.extensions = extensions;
-//    }
-//
-//    /**
-//     * 上传文件
-//     * @param files 上传的文件对象(必须)
-//     * @param childFile     上传父目录,为空则直接上传到指定目录
-//     */
-//    public static <T extends Material> List<T> saveFile(MultipartFile[] files, String childFile, Class<T> tClass) throws IOException {
-//        // 关闭上传文件限制
-//        // final Boolean aBoolean = checkType(files, extensions);
-//        List<T> list = new ArrayList<>();
-//        for (MultipartFile file : files){
-//            // 验证是否为图片类型,可能需要额外处理
-//            Boolean isImage = checkIsImage(file, "JPG,jpg,bmp,BMP,gif,GIF,bmp,BMP,png,PNG,jpeg,JPEG,svg");
-//            T t = saveFile(file, childFile, isImage, tClass);
-//            list.add(t);
-//        }
-//        return list;
-//    }
-//
-//    /**
-//     * 创建文件
-//     * @param path 创建文件的路径
-//     */
-//    public static File createFile(String path) throws IOException {
-//        // 获取文件的完整目录 getFullPath() 获取的是文件的目录路径
-//        String fullPath = FilenameUtils.getFullPath(path);
-//        // 判断目录是否存在,不存在就创建一个目录
-//        File file = new File(fullPath);
-//        if (!file.isDirectory()){
-//            if (!file.mkdirs()){
-//                throw new FileException(ExceptionEnum.DIRECTORY_CREATE_ERROR);
-//            }
-//        }
-//        // 判断文件是否存在,不存在就创建
-//        file = new File(path);
-//        if (!file.exists()){
-//            if (!file.createNewFile()){
-//                throw new FileException(ExceptionEnum.FILE_CREATE_ERROR);
-//            }
-//        }
-//        return file;
-//    }
-//
-//    public static boolean createChunksFileFolder(String path) {
-//        // 获取文件的完整目录 getFullPath() 获取的是文件的目录路径
-//        String fullPath = FilenameUtils.getFullPath(path);
-//        // 判断目录是否存在,不存在就创建一个目录
-//        File file = new File(fullPath);
-//        if (!file.exists()){
-//            //创建文件夹
-//            return file.mkdirs();
-//        }
-//        return true;
-//    }
-//
-//    /**
-//     * 上传文件具体操作方法
-//     * @param file         上传的文件对象(必须)
-//     * @param childFile     上传父目录,为空则直接上传到指定目录
-//     * @param isImage       上传文件是否为图片
-//     */
-//    private static <T extends Material> T saveFile(MultipartFile file, String childFile, Boolean isImage, Class<T> tClass) throws IOException {
-//        // 文件名
-//        String fileName = file.getOriginalFilename();
-//        // 文件后缀名
-//        String extension = FilenameUtils.getExtension(fileName);
-//        // 创建文件的文件名
-//        String newFileName = getUniqueName(extension);
-//        // 创建文件保存路径
-//        String savePath = getServerPath(path, childFile+ '/' + newFileName);
-//        // 创建文件访问链接
-//        String link = getServerPath(host, childFile+ '/' + newFileName);
-//        // 创建文件
-//        File file1 = createFile(savePath);
-//        // 保存文件(未生成缩略图)
-//        InputStream is = file.getInputStream();
-//        FileOutputStream fos = new FileOutputStream(file1);
-//        BufferedOutputStream bos = new BufferedOutputStream(fos);
-//        byte[] buffer = new byte[1024];
-//        int length;
-//        try {
-//            while ((length = is.read(buffer)) > -1) {
-//                bos.write(buffer, 0, length);
-//                bos.flush();
-//            }
-//        } catch (IOException e) {
-//            e.printStackTrace();
-//        } finally {
-//            bos.close();
-//            fos.close();
-//            is.close();
-//        }
-//        // 拼装返回的数据
-//        try {
-//            T t = tClass.newInstance();
-//            t.setUnique_name(newFileName).setOriginal_name(fileName).setType(extension).setLink(link).setSize(file.getSize());
-//            return t;
-//        } catch (InstantiationException | IllegalAccessException e) {
-//            throw new DescribeException(-100,"内部错误");
-//        }
-//    }
-//
-//    /**
-//     * 压缩图片
-//     * @param originalPath  原始文件路径
-//     * @param thumbPath     压缩后文件路径
-//     * @param extension     文件后缀名
-//     */
-//    private static String thumbnails(String originalPath, String thumbPath, String extension) throws IOException {
-//        // outputFormat:文件输出后缀名
-//        // Thumbnails 如果用来压缩 png 格式的文件,会越压越大,
-//        // 得把 png 格式的图片转换为 jpg 格式
-//        if (PNG.equalsIgnoreCase(extension)) {
-//            String removeExtensionFilePath = FilenameUtils.removeExtension(thumbPath);
-//            // 由于 outputFormat 会自动在路径后加上后缀名,所以移除以前的后缀名
-//            Thumbnails.of(originalPath).scale(1f)
-//                    .outputQuality(0.5f)
-//                    .outputFormat("jpg")
-//                    .toFile(removeExtensionFilePath);
-//        } else {
-//            Thumbnails.of(originalPath).scale(1f).outputQuality(0.5f).toFile(thumbPath);
-//        }
-//        // 删除被压缩的文件
-////        FileUtils.forceDelete(new File(thumbPath));
-//        return thumbPath.replace(path, host);
-//    }
-//
-//    /**
-//     * 检查所有文件类型是否符合要求
-//     * @param files 所有文件
-//     * @param extensions 允许上传的文件类型
-//     */
-//    public static Boolean checkType(MultipartFile[] files, String extensions){
-//        Boolean aBoolean = true;
-//        for (MultipartFile file : files){
-//            if(ObjectUtils.isEmpty(file) || file.isEmpty()){
-//                throw new DescribeException(ExceptionEnum.FILE_UPLOAD_OBJECT_NOT_EXIST);
-//            }
-//            // 文件名
-//            String fileName = file.getOriginalFilename();
-//            // 文件后缀名
-//            String extension = FilenameUtils.getExtension(fileName);
-//            if (StringUtils.isEmpty(extension)) {
-//                throw new DescribeException(ExceptionEnum.FILE_UPLOAD_TYPE_NOT_DEFINED);
-//            }
-////            aBoolean = isContains(extensions, extension);
-////            if (BooleanUtils.isFalse(aBoolean)){
-////                break;
-////            }
-//        }
-//        return aBoolean;
-//    }
-//
-//    public static Boolean checkIsImage(MultipartFile file, String extensions){
-//        // 文件名
-//        String fileName = file.getOriginalFilename();
-//        // 文件后缀名
-//        String extension = FilenameUtils.getExtension(fileName);
-//        return isContains(extensions,extension);
-//    }
-//
-//    /**
-//     * 判断 extension 中是否存在 extensionName
-//     * @param extension         使用逗号隔开的字符串,精确匹配例如:txt,jpg,png,zip
-//     * @param extensionName     文件的后缀名
-//     */
-//    public static Boolean isContains(String extension, String extensionName){
-//       if (StringUtils.isNotEmpty(extension)){
-//           String[] extensions = StringUtils.split(extension, ",");
-//           if (ArrayUtils.isNotEmpty(extensions)){
-//               List<String> extensionsList = Arrays.asList(extensions);
-//               return extensionsList.contains(extensionName);
-//           }else {
-//                // 判断文件的后缀名是否为 extension
-//               return extension.equalsIgnoreCase(extensionName);
-//           }
-//       }
-//       return true;
-//    }
-//
-//    /**
-//     * 生成文件文件名
-//     * @param extension      上传文件后缀名
-//     */
-//    private static String getUniqueName(String extension){
-//        return UUID.randomUUID().toString() + "."+extension;
-//    }
-//
-//    /**
-//     * 生成文件在的实际的路径
-//     * @param destPath 文件的相对路径
-//     */
-//    public static String getServerPath(String path, String destPath){
-//        // 文件分隔符转化为当前系统的格式
-//        return FilenameUtils.separatorsToSystem(path + destPath);
-//    }
-//
-//    public static String getChunkFileFolderPath(String childFile){
-//        return getServerPath(path,childFile+ "/chunks/");
-//    }
-//
-//    /******************** 以下是为处理分片上传文件新添加的代码 2020-12-18 EdwinXu *******************/
-//
-//    /**
-//     * 检查文件是否上传,非临时文件,文件上传中间生成的临时文件在上传完后删除
-//     * @param fileMd5   文件唯一值
-//     * @param fileExt   文件后缀名
-//     */
-//    public static boolean register(String fileMd5, String childFile, String fileExt) throws IOException {
-//        // 关闭上传限制
-//        // Boolean aBoolean = isContains(extensions,fileExt);
-//        // 检查文件是否上传
-//        // 1.获取文件的路径
-//        String fileName = fileMd5 + "." + fileExt;
-//        String serverPath = getServerPath(path, childFile+ '/' + fileName);
-//        File file = createFile(serverPath);
-//        return ObjectUtils.isNotEmpty(file);
-//    }
-//        // 验证文件格式是否允许上传
-//
-//    /**
-//     * 检查块文件 应该去对应文件的临时文件夹下(chunk)
-//     * @param childFile     文件相对位置
-//     * @param chunk         块序号
-//     */
-//    public static boolean checkChunk(String childFile, Integer chunk) {
-//        //得到块文件所在路径
-//        String chunkFileFolderPath = getChunkFileFolderPath(childFile);
-//        //块文件的文件名称以1,2,3..序号命名,没有扩展名
-//        File chunkFile = new File(chunkFileFolderPath +chunk);
-//        return chunkFile.exists();
-//    }
-//
-//    /**
-//     * 块文件上传
-//     * @param file          文件
-//     * @param childFile     文件具体目录
-//     * @param chunk         文件块号
-//     */
-//    public static boolean uploadChunk(MultipartFile file, String childFile, Integer chunk) {
-//        if (ObjectUtils.isEmpty(file)) {
-//            throw new DescribeException(ExceptionEnum.FILE_IS_EMPTY);
-//        }
-//        TreeMap<Integer,Integer> treeMap = new TreeMap<>();
-//        int[] count = new int[40];
-//        Arrays.sort(count);
-//        //创建块文件目录
-//        boolean chunksFileFolder = createChunksFileFolder(getChunkFileFolderPath(childFile));
-//        //块文件
-//        File chunkFile = new File(getChunkFileFolderPath(childFile) + chunk);
-//        //上传的块文件
-//        InputStream inputStream = null;
-//        FileOutputStream outputStream = null;
-//        try {
-//            inputStream = file.getInputStream();
-//            outputStream = new FileOutputStream(chunkFile);
-//            IOUtils.copy(inputStream, outputStream);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//            throw new DescribeException(ExceptionEnum.FILE_BLOCK_UPLOAD_FAILED);
-//        } finally {
-//            try {
-//                if (inputStream!=null){
-//                    inputStream.close();
-//                }
-//                if (outputStream!=null){
-//                    outputStream.close();
-//                }
-//            } catch (IOException e) {
-//                e.printStackTrace();
-//            }
-//        }
-//        return true;
-//    }
-//
-//    // 合并块文件
-//
-//    public static <T extends Material> T mergeChunks(String fileMd5, String fileName, String childFile, Long fileSize, String mimeType, String fileExt, Class<T> nClass) {
-//        //获取块文件的路径
-//        String chunkFileFolderPath = getChunkFileFolderPath(childFile);
-//        File chunkFileFolder = new File(chunkFileFolderPath);
-//        String uniqueName = fileMd5+"."+fileExt;
-//        if (!chunkFileFolder.exists()) {
-//            boolean mkdir = chunkFileFolder.mkdirs();
-//            if (!mkdir){
-//                throw new DescribeException(ExceptionEnum.FILE_MERGE_FAILED);
-//            }
-//        }
-//        //合并文件路径
-//        String originalPath  = getServerPath(path,childFile+"/"+uniqueName);
-//        String thumbPath = getServerPath(path,childFile+"/"+"thumb-"+uniqueName);
-//        File mergeFile = new File(originalPath);
-//        //创建合并文件
-//        //合并文件存在先删除再创建
-//        if (mergeFile.exists()) {
-//            boolean delete = mergeFile.delete();
-//            if (!delete){
-//                throw new DescribeException(ExceptionEnum.FILE_MERGE_FAILED);
-//            }
-//        }
-//        boolean newFile = false;
-//        try {
-//            newFile = mergeFile.createNewFile();
-//        } catch (IOException e) {
-//            e.printStackTrace();
-//        }
-//        if (!newFile) {
-//            throw new DescribeException(ExceptionEnum.FILE_MERGE_IS_EMPTY);
-//        }
-//        //获取块文件,此列表是已经排好序的列表
-//        List<File> chunkFiles = getChunkFiles(chunkFileFolder);
-//        //合并文件
-//        mergeFile = mergeFile(mergeFile, chunkFiles);
-//        if (mergeFile == null) {
-//            throw new DescribeException(ExceptionEnum.FILE_MERGE_FAILED);
-//        }
-//        boolean checkResult = checkFileMd5(mergeFile, fileMd5);
-//        if (!checkResult) {
-//            throw new DescribeException(ExceptionEnum.FILE_CHECK_FAILED);
-//        }
-//        try {
-//            // 删除临时文件下的文件块,防止后面继续上传
-//            deleteChunks(childFile);
-//            T t = nClass.newInstance();
-//            String link = getServerPath(host,childFile+'/'+uniqueName);
-//            uniqueName = fileMd5+childFile+"."+fileExt;
-//            t.setUnique_name(uniqueName)
-//                    .setOriginal_name(fileName)
-//                    .setType(fileExt)
-//                    .setLink(link)
-//                    .setSize(fileSize);
-//            // 如果是图片,则生成缩略图
-//            if (isContains("JPG,jpg,bmp,BMP,gif,GIF,bmp,BMP,png,PNG,jpeg,JPEG,svg",fileExt)){
-//                String thumbnails = thumbnails(originalPath, thumbPath, fileExt);
-//                if(PNG.equalsIgnoreCase(fileExt)){
-//                    thumbnails = thumbnails.substring(0,thumbnails.length()-3)+"jpg";
-//                }
-//                t.setThumbnails(thumbnails);
-//            }
-//            return t;
-//        } catch (InstantiationException | IllegalAccessException | IOException e) {
-//            e.printStackTrace();
-//            throw new DescribeException(ExceptionEnum.FILE_MERGE_FAILED);
-//        }
-//    }
-//
-//    // 校验文件的md5值
-//
-//    private static boolean checkFileMd5(File mergeFile, String md5) {
-//        if ( ObjectUtils.isEmpty(mergeFile) || StringUtils.isEmpty(md5)) {
-//            return false;
-//        }
-//        //进行md5校验
-//        FileInputStream mergeFileInputStream = null;
-//        try {
-//            mergeFileInputStream = new FileInputStream(mergeFile);
-//            //得到文件的md5
-//            String mergeFileMd5 = DigestUtils.md5Hex(mergeFileInputStream);
-//            logger.info("md5:--------->" + md5);
-//            logger.info("md5:--------->" + mergeFileMd5);
-//            //比较md5
-//            if (md5.equalsIgnoreCase(mergeFileMd5)) {
-//                return true;
-//            }
-//
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        } finally {
-//            try {
-//                assert mergeFileInputStream != null;
-//                mergeFileInputStream.close();
-//            } catch (IOException e) {
-//                e.printStackTrace();
-//            }
-//        }
-//        return false;
-//    }
-//
-//    //获取所有块文件
-//
-//    private static List<File> getChunkFiles(File chunkFileFolder) {
-//        //获取路径下的所有块文件
-//        File[] chunkFiles = chunkFileFolder.listFiles();
-//        //将文件数组转成list,并排序
-//        assert chunkFiles != null;
-//        List<File> chunkFileList = new ArrayList<>(Arrays.asList(chunkFiles));
-//        //排序
-//        chunkFileList.sort((o1, o2) -> {
-//            int a = Integer.parseInt(o1.getName());
-//            int b = Integer.parseInt(o2.getName());
-//            if ( a > b) {
-//                return 1;
-//            }
-//            return a == b ? 0 : -1;
-//        });
-//        return chunkFileList;
-//    }
-//
-//    //合并文件
-//
-//    private static File mergeFile(File mergeFile, List<File> chunkFiles) {
-//        try {
-//            //创建写文件对象
-//            RandomAccessFile rafWrite = new RandomAccessFile(mergeFile, "rw");
-//            //遍历分块文件开始合并
-//            //读取文件缓冲区
-//            byte[] b = new byte[1024];
-//            for (File chunkFile : chunkFiles) {
-//                RandomAccessFile rafRead = new RandomAccessFile(chunkFile, "r");
-//                int len = -1;
-//                //读取分块文件
-//                while ((len = rafRead.read(b)) != -1) {
-//                    //向合并文件中写数据
-//                    rafWrite.write(b, 0, len);
-//                }
-//                rafRead.close();
-//            }
-//            rafWrite.close();
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//            return null;
-//        }
-//        return mergeFile;
-//    }
-//
-//    public static void deleteChunks(String childFile){
-//        File file = new File(path + childFile + "/chunks");
-//        File[] files = file.listFiles();
-//        assert files != null;
-//        for (File file1:files){
-//            file1.delete();
-//        }
-//        file.delete();
-//    }
-}

+ 179 - 0
src/main/java/com/loan/system/utils/HttpClientUtil.java

@@ -0,0 +1,179 @@
+package com.loan.system.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Http工具类
+ */
+public class HttpClientUtil {
+
+    static final  int TIMEOUT_MSEC = 5 * 1000;
+
+    /**
+     * 发送GET方式请求
+     * @param url
+     * @param paramMap
+     * @return
+     */
+    public static String doGet(String url,Map<String,String> paramMap){
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+
+        String result = "";
+        CloseableHttpResponse response = null;
+
+        try{
+            URIBuilder builder = new URIBuilder(url);
+            if(paramMap != null){
+                for (String key : paramMap.keySet()) {
+                    builder.addParameter(key,paramMap.get(key));
+                }
+            }
+            URI uri = builder.build();
+
+            //创建GET请求
+            HttpGet httpGet = new HttpGet(uri);
+
+            //发送请求
+            response = httpClient.execute(httpGet);
+
+            //判断响应状态
+            if(response.getStatusLine().getStatusCode() == 200){
+                result = EntityUtils.toString(response.getEntity(),"UTF-8");
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            try {
+                response.close();
+                httpClient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 发送POST方式请求
+     * @param url
+     * @param paramMap
+     * @return
+     * @throws IOException
+     */
+    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+
+            // 创建参数列表
+            if (paramMap != null) {
+                List<NameValuePair> paramList = new ArrayList();
+                for (Map.Entry<String, String> param : paramMap.entrySet()) {
+                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+
+            httpPost.setConfig(builderRequestConfig());
+
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+
+    /**
+     * 发送POST方式请求
+     * @param url
+     * @param paramMap
+     * @return
+     * @throws IOException
+     */
+    public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+
+            if (paramMap != null) {
+                //构造json格式数据
+                JSONObject jsonObject = new JSONObject();
+                for (Map.Entry<String, String> param : paramMap.entrySet()) {
+                    jsonObject.put(param.getKey(),param.getValue());
+                }
+                StringEntity entity = new StringEntity(jsonObject.toString(),"utf-8");
+                //设置请求编码
+                entity.setContentEncoding("utf-8");
+                //设置数据类型
+                entity.setContentType("application/json");
+                httpPost.setEntity(entity);
+            }
+
+            httpPost.setConfig(builderRequestConfig());
+
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+    private static RequestConfig builderRequestConfig() {
+        return RequestConfig.custom()
+                .setConnectTimeout(TIMEOUT_MSEC)
+                .setConnectionRequestTimeout(TIMEOUT_MSEC)
+                .setSocketTimeout(TIMEOUT_MSEC).build();
+    }
+
+}

+ 21 - 19
src/main/java/com/loan/system/utils/PoiWordUtil.java

@@ -2,6 +2,8 @@ package com.loan.system.utils;
 
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.util.PoitlIOUtils;
+import com.loan.system.domain.entity.Contract;
+import com.loan.system.domain.pojo.ContractInformation;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedOutputStream;
@@ -16,11 +18,11 @@ import java.util.HashMap;
  * @date : Created in 2021/1/26 16:15
  */
 public class PoiWordUtil {
-//    public static void writeApprove(HttpServletResponse response, String path, Approve approveById, String downloadName){
-//        File file = new File(path);
-//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-//        XWPFTemplate template = XWPFTemplate.compile(file).render(
-//                new HashMap<String, Object>(){{
+    public static void writeApprove(HttpServletResponse response, String path, ContractInformation contract, String downloadName){
+        File file = new File(path);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        XWPFTemplate template = XWPFTemplate.compile(file).render(
+                new HashMap<String, Object>(){{
 //                    put("projectName", approveById.getProjectName());
 //                    put("copies", approveById.getCopies());
 //                    put("submittingDepartment", approveById.getSubmittingDepartment());
@@ -33,18 +35,18 @@ public class PoiWordUtil {
 //                    put("leadersInChargeReviewComments", approveById.getLeadersInChargeReviewComments());
 //                    put("contractCommissionSignedOptions", approveById.getContractCommissionSignedOptions());
 //                    put("contractNumber", approveById.getContractNumber());
-//                }});
-//        try {
-//            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8");
-//            response.setHeader("Content-Disposition","attachment;filename=\""+downloadName+".docx"+"\"");
-//            OutputStream out = response.getOutputStream();
-//            BufferedOutputStream bos = new BufferedOutputStream(out);
-//            template.write(bos);
-//            bos.flush();
-//            out.flush();
-//            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
-//        } catch (IOException e) {
-//            e.printStackTrace();
-//        }
-//    }
+                }});
+        try {
+            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8");
+            response.setHeader("Content-Disposition","attachment;filename=\""+downloadName+".docx"+"\"");
+            OutputStream out = response.getOutputStream();
+            BufferedOutputStream bos = new BufferedOutputStream(out);
+            template.write(bos);
+            bos.flush();
+            out.flush();
+            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
 }

BIN
test/project--1/contracts/contract-12/1f64604893ced5c46fa6163ac47fd884.xlsx


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