Explorar el Código

未合并前提交

25057 hace 5 meses
padre
commit
7018fbb971
Se han modificado 100 ficheros con 2639 adiciones y 198 borrados
  1. 24 0
      pom.xml
  2. 30 0
      src/main/java/com/loan/system/config/FileUploadConfig.java
  3. 1 1
      src/main/java/com/loan/system/config/WebMvcConfiguration.java
  4. 11 0
      src/main/java/com/loan/system/controller/wechat/ApproveController.java
  5. 109 0
      src/main/java/com/loan/system/controller/wechat/ContractController.java
  6. 43 0
      src/main/java/com/loan/system/controller/wechat/DictionaryController.java
  7. 149 0
      src/main/java/com/loan/system/controller/wechat/DisbursementController.java
  8. 300 0
      src/main/java/com/loan/system/controller/wechat/LoanController.java
  9. 11 0
      src/main/java/com/loan/system/controller/wechat/RepaymentController.java
  10. 24 0
      src/main/java/com/loan/system/controller/wechat/StepController.java
  11. 161 83
      src/main/java/com/loan/system/controller/wechat/UploadController.java
  12. 110 13
      src/main/java/com/loan/system/controller/wechat/UserController.java
  13. 24 0
      src/main/java/com/loan/system/domain/dto/ApprovalRecordDTO.java
  14. 25 0
      src/main/java/com/loan/system/domain/dto/CollateralDTO.java
  15. 26 0
      src/main/java/com/loan/system/domain/dto/ContractDTO.java
  16. 21 0
      src/main/java/com/loan/system/domain/dto/CustomersOtherDTO.java
  17. 28 0
      src/main/java/com/loan/system/domain/dto/DisbursementDTO.java
  18. 25 0
      src/main/java/com/loan/system/domain/dto/DisbursementRecordDTO.java
  19. 21 0
      src/main/java/com/loan/system/domain/dto/DocumentDTO.java
  20. 39 0
      src/main/java/com/loan/system/domain/dto/LoanCaseDTO.java
  21. 7 0
      src/main/java/com/loan/system/domain/dto/UserLoginDTO.java
  22. 2 2
      src/main/java/com/loan/system/domain/entity/ApprovalRecord.java
  23. 5 2
      src/main/java/com/loan/system/domain/entity/BizRecommender.java
  24. 11 2
      src/main/java/com/loan/system/domain/entity/Collateral.java
  25. 12 3
      src/main/java/com/loan/system/domain/entity/Contract.java
  26. 39 0
      src/main/java/com/loan/system/domain/entity/ContractAndCollateral.java
  27. 32 0
      src/main/java/com/loan/system/domain/entity/ContractSeq.java
  28. 5 2
      src/main/java/com/loan/system/domain/entity/Customer.java
  29. 5 2
      src/main/java/com/loan/system/domain/entity/CustomersOther.java
  30. 1 1
      src/main/java/com/loan/system/domain/entity/DictAttribute.java
  31. 1 1
      src/main/java/com/loan/system/domain/entity/DictBusinessType.java
  32. 1 1
      src/main/java/com/loan/system/domain/entity/DictChannel.java
  33. 1 1
      src/main/java/com/loan/system/domain/entity/DictLocation.java
  34. 1 1
      src/main/java/com/loan/system/domain/entity/DictMessage.java
  35. 1 1
      src/main/java/com/loan/system/domain/entity/DictStep.java
  36. 1 1
      src/main/java/com/loan/system/domain/entity/DictType.java
  37. 4 4
      src/main/java/com/loan/system/domain/entity/Disbursement.java
  38. 11 1
      src/main/java/com/loan/system/domain/entity/DisbursementRecord.java
  39. 13 4
      src/main/java/com/loan/system/domain/entity/Document.java
  40. 11 14
      src/main/java/com/loan/system/domain/entity/LoanCase.java
  41. 2 2
      src/main/java/com/loan/system/domain/entity/Repayment.java
  42. 1 1
      src/main/java/com/loan/system/domain/entity/RepaymentRecord.java
  43. 9 0
      src/main/java/com/loan/system/domain/entity/Role.java
  44. 1 1
      src/main/java/com/loan/system/domain/entity/StatBusinessSnapshot.java
  45. 1 1
      src/main/java/com/loan/system/domain/entity/StatFundEfficiency.java
  46. 4 7
      src/main/java/com/loan/system/domain/entity/Step.java
  47. 2 5
      src/main/java/com/loan/system/domain/entity/User.java
  48. 26 0
      src/main/java/com/loan/system/domain/enums/BusinessAttrEnum.java
  49. 1 1
      src/main/java/com/loan/system/domain/enums/StepEnum.java
  50. 55 23
      src/main/java/com/loan/system/domain/enums/StepPropertyEnum.java
  51. 4 0
      src/main/java/com/loan/system/domain/pojo/ContractInformation.java
  52. 25 0
      src/main/java/com/loan/system/domain/vo/CollateralVO.java
  53. 28 0
      src/main/java/com/loan/system/domain/vo/ContractVO.java
  54. 23 0
      src/main/java/com/loan/system/domain/vo/CustomerVO.java
  55. 18 0
      src/main/java/com/loan/system/domain/vo/CustomersOtherVO.java
  56. 28 0
      src/main/java/com/loan/system/domain/vo/DisbursementVO.java
  57. 21 0
      src/main/java/com/loan/system/domain/vo/DocumentVO.java
  58. 40 0
      src/main/java/com/loan/system/domain/vo/LoanCaseVO.java
  59. 13 0
      src/main/java/com/loan/system/domain/vo/PreApproveVO.java
  60. 25 0
      src/main/java/com/loan/system/domain/vo/StepVO.java
  61. 2 2
      src/main/java/com/loan/system/domain/vo/UserLoginVO.java
  62. 3 1
      src/main/java/com/loan/system/exception/FileException.java
  63. 68 0
      src/main/java/com/loan/system/interceptor/JwtTokenUserInterceptor.java
  64. 3 3
      src/main/java/com/loan/system/json/JacksonObjectMapper.java
  65. 5 3
      src/main/java/com/loan/system/loan_system.sql
  66. 10 8
      src/main/java/com/loan/system/properties/WeChatProperties.java
  67. 17 0
      src/main/java/com/loan/system/repository/ApproveRecordRepository.java
  68. 46 0
      src/main/java/com/loan/system/repository/CollateralRepository.java
  69. 25 0
      src/main/java/com/loan/system/repository/ContractAndCollateralRepository.java
  70. 64 0
      src/main/java/com/loan/system/repository/ContractRepository.java
  71. 26 0
      src/main/java/com/loan/system/repository/ContractSeqRepository.java
  72. 43 0
      src/main/java/com/loan/system/repository/CustomerOtherRepository.java
  73. 36 0
      src/main/java/com/loan/system/repository/CustomerRepository.java
  74. 15 0
      src/main/java/com/loan/system/repository/DictAttributeRepository.java
  75. 15 0
      src/main/java/com/loan/system/repository/DictChannelRepository.java
  76. 16 0
      src/main/java/com/loan/system/repository/DictLocationRepository.java
  77. 16 0
      src/main/java/com/loan/system/repository/DictStepRepository.java
  78. 17 0
      src/main/java/com/loan/system/repository/DictTypeRepository.java
  79. 19 0
      src/main/java/com/loan/system/repository/DisbursementRepository.java
  80. 41 0
      src/main/java/com/loan/system/repository/DocumentRepository.java
  81. 38 0
      src/main/java/com/loan/system/repository/LoanRepository.java
  82. 16 0
      src/main/java/com/loan/system/repository/RecommenderRepository.java
  83. 15 0
      src/main/java/com/loan/system/repository/RoleRepository.java
  84. 41 0
      src/main/java/com/loan/system/repository/StepRepository.java
  85. 15 0
      src/main/java/com/loan/system/repository/UploadRepository.java
  86. 6 0
      src/main/java/com/loan/system/repository/UserRepository.java
  87. 9 0
      src/main/java/com/loan/system/service/ApproveService.java
  88. 19 0
      src/main/java/com/loan/system/service/CollateralService.java
  89. 13 0
      src/main/java/com/loan/system/service/ContractAndCollateralService.java
  90. 11 0
      src/main/java/com/loan/system/service/ContractSeqService.java
  91. 27 0
      src/main/java/com/loan/system/service/ContractService.java
  92. 22 0
      src/main/java/com/loan/system/service/CustomerOtherService.java
  93. 25 0
      src/main/java/com/loan/system/service/CustomerService.java
  94. 16 0
      src/main/java/com/loan/system/service/DictionaryService.java
  95. 11 0
      src/main/java/com/loan/system/service/DisbursementService.java
  96. 19 0
      src/main/java/com/loan/system/service/DocumentService.java
  97. 50 0
      src/main/java/com/loan/system/service/Impl/ApproveServiceImpl.java
  98. 55 0
      src/main/java/com/loan/system/service/Impl/CollateralServiceImpl.java
  99. 40 0
      src/main/java/com/loan/system/service/Impl/ContractAndCollateralServiceImpl.java
  100. 31 0
      src/main/java/com/loan/system/service/Impl/ContractSeqServiceImpl.java

+ 24 - 0
pom.xml

@@ -49,6 +49,30 @@
             <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>
+
+        <!-- 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>

+ 30 - 0
src/main/java/com/loan/system/config/FileUploadConfig.java

@@ -0,0 +1,30 @@
+package com.loan.system.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.beans.factory.annotation.Value; // 添加此行
+
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Configuration
+public class FileUploadConfig {
+
+    @Value("${upload.location}")
+    private String uploadDir;
+
+    @Value("${upload.extensions}")
+    private String allowedExtensions;
+
+    public String getUploadDir() {
+        return uploadDir.endsWith("/")? uploadDir : uploadDir + "/";
+    }
+
+    /** 把 yml 中的扩展名字符串解析成 Set<String> */
+    public Set<String> getAllowedExtensions() {
+        return Arrays.stream(allowedExtensions.split(","))
+                .map(s -> s.toLowerCase(Locale.ROOT).trim())
+                .collect(Collectors.toSet());
+    }
+}

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

@@ -99,7 +99,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/");
     }
 
     /*

+ 11 - 0
src/main/java/com/loan/system/controller/wechat/ApproveController.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/approve")
+@Api(tags = "业务审批接口")
+public class ApproveController {
+}

+ 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");
+    }
+
+
+
+
+
+
+}

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

@@ -0,0 +1,300 @@
+package com.loan.system.controller.wechat;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.context.BaseContext;
+import com.loan.system.domain.dto.*;
+import com.loan.system.domain.entity.*;
+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.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.data.repository.query.Param;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+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 ApproveService 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 若保存,则设置为未完成,若提交,则设置为已完成
+        //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");
+//    }
+//
+//    @PostMapping("/{id}/commit")//请求中操作复杂,putmapping仅适用于更新操作
+//    @ApiOperation("提交业务(未)")
+//    public Result addLoanCase(@PathVariable("id")Long caseId, @RequestBody LoanCaseDTO loanCaseDTO){//isComplete 若保存,则设置为未完成,若提交,则设置为已完成
+//        //1.补充业务信息
+//        loanService.updateLoanCaseById(loanCaseDTO,caseId);
+//
+//        //2.设置合同(若存在则修改)
+//        List<Contract> contracts = new ArrayList<>();//新增的合同
+//        for(ContractDTO contractDTO : loanCaseDTO.getContracts()){
+//            //contract.setCaseId(caseId);
+//            Contract c =contractService.findContractByCaseIdAndBusinessAttr( contractDTO.getCaseId(),contractDTO.getBusinessAttr(),false);
+//            if(ObjectUtils.isEmpty(c))
+//                c = contractService.saveContract(contractDTO);
+//            else
+//                contractService.updateContractById(c.getId(),contractDTO,false);
+//
+//            //考虑删除合同/押品的情况
+//            contracts.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(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));
+//        }
+//
+//        //5.设置客户婚姻
+//        customerService.updateMarriedStatusById(loanCaseDTO.getCustomerId(),loanCaseDTO.getMarriedStatus());
+//
+//        //6.设置阶段负责人与状态(如果第一个人是辅办人员,那第二个人必须是主办)
+//        stepService.updateUserByCaseId(StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),BaseContext.getCurrentId(),caseId);
+//        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);
+//        //List<StepVO> list = stepService.getStepByCaseId(caseId);
+//
+//        //7.推送消息
+//
+//
+//        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));
+    }
+}

+ 161 - 83
src/main/java/com/loan/system/controller/wechat/UploadController.java

@@ -1,99 +1,177 @@
 package com.loan.system.controller.wechat;
 
+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.service.Impl.MediaUploadService;
-import com.loan.system.utils.FileUploadUtil;
+import com.loan.system.domain.vo.DocumentVO;
+import com.loan.system.service.DocumentService;
 import com.loan.system.utils.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.io.FilenameUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 
-/**
- * @author : EdwinXu
- * @date : Created in 2020/12/16 15:34
- */
 @RestController
+@RequestMapping("/wechat/file")
+@Api(tags = "文件处理接口")
 public class UploadController {
+    @Autowired
+    private DocumentService fileService;
+    @Autowired
+    private FileUploadConfig config;
 
-//    @Autowired
-//    MediaUploadService uploadService;
-//
-//    @PostMapping("/file/verify")
-//    public Result verifyExist(@RequestParam("fileMd5") String fileMd5,
-//                              @RequestParam("fileName") String fileName,
-//                              @RequestParam("fileSize") Long fileSize,
-//                              @RequestParam("mimetype") String mimetype,
-//                              @RequestParam("fileExt") String fileExt) throws IOException {
-//        System.out.println("=========register==========> ");
-//        System.out.println(fileMd5);
-//        System.out.println(fileName);
-//        System.out.println(fileSize);
-//        System.out.println(mimetype);
-//        System.out.println(fileExt);
-//        boolean register = FileUploadUtil.register(fileMd5, "/project-1/contracts/contract-1", fileExt);
-//        if (register){
-//            return ResultUtil.success();
-//        } else {
-//            return ResultUtil.error(ExceptionEnum.FILE_NOT_EXIST);
-//        }
-////        return uploadService.register(fileMd5,fileName,fileSize,mimetype,fileExt);
-//    }
-//    //校验文件块
-//
-//    @PostMapping("/checkChunk")
-//    public Result checkChunk(@RequestParam("fileMd5") String fileMd5,
-//                             @RequestParam("chunk") Integer chunk,
-//                             @RequestParam("chunkSize") Integer chunkSize) {
-//        System.out.println("=========checkChunk==========> ");
-//        boolean aBoolean = FileUploadUtil.checkChunk("/project-1/contracts/contract-1", chunk);
-//        if (aBoolean){
-//            return ResultUtil.success();
-//        } else {
-//            return ResultUtil.error(ExceptionEnum.FILE_NOT_EXIST);
-//        }
-////        return uploadService.checkChunk(fileMd5,chunk,chunkSize);
-//    }
-//
-//    //上传文件块
-//
-//    @PostMapping("/uploadChunk")
-//    public Result uploadChunk(@RequestParam("file") MultipartFile file,
-//                              @RequestParam("fileMd5") String fileMd5,
-//                              @RequestParam("chunk") Integer chunk) {
-//        System.out.println("=========uploadChunk==========> ");
-//        System.out.println(file);
-//        System.out.println(fileMd5);
-//        System.out.println(chunk);
-//        boolean uploadChunk = FileUploadUtil.uploadChunk(file, "/project-1/contracts/contract-1", chunk);
-//        if (uploadChunk){
-//            return ResultUtil.success();
+    /** 上传文件(支持任意类型,只要在白名单内) */
+    @PostMapping("/upload/{caseId}/{type}")
+    @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];
+
+            if (file.isEmpty())
+                return ResultUtil.error(ExceptionEnum.FILE_IS_EMPTY);
+
+            String originalName = file.getOriginalFilename();
+            String ext = FilenameUtils.getExtension(originalName).toLowerCase(Locale.ROOT);
+
+            // 从配置中读取允许的扩展名
+            Set<String> allowed = config.getAllowedExtensions();
+            if (!allowed.contains(ext)) {
+                ResultUtil.error(ExceptionEnum.FILE_UPLOAD_TYPE_NOT_DEFINED);
+            }
+
+            String newFileName = null;
+            // 生成新的文件名
+            if(i == 0)
+                newFileName = String.format("%d-%s-%s.%s", caseId, fileType, originalName, ext);
+            else
+                newFileName = String.format("%d-%s-%s(%d).%s", caseId, fileType, originalName, i, ext);
+
+            // 创建目录
+            File uploadDir = new File(config.getUploadDir(), caseId + "/" + fileType);
+            if (!uploadDir.exists() && !uploadDir.mkdirs()) {
+                return ResultUtil.error(ExceptionEnum.DIRECTORY_CREATE_ERROR);
+            }
+
+            // 使用NIO复制流,稳定性更好
+            File destFile = new File(uploadDir, newFileName);
+            try (InputStream in = file.getInputStream()) {
+                Files.copy(in, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+            }
+
+            Document document = new Document();
+            document.setCaseId(caseId);
+            document.setFileName(newFileName);
+            document.setOriginName(originalName);
+            document.setFilePath(destFile.getPath());
+            document.setFileSize(file.getSize());
+            document.setDocType(ext);
+            document.setDictType(fileType);
+            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")));
+            fileList.add(fileService.uploadFile(document));
+        }
+
+        return ResultUtil.success("上传成功", fileList);
+    }
+
+
+    /** 下载文件 */
+    @GetMapping("/download/{fileName}")
+    @ApiOperation("文件下载")
+    public void downloadFile(@PathVariable String fileName, HttpServletResponse response)throws  IOException{
+        File file = new File(config.getUploadDir(), fileName);
+        if (!file.exists()) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在");
+            return;
+        }
+
+        response.setContentType(Files.probeContentType(file.toPath()));
+        response.setHeader("Content-Disposition",
+                "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
+
+        try (InputStream in = new FileInputStream(file);
+             OutputStream out = response.getOutputStream()) {
+            byte[] buffer = new byte[8192];
+            int len;
+            while ((len = in.read(buffer)) != -1) {
+                out.write(buffer, 0, len);
+            }
+        }
+    }
+
+    /** 删除文件 */
+    @DeleteMapping("/delete/{caseId}/{type}")
+    @ApiOperation("文件删除")
+    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);
+
+        boolean isDelete = file.delete();
+        if (!isDelete)
+            return ResultUtil.error(ExceptionEnum.FILE_DELETE_ERROR);
+
+        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 {
-//            return ResultUtil.error(ExceptionEnum.FILE_NOT_EXIST);
+//            // 如果有文件未能成功删除,可以记录日志或采取其他措施
+//            System.out.println("Failed to delete some files in directory: " + uploadDir.getAbsolutePath());
 //        }
-//        return uploadService.uploadChunk(file,fileMd5,chunk);
-//    }
+    }
+
 
-    //合并文件块
-/*
-    @PostMapping("/mergeChunks")
-    public Result mergeChunks(@RequestParam("fileMd5") String fileMd5,
-                              @RequestParam("fileName") String fileName,
-                              @RequestParam("fileSize") Long fileSize,
-                              @RequestParam("mimetype") String mimetype,
-                              @RequestParam("fileExt") String fileExt) {
-        System.out.println("=========mergeChunks==========> ");
-        System.out.println(fileMd5);
-        System.out.println(fileName);
-        System.out.println(fileSize);
-        System.out.println(mimetype);
-        System.out.println(fileExt);
-//        return uploadService.mergeChunks(fileMd5,fileMd5,fileSize,mimetype,fileExt);
-//        FileUploadUtil.mergeChunks(fileMd5, fileName, "/project-1/contracts/contract-1", fileSize, mimetype, fileExt);
-
-    }*/
+//    @PostMapping("save/{caseId}/{type}")
+//    public Result saveFile(@PathVariable("caseId") Long caseId,@PathVariable("type") String type,@RequestParam String fileName){
+//        return ResultUtil.success();
+//    }
 }

+ 110 - 13
src/main/java/com/loan/system/controller/wechat/UserController.java

@@ -2,10 +2,18 @@ package com.loan.system.controller.wechat;
 
 import com.loan.system.constant.JwtClaimsConstant;
 import com.loan.system.domain.dto.UserLoginDTO;
+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.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.UserService;
 import com.loan.system.utils.JwtUtil;
 import com.loan.system.utils.ResultUtil;
@@ -15,7 +23,9 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.security.auth.login.LoginException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,33 +35,120 @@ import java.util.Map;
 @RestController
 @RequestMapping("/wechat")
 @Api(tags = "微信用户接口")
-public class UserController {
+public class UserController {//包含内部人员、外部人员
     @Autowired
     private UserService userService;
     @Autowired
     private JwtProperties jwtProperties;
 
+    @Autowired
+    private RoleRepository roleRepository;
+
+    @Autowired
+    private CustomerService customerService;
+
+    /*
+    1.先查询user查看是否为内部人员
+    2.若不是内部人员,查询外部人员
+    3.外部人员也不存在,进行注册(因为小程序端直接获取手机号,任何用户都可以登录)
+     */
     @PostMapping("/login")
     @ApiOperation("微信登陆")
     public Result login(@RequestBody UserLoginDTO userLoginDTO){
-        //微信登录
-        User user = userService.wxLogin(userLoginDTO);
-        System.out.println(userLoginDTO.getTel());
 
-        if (ObjectUtils.isEmpty(user))
-            throw new IllegalArgumentException("User object is null");
+        User user = userService.getUserByMobile(userLoginDTO.getTel());
+        UserLoginVO userLoginVO = new UserLoginVO();
 
         //为微信用户生成jwt令牌
         Map<String ,Object> claims=new HashMap<>();
-        claims.put(JwtClaimsConstant.USER_ID,user.getId());
-        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
+        Long userId = null;
+
+        if (!ObjectUtils.isEmpty(user)){
+            userLoginVO.setUserId(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);
 
-        UserLoginVO userLoginVO = UserLoginVO.builder()
-                .id(user.getId())
-                .openid(user.getOpenid())
-                .token(token)
-                .build();
+                customer = customerService.getCustomerByMobile(userLoginDTO.getTel());
+            }
+            userLoginVO.setUserId(customer.getId());
+            userLoginVO.setRole(RoleEnum.EXTERNAL.getMsg());
+            userLoginVO.setOpenid(customer.getOpenid());
+        }
+
+        claims.put(JwtClaimsConstant.USER_ID,userLoginVO.getUserId());
+        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
+        userLoginVO.setToken(token);
 
         return ResultUtil.success("success", userLoginVO);
     }
+
+//    @PostMapping("/login")
+//    @ApiOperation("微信登陆")
+//    public Result login(@RequestBody UserLoginDTO userLoginDTO){
+//        //微信登录
+//        User user = userService.wxLogin(userLoginDTO);
+//
+//        //为微信用户生成jwt令牌
+//        Map<String ,Object> claims=new HashMap<>();
+//        claims.put(JwtClaimsConstant.USER_ID,user.getId());
+//        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
+//
+//        UserLoginVO userLoginVO = new UserLoginVO();
+//        userLoginVO.setUserId(user.getId());
+//        userLoginVO.setOpenid(user.getOpenid());
+//        userLoginVO.setRole(user.getRole());
+//        userLoginVO.setToken(token);
+//
+//        return ResultUtil.success("success", userLoginVO);
+//    }
+
+    @PostMapping("/role")
+    @ApiOperation("添加用户角色")
+    public Result addRole(@RequestParam Long userId, @RequestBody Role role){
+        roleRepository.save(role);
+        return ResultUtil.success("success");
+    }
+
+    @GetMapping("/user/info")
+    @ApiOperation("查询用户信息")
+    public Result findUserInfo(){
+        return ResultUtil.success("success");
+    }
+
+    @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.findByCustomerId( id));
+    }
+
+    @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;
+
+}

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

@@ -0,0 +1,21 @@
+package com.loan.system.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DocumentDTO implements Serializable {
+    private Long caseId;//业务ID
+    private Long ownerId;//客户id
+    private String dictType;//资料类型
+    private String docType;//文档类型
+    private String filePath;//文件路径
+    private String fileName;//文件名
+    private Long fileSize;//文件大小
+}

+ 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;//是否涉及诉讼
+}

+ 7 - 0
src/main/java/com/loan/system/domain/dto/UserLoginDTO.java

@@ -1,10 +1,17 @@
 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 {
+    String code;
     String tel;
 }

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

@@ -33,10 +33,10 @@ public class ApprovalRecord extends BaseEntity{
     private String comments;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

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

@@ -31,6 +31,9 @@ public class BizRecommender extends BaseEntity{
     @Column(name = "channel", length = 50)
     private String channel;
 
+    @Column(name = "group" ,length = 50)
+    private String group;
+
     @Column(name = "id_card", length = 20)
     private String idCard;
 
@@ -48,10 +51,10 @@ public class BizRecommender extends BaseEntity{
     private String remark;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "create_user_id")
     private Long createUserId;

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

@@ -19,6 +19,12 @@ public class Collateral extends BaseEntity{
     @Column(name = "case_id")
     private Long caseId;
 
+    @Column(name = "contract_id")
+    private Long contractId;
+
+    @Column(name = "collateral_name", length = 50)
+    private String collateralName;
+
     @Column(name = "collateral_type", length = 30)
     private String collateralType;
 
@@ -31,6 +37,9 @@ public class Collateral extends BaseEntity{
     @Column(name = "address", length = 500)
     private String address;
 
+    @Column(name = "current_address", length = 255)
+    private String currentAddress;
+
     @Column(name = "eval_price", precision = 18, scale = 2)
     private BigDecimal evalPrice;
 
@@ -41,10 +50,10 @@ public class Collateral extends BaseEntity{
     private String staus;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 12 - 3
src/main/java/com/loan/system/domain/entity/Contract.java

@@ -24,6 +24,9 @@ public class Contract extends BaseEntity{
     @Column(name = "case_id")
     private Long caseId;
 
+    @Column(name = "customer_id")
+    private Long customerId;
+
     @Column(name = "contract_no", length = 50)
     private String contractNo;
 
@@ -49,17 +52,23 @@ public class Contract extends BaseEntity{
     @Column(name = "signed_by_customer")
     private Boolean signedByCustomer;
 
+    @Column(name = "commited_id")
+    private Long commitedId;
+
     @Column(name = "sifned_id")
     private Long sifnedId;
 
     @Column(name = "signed_time")
-    private Instant signedTime;
+    private String signedTime;
+
+    @Column(name = "is_push")
+    private Boolean isPush;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 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;
+
+}

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

@@ -31,6 +31,9 @@ public class Customer extends BaseEntity{
     @Column(name = "mobile", length = 11)
     private String mobile;
 
+    @Column(name = "married_status", length = 50)
+    private String marriedStatus;
+
     @Column(name = "register_source", length = 50)
     private String registerSource;
 
@@ -41,10 +44,10 @@ public class Customer extends BaseEntity{
     private Boolean faceAuth;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 5 - 2
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;
 
@@ -26,10 +29,10 @@ public class CustomersOther extends BaseEntity{
     private String mobile;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictAttribute.java

@@ -30,7 +30,7 @@ public class DictAttribute extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictBusinessType.java

@@ -30,7 +30,7 @@ public class DictBusinessType extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictChannel.java

@@ -31,7 +31,7 @@ public class DictChannel extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictLocation.java

@@ -30,7 +30,7 @@ public class DictLocation extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictMessage.java

@@ -30,7 +30,7 @@ public class DictMessage extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictStep.java

@@ -33,7 +33,7 @@ public class DictStep extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/DictType.java

@@ -30,7 +30,7 @@ public class DictType extends BaseEntity{
     private Integer sortOrder;
 
     @Column(name = "created_at")
-    private Instant createdAt;
+    private String createdAt;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 4 - 4
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,13 +50,13 @@ public class Disbursement extends BaseEntity{
     private Long contractId;
 
     @Column(name = "payout_time")
-    private Instant payoutTime;
+    private String payoutTime;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 11 - 1
src/main/java/com/loan/system/domain/entity/DisbursementRecord.java

@@ -24,7 +24,17 @@ public class DisbursementRecord extends BaseEntity{
     private BigDecimal amount;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    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;

+ 13 - 4
src/main/java/com/loan/system/domain/entity/Document.java

@@ -21,8 +21,8 @@ public class Document extends BaseEntity{
     @Column(name = "owner_id")
     private Long ownerId;
 
-    @Column(name = "type_id")
-    private Long typeId;
+    @Column(name = "dict_type" , length = 20)
+    private String dictType;
 
     @Column(name = "doc_type", length = 50)
     private String docType;
@@ -33,14 +33,23 @@ public class Document extends BaseEntity{
     @Column(name = "file_name")
     private String fileName;
 
+    @Column(name = "origin_name", length = 255)
+    private String originName;
+
+    @Column(name = "file_size")
+    private Long fileSize;
+
+    @Column(name = "thumbnails", length = 255)
+    private String thumbnails;
+
     @Column(name = "is_current")
     private Boolean isCurrent;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 11 - 14
src/main/java/com/loan/system/domain/entity/LoanCase.java

@@ -22,23 +22,17 @@ public class LoanCase extends BaseEntity{
     @Column(name = "customer_id")
     private Long customerId;
 
-    @Column(name = "business_type_id")
-    private Long businessTypeId;
+    @Column(name = "business_type" , length = 20)
+    private String businessType;
 
     @Column(name = "business_attrs", length = 200)
     private String businessAttrs;
 
-    @Column(name = "channel_id")
-    private Long channelId;
+    @Column(name = "channel_name" , length = 20)
+    private String channelName;
 
-    @Column(name = "remark_id")
-    private Long remarkId;
-
-    @Column(name = "custom1_id")
-    private Long custom1Id;
-
-    @Column(name = "custom2_id")
-    private Long custom2Id;
+    @Column(name = "recommender_id")
+    private Long recommenderId;
 
     @Column(name = "requested_amount", precision = 18, scale = 2)
     private BigDecimal requestedAmount;
@@ -46,11 +40,14 @@ public class LoanCase extends BaseEntity{
     @Column(name = "total_loan_amount", precision = 18, scale = 2)
     private BigDecimal totalLoanAmount;
 
+    @Column(name = "is_complete", length = 1)
+    private Boolean isComplete;
+
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

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

@@ -61,10 +61,10 @@ public class Repayment extends BaseEntity{
     private Boolean isCleared;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "update_time")
-    private Instant updateTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/RepaymentRecord.java

@@ -23,7 +23,7 @@ public class RepaymentRecord extends BaseEntity{
     private BigDecimal amount;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 9 - 0
src/main/java/com/loan/system/domain/entity/Role.java

@@ -4,6 +4,8 @@ import lombok.Getter;
 import lombok.Setter;
 
 import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 
 @Getter
 @Setter
@@ -25,4 +27,11 @@ public class Role {
     @Column(name = "is_delete")
     private Boolean isDelete;
 
+    @Column(name = "update_time")
+    private String updateTime;
+
+    @Column(name = "create_time")
+    private String createTime;
+
+
 }

+ 1 - 1
src/main/java/com/loan/system/domain/entity/StatBusinessSnapshot.java

@@ -37,7 +37,7 @@ public class StatBusinessSnapshot extends BaseEntity{
     private Long userId;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 1 - 1
src/main/java/com/loan/system/domain/entity/StatFundEfficiency.java

@@ -30,7 +30,7 @@ public class StatFundEfficiency extends BaseEntity{
     private BigDecimal interestIncome;
 
     @Column(name = "create_time")
-    private Instant createTime;
+    private String createTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 4 - 7
src/main/java/com/loan/system/domain/entity/Step.java

@@ -32,7 +32,10 @@ public class Step extends BaseEntity{
     private Long userId2;
 
     @Column(name = "begin_time")
-    private Instant beginTime;
+    private String beginTime;
+
+    @Column(name = "update_time")
+    private String updateTime;
 
     @Column(name = "parent_id")
     private Long parentId;
@@ -43,12 +46,6 @@ public class Step extends BaseEntity{
     @Column(name = "next_id")
     private Long nextId;
 
-    @Column(name = "create_time")
-    private Instant createTime;
-
-    @Column(name = "update_time")
-    private Instant updateTime;
-
     @Column(name = "is_delete")
     private Boolean isDelete;
 

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

@@ -38,9 +38,6 @@ public class User extends BaseEntity{
     @Column(name = "role")
     private String role;
 
-    @Column(name = "ext_role_type", length = 50)
-    private String extRoleType;
-
     @Column(name = "dept", length = 100)
     private String dept;
 
@@ -48,10 +45,10 @@ public class User extends BaseEntity{
     private Byte status;
 
     @Column(name = "created_time")
-    private Instant createdTime;
+    private String createTime;
 
     @Column(name = "updated_time")
-    private Instant updatedTime;
+    private String updateTime;
 
     @Column(name = "is_delete")
     private Boolean isDelete;

+ 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;
+    }
+}

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

@@ -5,7 +5,7 @@ package com.loan.system.domain.enums;
  * @date 2020/9/30 - 19:40
  */
 public enum StepEnum {
-    UNSTART("UNSTART","未开始"),
+    UNSTART("UNSTART","未开始"),
     PROCESS("PROCESS","进行中"),
     COMPLETED("COMPLETED","已完成");
 

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

@@ -1,36 +1,68 @@
 package com.loan.system.domain.enums;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * 针对特殊环节的标识设置
  * @author : EdwinXu
  * @date : Created in 2021/1/25 16:57
  */
 public enum StepPropertyEnum {
-    BLANK("BLANK","空白"),
-    UNIVERSAL("UNIVERSAL","通用"),
-    SKIP("SKIP","跳过"),
-    APPROVE("APPROVE","审批"),
-    PERMITION("PERMITION","许可"),
-    CONSTRUCTIONLOD("CONSTRUCTIONLOD","施工日志"),
-    PAYMENT("PAYMENT","支付"),
-
-    APPROVE_SUB("APPROVE_SUB","审批子环节"),
-    PERMITION_SUB("PERMITION_SUB","许可子环节"),
-    CONSTRUCTIONLOD_SUB("CONSTRUCTIONLOD_SUB","施工日志子环节"),
-    PAYMENT_SUB("PAYMENT_SUB","支付子环节");
-    private final String property;
-    private final String desc;
-
-    public String getProperty() {
-        return property;
-    }
+    /* ========== 环节定义 ========== */
+    BUSINESS_ACCEPT_PARENT(501, "业务受理环节", true),
+    BUSINESS_ACCEPT(502, "业务受理", false),
+
+    PRE_TRIAL_PARENT(503, "预审环节", true),
+    PRE_TRIAL(504, "预审", false),
+
+    APPROVAL_PARENT(505, "审批环节", true),
+    APPROVAL(506, "审批", false),
+
+    CONTRACT_SIGN_PARENT(507, "合同签约环节", true),
+    CONTRACT_SIGN(508, "合同签约", false),
+
+    DISBURSE_PARENT(509, "出款环节", true),
+    PLAN_REPORT(510, "计划上报", false),
+    PLAN_AUDIT(511, "计划审核", false),
+    DISBURSE_START(512, "出账启动", false),
+    DISBURSE_AUDIT(513, "出账审核", false),
+    FINANCE_DISBURSE(514, "财务出账", false),
+    DISBURSE_CONFIRM(515, "出账确认", false),
 
-    public String getDesc() {
-        return desc;
+    REPAY_PARENT(516, "回款环节", true),
+    REPAY_START(517, "回款启动", false),
+    REPAY_APPROVAL(518, "回款审批", false),
+    FINANCE_CHECK(519, "财务核算", false),
+
+    COLLATERAL_RECEIVE(520, "押品取证环节", true),
+    PLAN_SUBMISSION(521, "计划上报", false),
+    APPROVAL_ASSIGNMENT(522, "审批分派", false),
+    EVIDENCE_CONFIRMATION(523, "确认取证", false),
+
+    COLLATERAL_DELIVERY(524, "押品送证环节", true),
+    PLAN_SUBMISSION_2(525, "计划上报", false),
+    APPROVAL_ASSIGNMENT_2(526, "审批分派", false),
+    DELIVERY_CONFIRMATION(527, "送证确认", false);
+
+    /* ========== 字段 & 构造 ========== */
+    private final int code;
+    private final String label;
+    private final boolean parent;
+
+    StepPropertyEnum(int code, String label, boolean parent) {
+        this.code = code;
+        this.label = label;
+        this.parent = parent;
     }
 
-    StepPropertyEnum(String property, String desc) {
-        this.property = property;
-        this.desc = desc;
+    /* ========== getter ========== */
+    public int getCode() { return code; }
+    public String getLabel() { return label; }
+    public boolean isParent() { return parent; }
+
+    public static List<StepPropertyEnum> listAll() {
+        return Arrays.asList(values()); // 顺序与源码声明一致
     }
+
 }

+ 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 {
+}

+ 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;
+    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;//押品状态
+
+
+
+}

+ 21 - 0
src/main/java/com/loan/system/domain/vo/DocumentVO.java

@@ -0,0 +1,21 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DocumentVO implements Serializable {
+    private Long id;//文档ID
+    private Long caseId;//业务ID
+    private Long ownerId;//客户id
+    private String dictType;//资料类型
+    private String docType;//文档类型
+    private String filePath;//文件路径
+    private String fileName;//文件名
+    private Long fileSize;//文件大小
+}

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

@@ -0,0 +1,40 @@
+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;//是否涉及诉讼
+}

+ 13 - 0
src/main/java/com/loan/system/domain/vo/PreApproveVO.java

@@ -0,0 +1,13 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+//@AllArgsConstructor
+//@NoArgsConstructor
+public class PreApproveVO implements Serializable {
+}

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

@@ -0,0 +1,25 @@
+package com.loan.system.domain.vo;
+
+import com.loan.system.domain.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StepVO implements Serializable {
+
+    private Long id;
+    private String stepName;
+    private Long caseId;
+    private String status;
+    private Long userId1;
+    private Long userId2;
+    private String beginTime;
+    private Long parentId;
+
+}

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

@@ -8,13 +8,13 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class UserLoginVO implements Serializable {
 
-    private Long id;
+    private Long userId;
     private String openid;
     private String token;
+    private String role;
 
 }

+ 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() {

+ 68 - 0
src/main/java/com/loan/system/interceptor/JwtTokenUserInterceptor.java

@@ -2,17 +2,26 @@ package com.loan.system.interceptor;
 
 import com.loan.system.constant.JwtClaimsConstant;
 import com.loan.system.context.BaseContext;
+import com.loan.system.domain.entity.User;
 import com.loan.system.properties.JwtProperties;
+import com.loan.system.service.UserService;
 import com.loan.system.utils.JwtUtil;
 import io.jsonwebtoken.Claims;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
 import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * jwt令牌校验的拦截器
@@ -23,6 +32,8 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
 
     @Autowired
     private JwtProperties jwtProperties;
+    @Autowired
+    private UserService userService;
 
     /**
      * 在拦截的请求前校验jwt
@@ -51,4 +62,61 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
             return false;
         }
     }
+
+    /**
+     * 设置Spring Security认证信息
+     */
+    private void setSpringSecurityAuthentication(Long userId) {
+        try {
+            // 查询用户信息和权限
+            User user = userService.findByIdAndIsDelete(userId);
+            if (user == null) {
+                log.info("用户不存在: {}", userId);
+                return;
+            }else{
+                log.info("用户信息: {}", user.getId());
+            }
+
+            // 获取用户角色并转换为Spring Security权限
+            List<GrantedAuthority> authorities = getUserAuthorities(user);
+
+            // 创建认证信息
+            UsernamePasswordAuthenticationToken authentication =
+                    new UsernamePasswordAuthenticationToken(user, null, authorities);
+            SecurityContextHolder.getContext().setAuthentication(authentication);
+
+            log.info("Spring Security认证设置完成 - 用户: {}, 角色: {}",
+                    user.getUsername(), authorities);
+        } catch (Exception e) {
+            log.info("设置Spring Security认证信息失败: {}", e.getMessage());
+        }
+    }
+
+    /**
+     * 根据用户信息获取权限列表
+     * role字段是逗号分隔的字符串,如 "ADMIN,USER,MANAGER"
+     */
+    private List<GrantedAuthority> getUserAuthorities(User user) {
+        List<GrantedAuthority> authorities = new ArrayList<>();
+        log.info("用户角色字符串: {}", user.getRole());
+        if (user.getRole() != null && !user.getRole().trim().isEmpty()) {
+            // 分割逗号分隔的角色字符串
+            String[] roleArray = user.getRole().split(",");
+            // 为每个角色添加ROLE_前缀并创建权限对象
+            for (String role : roleArray) {
+                log.info("角色: {}", role);
+                String trimmedRole = role.trim();
+                if (!trimmedRole.isEmpty()) {
+                    authorities.add(new SimpleGrantedAuthority(trimmedRole));
+                }
+            }
+        }
+        log.info("用户角色解析: {} -> {}", user.getRole(),
+                authorities.stream()
+                        .map(GrantedAuthority::getAuthority)
+                        .collect(Collectors.toList()));
+
+        return authorities;
+    }
+
 }

+ 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; //退款成功的回调地址
 
-}
+}

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

@@ -0,0 +1,17 @@
+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;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface ApproveRecordRepository extends JpaRepository<ApprovalRecord,Long> {
+
+}

+ 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);
+}

+ 36 - 0
src/main/java/com/loan/system/repository/CustomerRepository.java

@@ -0,0 +1,36 @@
+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 javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @author EdwinXu
+ * @date 2020/9/2 - 15:35
+ * @Description
+ */
+public interface CustomerRepository extends JpaRepository<Customer,Long> {
+    @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("update Customer c set c.marriedStatus = ?2 where c.id = ?1")
+    void updateMarriedStatusById(Long customerId, String marriedStatus);
+
+    @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);
+}

+ 41 - 0
src/main/java/com/loan/system/repository/DocumentRepository.java

@@ -0,0 +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> findByCaseId(Long caseId);
+
+    @Query("select d from Document d where d.id = ?1")
+    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);
+}

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

@@ -0,0 +1,38 @@
+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);
+}

+ 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> {
+}

+ 41 - 0
src/main/java/com/loan/system/repository/StepRepository.java

@@ -0,0 +1,41 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.Customer;
+import com.loan.system.domain.entity.Step;
+import com.loan.system.domain.vo.StepVO;
+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 StepRepository extends JpaRepository<Step,Long> {
+
+    @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);
+
+    @Transactional
+    @Modifying
+    @Query("update Step set userId1 = ?2 where caseId = ?3 and  stepName = ?1")
+    void updateUser1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
+
+    @Transactional
+    @Modifying
+    @Query("update Step set userId2 = ?2 where caseId = ?3 and  stepName = ?1")
+    void updateUser2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
+
+    List<StepVO> findByCaseId(Long caseId);
+}

+ 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> {
+}

+ 6 - 0
src/main/java/com/loan/system/repository/UserRepository.java

@@ -7,6 +7,7 @@ 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;
 
 /**
@@ -16,4 +17,9 @@ import java.util.Set;
  */
 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);
 }

+ 9 - 0
src/main/java/com/loan/system/service/ApproveService.java

@@ -0,0 +1,9 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.dto.ApprovalRecordDTO;
+
+public interface ApproveService {
+    void addApprovalRecord(ApprovalRecordDTO approvalRecordDTO);
+
+    void addPreApprovalRecord(String label, Long currentId, Long caseId);
+}

+ 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);
+}

+ 25 - 0
src/main/java/com/loan/system/service/CustomerService.java

@@ -0,0 +1,25 @@
+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 findByCustomerId(Long customerId);
+
+    List<CustomerVO> getAllCustomers(boolean b);
+
+    CustomerVO getCustomerByKey(String key, boolean b);
+
+    CustomerVO getCustomerByMobile(String tel);
+}

+ 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);
+}

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

@@ -0,0 +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<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);
+}

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

@@ -0,0 +1,50 @@
+package com.loan.system.service.Impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.loan.system.context.BaseContext;
+import com.loan.system.domain.dto.ApprovalRecordDTO;
+import com.loan.system.domain.entity.ApprovalRecord;
+import com.loan.system.domain.enums.StepPropertyEnum;
+import com.loan.system.repository.ApproveRecordRepository;
+import com.loan.system.service.ApproveService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Service
+public class ApproveServiceImpl implements ApproveService {
+    private final ApproveRecordRepository approveRecordRepository;
+
+    public ApproveServiceImpl(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")));
+
+        approveRecordRepository.save(approvalRecord);
+    }
+}

+ 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);
+    }
+}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio