浏览代码

合并提交

25057 5 月之前
父节点
当前提交
cca3aff489
共有 38 个文件被更改,包括 1085 次插入189 次删除
  1. 13 0
      pom.xml
  2. 393 0
      src/main/java/com/loan/system/controller/wechat/ApprovalController.java
  3. 0 11
      src/main/java/com/loan/system/controller/wechat/ApproveController.java
  4. 8 62
      src/main/java/com/loan/system/controller/wechat/LoanController.java
  5. 120 16
      src/main/java/com/loan/system/controller/wechat/UserController.java
  6. 14 0
      src/main/java/com/loan/system/domain/dto/ApprovalDTO.java
  7. 15 0
      src/main/java/com/loan/system/domain/dto/PreApprovalDTO.java
  8. 1 0
      src/main/java/com/loan/system/domain/dto/UserLoginDTO.java
  9. 11 0
      src/main/java/com/loan/system/domain/dto/WeChatLoginDTO.java
  10. 26 0
      src/main/java/com/loan/system/domain/enums/DecisionEnum.java
  11. 5 2
      src/main/java/com/loan/system/domain/enums/ExceptionEnum.java
  12. 16 0
      src/main/java/com/loan/system/domain/pojo/TemplateMessage.java
  13. 22 0
      src/main/java/com/loan/system/domain/vo/ApprovalRecordVO.java
  14. 20 0
      src/main/java/com/loan/system/domain/vo/CustomerLoginVO.java
  15. 1 1
      src/main/java/com/loan/system/domain/vo/CustomersOtherVO.java
  16. 17 0
      src/main/java/com/loan/system/domain/vo/LoanCasePreApprovalVo.java
  17. 1 0
      src/main/java/com/loan/system/domain/vo/LoanCaseVO.java
  18. 0 13
      src/main/java/com/loan/system/domain/vo/PreApproveVO.java
  19. 4 1
      src/main/java/com/loan/system/domain/vo/UserLoginVO.java
  20. 10 0
      src/main/java/com/loan/system/repository/ApproveRecordRepository.java
  21. 2 0
      src/main/java/com/loan/system/repository/CustomerRepository.java
  22. 10 0
      src/main/java/com/loan/system/repository/LoanRepository.java
  23. 15 0
      src/main/java/com/loan/system/repository/StepRepository.java
  24. 6 0
      src/main/java/com/loan/system/repository/UserRepository.java
  25. 21 0
      src/main/java/com/loan/system/service/ApprovalService.java
  26. 0 9
      src/main/java/com/loan/system/service/ApproveService.java
  27. 5 1
      src/main/java/com/loan/system/service/CustomerService.java
  28. 21 4
      src/main/java/com/loan/system/service/Impl/ApprovalServiceImpl.java
  29. 15 2
      src/main/java/com/loan/system/service/Impl/CustomerServiceImpl.java
  30. 15 1
      src/main/java/com/loan/system/service/Impl/LoanServiceImpl.java
  31. 19 0
      src/main/java/com/loan/system/service/Impl/StepServiceImpl.java
  32. 116 55
      src/main/java/com/loan/system/service/Impl/UserServiceImpl.java
  33. 112 0
      src/main/java/com/loan/system/service/Impl/WxServiceImpl.java
  34. 6 0
      src/main/java/com/loan/system/service/LoanService.java
  35. 8 0
      src/main/java/com/loan/system/service/StepService.java
  36. 6 7
      src/main/java/com/loan/system/service/UserService.java
  37. 10 0
      src/main/java/com/loan/system/service/WxService.java
  38. 1 4
      src/main/resources/application.yaml

+ 13 - 0
pom.xml

@@ -55,6 +55,19 @@
             <version>5.8.11</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.10.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20231013</version> <!-- 使用最新版本 -->
+        </dependency>
+
+
         <!-- Apache POI 最新稳定版 -->
         <dependency>
             <groupId>org.apache.poi</groupId>

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

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

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

@@ -1,11 +0,0 @@
-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 {
-}

+ 8 - 62
src/main/java/com/loan/system/controller/wechat/LoanController.java

@@ -1,25 +1,23 @@
 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.ExceptionEnum;
 import com.loan.system.domain.enums.StepEnum;
 import com.loan.system.domain.enums.StepPropertyEnum;
 import com.loan.system.domain.pojo.Result;
 import com.loan.system.domain.vo.LoanCaseVO;
 import com.loan.system.domain.vo.StepVO;
+import com.loan.system.exception.DescribeException;
 import com.loan.system.service.*;
 import com.loan.system.utils.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.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;
 
@@ -35,7 +33,7 @@ public class LoanController {
     @Autowired
     private ContractService contractService;
     @Autowired
-    private ApproveService approveService;
+    private ApprovalService approveService;
     @Autowired
     private CustomerService customerService;
     @Autowired
@@ -75,6 +73,10 @@ public class LoanController {
     @PostMapping("/{id}")//请求中操作复杂,putmapping仅适用于更新操作
     @ApiOperation("提交/保存业务")
     public Result saveLoanCase(@PathVariable("id")Long caseId, @RequestBody LoanCaseDTO loanCaseDTO, @RequestParam("IsComplete")Boolean isComplete){//isComplete 若保存,则设置为未完成,若提交,则设置为已完成
+        StepVO stepVO = stepService.findByStepNameAndCaseId(StepPropertyEnum.BUSINESS_ACCEPT.getLabel(),caseId);
+        if(stepVO.getStatus().equals(StepEnum.COMPLETED.getMsg()))
+            throw new DescribeException(ExceptionEnum.LOANCASE_IS_Completed);
+
         //1.补充业务信息
         loanService.updateLoanCaseById(loanCaseDTO,caseId);
 
@@ -185,63 +187,7 @@ public class LoanController {
 //        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("取消预审")

+ 120 - 16
src/main/java/com/loan/system/controller/wechat/UserController.java

@@ -2,28 +2,36 @@ package com.loan.system.controller.wechat;
 
 import com.loan.system.constant.JwtClaimsConstant;
 import com.loan.system.domain.dto.UserLoginDTO;
+import com.loan.system.domain.dto.WeChatLoginDTO;
 import com.loan.system.domain.entity.Customer;
 import com.loan.system.domain.entity.Role;
 import com.loan.system.domain.entity.User;
 import com.loan.system.domain.enums.ExceptionEnum;
 import com.loan.system.domain.enums.RoleEnum;
 import com.loan.system.domain.pojo.Result;
+import com.loan.system.domain.vo.CustomerLoginVO;
 import com.loan.system.domain.vo.CustomerVO;
 import com.loan.system.domain.vo.UserLoginVO;
 import com.loan.system.exception.DescribeException;
 import com.loan.system.properties.JwtProperties;
 import com.loan.system.repository.RoleRepository;
 import com.loan.system.service.CustomerService;
+import com.loan.system.service.Impl.UserServiceImpl;
 import com.loan.system.service.UserService;
+import com.loan.system.service.WxService;
 import com.loan.system.utils.JwtUtil;
 import com.loan.system.utils.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.ObjectUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.security.auth.login.LoginException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +55,11 @@ public class UserController {//包含内部人员、外部人员
     @Autowired
     private CustomerService customerService;
 
+    @Autowired
+    private WxService wxService;
+
+    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
+
     /*
     1.先查询user查看是否为内部人员
     2.若不是内部人员,查询外部人员
@@ -64,7 +77,7 @@ public class UserController {//包含内部人员、外部人员
         Long userId = null;
 
         if (!ObjectUtils.isEmpty(user)){
-            userLoginVO.setUserId(user.getId());
+            userLoginVO.setId(user.getId());
             userLoginVO.setRole(user.getRole());
             userLoginVO.setOpenid(user.getOpenid());
         }else{
@@ -77,37 +90,128 @@ public class UserController {//包含内部人员、外部人员
 
                 customer = customerService.getCustomerByMobile(userLoginDTO.getTel());
             }
-            userLoginVO.setUserId(customer.getId());
+            userLoginVO.setId(customer.getId());
             userLoginVO.setRole(RoleEnum.EXTERNAL.getMsg());
             userLoginVO.setOpenid(customer.getOpenid());
         }
 
-        claims.put(JwtClaimsConstant.USER_ID,userLoginVO.getUserId());
+        claims.put(JwtClaimsConstant.USER_ID,userLoginVO.getId());
         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);
+//    @GetMapping("/get_sessionId")
+//    @ApiOperation("获取微信openid")
+//    public Result get_sessionId(String code){
+//        return userService.get_sessionId(code);
+//    }
+//    public Result customer_login(Customer customer){
+//        customer=customerService.findBymobileAndIsDelete(customer.getMobile());
+//        if (ObjectUtils.isEmpty(customer))
+//            throw new IllegalArgumentException("Customer object is null");
+//        //为微信用户生成jwt令牌
+//        Map<String ,Object> claims=new HashMap<>();
+//        //用openid还是id?
+//        //claims.put(JwtClaimsConstant.CUSTOMER_ID,customer.getOpenid());
+//        claims.put(JwtClaimsConstant.USER_ID,customer.getId());
+//        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
+//        log.info("手机号码:{}",customer.getMobile());
+//        CustomerLoginVO customerLoginVO = CustomerLoginVO.builder()
+//                .id(customer.getId())
+//                .openid(customer.getOpenid())
+//                .token(token)
+//                .name(customer.getName())
+//                .is_customer(1)
+//                .build();
 //
+//        return ResultUtil.success("success", customerLoginVO);
+//    }
+//
+//    /**
+//     * 用户登陆
+//     * @param userLoginDTO
+//     * @return
+//     */
+//    public Result user_login(UserLoginDTO userLoginDTO){
+//        User user= userService.findByPhoneNumberAndIsDelete(userLoginDTO.getTel());
+//        if (ObjectUtils.isEmpty(user))
+//            throw new IllegalArgumentException("User object is null");
 //        //为微信用户生成jwt令牌
 //        Map<String ,Object> claims=new HashMap<>();
 //        claims.put(JwtClaimsConstant.USER_ID,user.getId());
 //        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
-//
-//        UserLoginVO userLoginVO = new UserLoginVO();
-//        userLoginVO.setUserId(user.getId());
-//        userLoginVO.setOpenid(user.getOpenid());
-//        userLoginVO.setRole(user.getRole());
-//        userLoginVO.setToken(token);
+//        log.info("手机号码:{}",userLoginDTO.getTel());
+//        log.info("用户ID:{}",user.getId());
+//        UserLoginVO userLoginVO = UserLoginVO.builder()
+//                .id(user.getId())
+//                .openid(user.getOpenid())
+//                .token(token)
+//                .role(user.getRole())
+//                .is_customer(0)
+//                .userName(user.getUsername())
+//                .build();
 //
 //        return ResultUtil.success("success", userLoginVO);
 //    }
+//
+//    /**
+//     * 注册客户
+//     * @param customer
+//     * @return
+//     */
+//    public Result register(Customer customer){
+//        customer.setCreateTime(LocalDateTime.now()
+//                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        customer.setUpdateTime(LocalDateTime.now()
+//                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        customer.setIsDelete(false);
+//        customerService.addCustomer(customer);
+//        return this.customer_login(customer);
+//    }
+//
+//    @PostMapping("/login_wechat")
+//    @ApiOperation("微信手机号登陆")
+//    public Result login(@RequestBody WeChatLoginDTO weChatLoginDTO){
+//        String access_token=wxService.getAccessToken();
+//        String phoneNumber=wxService.getUserPhoneNumber(access_token,weChatLoginDTO.getCode());
+//        boolean user_is_exist = userService.existsByMobileAndIsDelete(phoneNumber);
+//        boolean customer_is_exist=customerService.existsBymobileAndIsDelete(phoneNumber);
+//        log.info("code:{}",phoneNumber);
+//        log.info("用户是否存在:{}",user_is_exist);
+//        if(!customer_is_exist&&!user_is_exist){
+//            Customer customer = new Customer();
+//            customer.setMobile(phoneNumber);
+//            customer.setOpenid(weChatLoginDTO.getOpenid());
+//            return this.register(customer);
+//        }else if(customer_is_exist){   //存在客户
+//            Customer customer=customerService.findBymobileAndIsDelete(phoneNumber);
+//            return this.customer_login(customer);
+//        }else { //存在用户
+//            UserLoginDTO userLoginDTO = new UserLoginDTO();
+//            userLoginDTO.setTel(phoneNumber);
+//            return this.user_login(userLoginDTO);
+//        }
+//    }
+//    @PostMapping("/login")
+//    @ApiOperation("账号登陆")
+//    public Result login(@RequestBody UserLoginDTO userLoginDTO){
+//        String phoneNumber=userLoginDTO.getTel();
+//        boolean user_is_exist = userService.existsByMobileAndIsDelete(phoneNumber);
+//        boolean customer_is_exist=customerService.existsBymobileAndIsDelete(phoneNumber);
+//        if(!customer_is_exist&&!user_is_exist){
+//            Customer customer = new Customer();
+//            customer.setMobile(phoneNumber);
+//            customer.setOpenid(userLoginDTO.getOpenid());
+//            return this.register(customer);
+//        }else if(customer_is_exist){
+//            Customer customer=customerService.findBymobileAndIsDelete(phoneNumber);
+//            return this.customer_login(customer);
+//        }else{
+//            return this.user_login(userLoginDTO);
+//        }
+//    }
+
 
     @PostMapping("/role")
     @ApiOperation("添加用户角色")
@@ -131,7 +235,7 @@ public class UserController {//包含内部人员、外部人员
     @GetMapping("/customers/{id}")
     @ApiOperation("按id选择客户")
     public Result findCustomerById(@PathVariable Long id){
-        return ResultUtil.success("success", customerService.findByCustomerId( id));
+        return ResultUtil.success("success", customerService.findByCustomerIdAndIsDelete( id, false));
     }
 
     @GetMapping("/customers/{key}")

+ 14 - 0
src/main/java/com/loan/system/domain/dto/ApprovalDTO.java

@@ -0,0 +1,14 @@
+package com.loan.system.domain.dto;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApprovalDTO {
+    private Long CaseId;
+    private String comments;
+}

+ 15 - 0
src/main/java/com/loan/system/domain/dto/PreApprovalDTO.java

@@ -0,0 +1,15 @@
+package com.loan.system.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PreApprovalDTO implements Serializable {
+    private Long caseId;//业务ID
+    private String comments;
+}

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

@@ -14,4 +14,5 @@ import java.io.Serializable;
 public class UserLoginDTO implements Serializable {
     String code;
     String tel;
+    String openid;
 }

+ 11 - 0
src/main/java/com/loan/system/domain/dto/WeChatLoginDTO.java

@@ -0,0 +1,11 @@
+package com.loan.system.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WeChatLoginDTO implements Serializable {
+    private String code;
+    private String openid;
+}

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

@@ -0,0 +1,26 @@
+package com.loan.system.domain.enums;
+
+/**
+ * 决定结果枚举类
+ */
+public enum DecisionEnum {
+    PASS("PASS", "通过"),
+    REJECT("REJECT", "驳回"),
+    TERMINATE("TERMINATE", "终结");
+
+    private final String status;
+    private final String msg;
+
+    public String getStatus() {
+        return status;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    DecisionEnum(String status, String msg) {
+        this.status = status;
+        this.msg = msg;
+    }
+}

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

@@ -14,7 +14,7 @@ public enum ExceptionEnum {
      * -1   ~   -99     一般常见
      * -100 ~   -149    登录
      * -150 ~   -199    用户管理
-     * -200 ~   -249    项目管理
+     * -200 ~   -249    业务管理
      * -250 ~   -299    合同管理
      * -300 ~   -349    模块管理
      * -350 ~   -399    环节管理
@@ -67,7 +67,7 @@ public enum ExceptionEnum {
     PROJECT_NOT_EXIST(-201,"项目不存在"),
     PROJECT_LABEL_EXIST(-202,"项目标签已存在"),
     PROJECT_LABEL_NOT_EXIST(-203,"项目标签不存在"),
-    PROJECT_TYPE_EXIST(-204,"项目类型已存在"),
+    LOANCASE_IS_Completed(-204,"项目已经完成,无法重复提交"),
     PROJECT_TYPE_NOT_EXIST(-205,"项目类型不存在"),
     PROJECT_TYPE_IS_NECESSARY(-206,"项目类型是必须的"),
     PROJECT_LABEL_HAS_NOT_EXIST(-207,"存在项目标签不存在"),
@@ -104,6 +104,9 @@ public enum ExceptionEnum {
     STEP_TEMPLATE_READ_ERROR(-355,"环节模板读取失败"),
     STEP_TEMPLATE_LIST_NOT_EXIST(-356,"环节模板边不存在"),
     STEP_TEMPLATE_NODE_NOT_EXIST(-357,"环节模板节点读取失败"),
+    STEP_USER_NOT_EXPECTED(-358,"环节处理人不是预期用户"),
+    STEP_HAS_COMPLETEED(-359,"环节已完成,不能重复操作"),
+
 
     FUND_EXIST(-400,"经费已存在"),
     FUND_NOT_EXIST(-401,"经费不存在"),

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

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

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

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

+ 20 - 0
src/main/java/com/loan/system/domain/vo/CustomerLoginVO.java

@@ -0,0 +1,20 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CustomerLoginVO implements Serializable {
+    private Long id;
+    private String openid;
+    private String token;
+    private String name;
+    private int is_customer;
+}

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

@@ -10,7 +10,7 @@ import java.io.Serializable;
 @AllArgsConstructor
 @NoArgsConstructor
 public class CustomersOtherVO implements Serializable {
-    private Long id;
+    private Long id;//其它客户id
     private Long caseId;
     private String name;
     private String idNumber;

+ 17 - 0
src/main/java/com/loan/system/domain/vo/LoanCasePreApprovalVo.java

@@ -0,0 +1,17 @@
+package com.loan.system.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class LoanCasePreApprovalVo implements Serializable {
+    private String Lead_Sales;
+    private String Assist_Sales;
+}

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

@@ -37,4 +37,5 @@ public class LoanCaseVO implements Serializable {
     private List<DocumentVO> documents;// 文件
     private String currentAddress;// 房产产证地址
     private Boolean isInvolvedInLitigation;//是否涉及诉讼
+    private Boolean IsDelete;
 }

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

@@ -1,13 +0,0 @@
-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 {
-}

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

@@ -10,11 +10,14 @@ import java.io.Serializable;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
+@Builder
 public class UserLoginVO implements Serializable {
 
-    private Long userId;
+    private Long id;
     private String openid;
     private String token;
+    private String userName;
     private String role;
+    private Integer is_customer;
 
 }

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

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

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

@@ -16,6 +16,8 @@ import java.util.List;
  * @Description
  */
 public interface CustomerRepository extends JpaRepository<Customer,Long> {
+    boolean existsByMobileAndIsDelete(String mobile,Boolean isDelete);
+
     @Query("select c from Customer c where c.mobile = ?1 and c.isDelete = ?2")
     Customer findByMobile(String mobile,Boolean isDelete);
 

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

@@ -35,4 +35,14 @@ public interface LoanRepository extends JpaRepository<LoanCase,Long> {
 
     @Query("SELECT l FROM LoanCase l WHERE l.id = :caseId and l.isDelete = :isDelete")
     LoanCase findLoanCaseById(Long caseId, boolean isDelete);
+
+    @Modifying
+    @Transactional
+    @Query("update LoanCase set updateTime = ?3 where id = ?1 and isDelete = ?2")
+    void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete,String updateTime);
+
+    @Modifying
+    @Transactional
+    @Query("UPDATE LoanCase SET updateTime = ?3, isDelete = ?2 WHERE id = ?1 AND isDelete = ?2")
+    void logic_delete(Long id, boolean isDelete, String updateTime);
 }

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

@@ -38,4 +38,19 @@ public interface StepRepository extends JpaRepository<Step,Long> {
     void updateUser2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
 
     List<StepVO> findByCaseId(Long caseId);
+
+    @Modifying
+    @Transactional
+    @Query("update Step set userId1 = ?2 where caseId = ?3 and  stepName = ?1")
+    void updateUser1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId,String currentTime);
+
+    @Modifying
+    @Transactional
+    @Query("update Step set userId2 = ?2 where caseId = ?3 and  stepName = ?1")
+    void updateUser2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId,String currentTime);
+
+    @Modifying
+    @Transactional
+    @Query("UPDATE Step SET updateTime = ?3, isDelete = ?2 WHERE id = ?1 AND isDelete = ?2")
+    void logic_delete(Long id, boolean isDelete, String updateTime);
 }

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

@@ -22,4 +22,10 @@ public interface UserRepository extends JpaRepository<User,Long> {
 
     @Query("select u from User u where u.id in ?1 and u.isDelete = ?2")
     User findByUserIdAndIsDelete(Long userId, Boolean isDelete);
+
+    boolean existsByMobileAndIsDelete(String mobile,Boolean isDelete);
+
+    User findByMobileAndIsDelete(String phoneNumber,Boolean isDelete);
+
+    User findByIdAndIsDelete(Long mobile, Boolean isDelete);
 }

+ 21 - 0
src/main/java/com/loan/system/service/ApprovalService.java

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

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

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

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

@@ -15,11 +15,15 @@ public interface CustomerService {
 
     void updateMarriedStatusById(Long customerId, String marriedStatus);
 
-    CustomerVO findByCustomerId(Long customerId);
+    CustomerVO findByCustomerIdAndIsDelete(Long customerId,Boolean isDelete);
 
     List<CustomerVO> getAllCustomers(boolean b);
 
     CustomerVO getCustomerByKey(String key, boolean b);
 
     CustomerVO getCustomerByMobile(String tel);
+
+    Customer findBymobileAndIsDelete(String phoneNumber);
+    boolean existsBymobileAndIsDelete(String phoneNumber);
+    Customer findByIdAndIsDelete(Long id);
 }

+ 21 - 4
src/main/java/com/loan/system/service/Impl/ApproveServiceImpl.java → src/main/java/com/loan/system/service/Impl/ApprovalServiceImpl.java

@@ -1,22 +1,23 @@
 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.domain.vo.ApprovalRecordVO;
 import com.loan.system.repository.ApproveRecordRepository;
-import com.loan.system.service.ApproveService;
+import com.loan.system.service.ApprovalService;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 
 @Service
-public class ApproveServiceImpl implements ApproveService {
+public class ApprovalServiceImpl implements ApprovalService {
     private final ApproveRecordRepository approveRecordRepository;
 
-    public ApproveServiceImpl(ApproveRecordRepository approveRecordRepository) {
+    public ApprovalServiceImpl(ApproveRecordRepository approveRecordRepository) {
         this.approveRecordRepository = approveRecordRepository;
     }
     @Override
@@ -47,4 +48,20 @@ public class ApproveServiceImpl implements ApproveService {
 
         approveRecordRepository.save(approvalRecord);
     }
+    @Override
+    public List<ApprovalRecordVO> findByCaseIdAndIsDelete(Long id){
+        return BeanUtil.copyToList(approveRecordRepository.findByCaseIdAndIsDelete(id, false), ApprovalRecordVO.class);
+    }
+
+    public void save(ApprovalRecord approvalRecord){
+        approveRecordRepository.save(approvalRecord);
+    }
+
+    public void updateDecisionByCaseIdAndStepNameAndIsDelete(String decision, Long caseId, String stepName,String  comments,Long approverId){
+        approveRecordRepository.updateDecisionByCaseIdAndStepNameAndIsDeleteAndApproverId(decision, caseId, stepName, false, java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),comments,approverId);
+    }
+
+    public ApprovalRecordVO findByCaseIdAndIsDeleteAndStepName(Long caseId, String stepName, Long approverId){
+        return BeanUtil.copyProperties(approveRecordRepository.findByCaseIdAndIsDeleteAndStepNameAndApproverId(caseId, false, stepName, approverId), ApprovalRecordVO.class);
+    }
 }

+ 15 - 2
src/main/java/com/loan/system/service/Impl/CustomerServiceImpl.java

@@ -28,9 +28,9 @@ public class CustomerServiceImpl implements CustomerService {
     }
 
     @Override
-    public CustomerVO findByCustomerId(Long customerId) {
+    public CustomerVO findByCustomerIdAndIsDelete(Long customerId, Boolean isDelete) {
 
-        return BeanUtil.copyProperties(customerRepository.findByCustomerId(customerId,false),CustomerVO.class);
+        return BeanUtil.copyProperties(customerRepository.findByCustomerId(customerId,isDelete),CustomerVO.class);
     }
 
     @Override
@@ -47,4 +47,17 @@ public class CustomerServiceImpl implements CustomerService {
     public CustomerVO getCustomerByMobile(String tel) {
         return  BeanUtil.copyProperties(customerRepository.findByMobile(tel, false),CustomerVO.class);
     }
+
+    @Override
+    public boolean existsBymobileAndIsDelete(String phoneNumber){
+        return customerRepository.existsByMobileAndIsDelete(phoneNumber,false);
+    }
+    @Override
+    public Customer findBymobileAndIsDelete(String phoneNumber){
+        return customerRepository.findByMobile(phoneNumber,false);
+    }
+    @Override
+    public Customer findByIdAndIsDelete(Long id){
+        return customerRepository.findByIdAndIsDelete(id,false);
+    }
 }

+ 15 - 1
src/main/java/com/loan/system/service/Impl/LoanServiceImpl.java

@@ -82,7 +82,7 @@ public class LoanServiceImpl implements LoanService {
         LoanCase loanCase = loanRepository.findLoanCaseById(caseId, false);
         LoanCaseVO loanCaseVO = BeanUtil.copyProperties(loanCase, LoanCaseVO.class);
         //2.获取客户信息
-        loanCaseVO.setCustomer(customerService.findByCustomerId(loanCase.getCustomerId()));
+        loanCaseVO.setCustomer(customerService.findByCustomerIdAndIsDelete(loanCase.getCustomerId(),false));
         //3.获取合同信息
         List<ContractVO> contracts = contractService.findContractByCaseId(caseId);
         loanCaseVO.setContracts(contracts);
@@ -124,4 +124,18 @@ public class LoanServiceImpl implements LoanService {
 
         return loanCaseVO;
     }
+
+    @Override
+    public LoanCaseVO findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete) {
+        return BeanUtil.copyProperties(loanRepository.findLoanCaseById(caseId, isDelete), LoanCaseVO.class);
+    }
+
+    @Override
+    public void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete){
+        loanRepository.updateUpdatetimeByIdAndIsDeleted(id,false, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+    @Override
+    public void logic_delete(Long id){
+        loanRepository.logic_delete(id, true, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
 }

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

@@ -112,4 +112,23 @@ public class StepServiceImpl implements StepService {
         return stepRepository.findByCaseId(caseId);
     }
 
+    @Override
+    public StepVO findByStepNameAndCaseId(String stepName,Long caseId) {
+        return BeanUtil.copyProperties(stepRepository.findByStepNameAndCaseId(stepName, caseId), StepVO.class);
+    }
+
+    @Override
+    public void updateUserId1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId){
+
+        stepRepository.updateUser1ByCaseIdAndStepName(stepName,approverId,caseId,LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    };
+
+    @Override
+    public void updateUserId2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId){
+        stepRepository.updateUser2ByCaseIdAndStepName(stepName,approverId,caseId,LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    };
+
+    public void logic_delete(Long id){
+        stepRepository.logic_delete(id,true,LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
 }

+ 116 - 55
src/main/java/com/loan/system/service/Impl/UserServiceImpl.java

@@ -1,13 +1,13 @@
 package com.loan.system.service.Impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.loan.system.constant.MessageConstant;
 import com.loan.system.domain.dto.UserLoginDTO;
 import com.loan.system.domain.entity.BizRecommender;
 import com.loan.system.domain.entity.Customer;
 import com.loan.system.domain.entity.User;
 import com.loan.system.domain.enums.ExceptionEnum;
+import com.loan.system.domain.pojo.Result;
 import com.loan.system.exception.DescribeException;
 import com.loan.system.properties.WeChatProperties;
 import com.loan.system.repository.CustomerRepository;
@@ -15,28 +15,43 @@ import com.loan.system.repository.RecommenderRepository;
 import com.loan.system.repository.UserRepository;
 import com.loan.system.service.UserService;
 import com.loan.system.utils.HttpClientUtil;
+import com.loan.system.utils.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
 
 import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 @Service
 public class UserServiceImpl implements UserService {
+    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
+
     private final UserRepository userRepository;
     private final CustomerRepository customerRepository;
     private final RecommenderRepository recommenderRepository;
     private final WeChatProperties weChatProperties;
+    private final StringRedisTemplate redisTemplate;
     public static final String WX_LOGIN="https://api.weixin.qq.com/sns/jscode2session";
 
     @Autowired
-    public UserServiceImpl(UserRepository userRepository, CustomerRepository customerRepository, RecommenderRepository recommenderRepository, WeChatProperties weChatProperties) {
+    public UserServiceImpl(UserRepository userRepository, CustomerRepository customerRepository, RecommenderRepository recommenderRepository,
+                           WeChatProperties weChatProperties, StringRedisTemplate redisTemplate) {
         this.userRepository = userRepository;
         this.customerRepository = customerRepository;
         this.recommenderRepository = recommenderRepository;
         this.weChatProperties = weChatProperties;
+        this.redisTemplate = redisTemplate;
     }
 
     @Override
@@ -44,15 +59,6 @@ public class UserServiceImpl implements UserService {
         return userRepository.findByMobile(mobile);
     }
 
-    @Override
-    public Customer getCustomerByMobile(String mobile) {
-        return customerRepository.findByMobile(mobile, false);
-    }
-
-    @Override
-    public void addCustomer(Customer  customer) {
-        customerRepository.save(customer);
-    }
 
     @Override
     public List<Customer> getAllCustomers(Boolean isDelete) {
@@ -69,58 +75,113 @@ public class UserServiceImpl implements UserService {
         return recommenderRepository.findByIsDelete(isDelete);
     }
 
-    @Override
-    public Customer getCustomerById(Long id , Boolean isDelete) {
-        return customerRepository.findByIdAndIsDelete(id,isDelete);
-    }
+
+//    @Override
+//    public User wxLogin(UserLoginDTO userLoginDTO) {
+//        //调用微信接口服务,获得当前微信用户的openid
+//        String openid=getOpenid(userLoginDTO.getCode());
+//
+//        //判断openid是否为空,如果为空表示登录失败,抛出业务异常
+//        if (openid==null)
+//            throw new DescribeException(ExceptionEnum.LOGIN_EXPIRED);
+//
+//        //判断当前用户是否为新用户
+//        User user = userRepository.findByMobile(userLoginDTO.getTel());
+////        if(user==null)
+////        {
+////            user = User.builder()
+////                    .openid(openid)
+////                    .createTime(LocalDateTime.now())
+////                    .build();
+////            userMapper.insert(user);
+////        }
+//
+//
+//        //返回这个用户对象
+//        return user;
+//    }
+
+//    private String getOpenid(String code){
+//        Map<String,String> map=new HashMap<>();
+//        map.put("appid",weChatProperties.getAppid());
+//        map.put("secret",weChatProperties.getSecret());
+//        map.put("js_code",code);
+//        map.put("grant_type","authorization_code");
+//        String json = HttpClientUtil.doGet(weChatProperties.getLoginUrl(), map);
+//
+//        JSONObject jsonObject= JSON.parseObject(json);
+//        String openid = jsonObject.getString("openid");
+//
+//        return openid;
+//    }
 
     @Override
-    public Customer getCustomerByKey(String key, boolean b) {
-        return customerRepository.findByKey(key,b);
+    public Result get_sessionId(String code) {
+        String url = "https://api.weixin.qq.com/sns/jscode2session"
+                + "?appid=" + weChatProperties.getAppid()
+                + "&secret=" + weChatProperties.getSecret()
+                + "&js_code=" + code
+                + "&grant_type=authorization_code";
+
+        OkHttpClient client = new OkHttpClient();
+        Request request = new Request.Builder().url(url).build();
+        String res = "";
+        try (Response response = client.newCall(request).execute()) {
+            if (response.isSuccessful()) {
+                res = response.body().string();
+                log.info("成功获取数据: {}", res);
+
+                // 解析返回的JSON数据
+                JSONObject obj = new JSONObject(res);
+                String openid = obj.getString("openid");
+                String sessionKey = obj.getString("session_key");
+
+                // 存储到Redis
+                String uuid = UUID.randomUUID().toString();
+                Map<String, String> sessionData = new HashMap<>();
+                sessionData.put("openid", openid);
+                sessionData.put("session_key", sessionKey);
+                redisTemplate.opsForValue().set("wx_session_id_" + uuid,
+                        JSON.toJSONString(sessionData), 30, TimeUnit.MINUTES);
+
+                Map<String, String> result = new HashMap<>();
+                result.put("session_id", uuid);
+                result.put("openid", openid);
+                return ResultUtil.success("success", result);
+
+            } else {
+                String body = response.body().string();
+                try {
+                    JSONObject obj = new JSONObject(body);
+                    int errCode = obj.getInt("errcode");
+                    String errMsg = obj.getString("errmsg");
+                    return ResultUtil.error(errCode, errMsg);
+                } catch (Exception e) {
+                    return ResultUtil.error(response.code(), "服务器返回格式异常");
+                }
+            }
+        } catch (Exception e) {
+            log.error("获取 session_id 失败,code: {}, error: {}", code, e.getMessage());
+            return ResultUtil.error(500, "网络异常");
+        }
     }
 
+    /**
+     * 根据手机号查询用户
+     * @param phoneNumber
+     * @return
+     */
     @Override
-    public User wxLogin(UserLoginDTO userLoginDTO) {
-        //调用微信接口服务,获得当前微信用户的openid
-        String openid=getOpenid(userLoginDTO.getCode());
-
-        //判断openid是否为空,如果为空表示登录失败,抛出业务异常
-        if (openid==null)
-            throw new DescribeException(ExceptionEnum.LOGIN_EXPIRED);
-
-        //判断当前用户是否为新用户
-        User user = userRepository.findByMobile(userLoginDTO.getTel());
-//        if(user==null)
-//        {
-//            user = User.builder()
-//                    .openid(openid)
-//                    .createTime(LocalDateTime.now())
-//                    .build();
-//            userMapper.insert(user);
-//        }
-
-
-        //返回这个用户对象
-        return user;
+    public boolean existsByMobileAndIsDelete(String phoneNumber){
+        return userRepository.existsByMobileAndIsDelete(phoneNumber,false);
     }
-
     @Override
-    public User findByIdAndIsDelete(Long userId) {
-        return userRepository.findByUserIdAndIsDelete(userId, false);
+    public User findByPhoneNumberAndIsDelete(String phoneNumber){
+        return userRepository.findByMobileAndIsDelete(phoneNumber,false);
     }
-
-    private String getOpenid(String code){
-        Map<String,String> map=new HashMap<>();
-        map.put("appid",weChatProperties.getAppid());
-        map.put("secret",weChatProperties.getSecret());
-        map.put("js_code",code);
-        map.put("grant_type","authorization_code");
-        String json = HttpClientUtil.doGet(weChatProperties.getLoginUrl(), map);
-
-        JSONObject jsonObject= JSON.parseObject(json);
-        String openid = jsonObject.getString("openid");
-
-        return openid;
+    @Override
+    public User findByIdAndIsDelete(Long id){
+        return userRepository.findByIdAndIsDelete(id,false);
     }
 
 }

+ 112 - 0
src/main/java/com/loan/system/service/Impl/WxServiceImpl.java

@@ -0,0 +1,112 @@
+package com.loan.system.service.Impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.loan.system.domain.pojo.TemplateMessage;
+import com.loan.system.properties.WeChatProperties;
+import com.loan.system.service.WxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.spec.AlgorithmParameterSpec;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class WxServiceImpl implements WxService {
+
+    /**
+     * 微信公众号appid
+     */
+//    @Value("${wechat.appid}")
+//    private String appId;
+//    /**
+//     * 微信公众号secret
+//     */
+//    @Value("${wechat.secret}")
+//    private String appSecret;
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    WeChatProperties weChatProperties;
+
+    @Override
+
+    public String wxDecrypt(String encryptedData, String sessionId, String vi) throws Exception {
+        // 开始解密
+        String json = redisTemplate.opsForValue().get("wx_session_id_" + sessionId);
+        JSONObject jsonObject = JSON.parseObject(json);
+        String sessionKey = (String) jsonObject.get("session_key");
+
+        byte[] encData = Base64.getDecoder().decode(encryptedData); // 使用 Java 标准库
+        byte[] iv = Base64.getDecoder().decode(vi); // 使用 Java 标准库
+        byte[] key = Base64.getDecoder().decode(sessionKey); // 使用 Java 标准库
+
+        AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
+        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+
+        return new String(cipher.doFinal(encData), "UTF-8");
+    }
+    @Override
+
+    public String getAccessToken() {
+        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+weChatProperties.getAppid()+"&secret="+weChatProperties.getSecret();
+
+        RestTemplate restTemplate = new RestTemplate();
+        Map<String, Object> response = restTemplate.getForObject(url, Map.class, weChatProperties.getAppid(), weChatProperties.getSecret());
+
+        if (response != null && response.containsKey("access_token")) {
+            return (String) response.get("access_token");
+        } else {
+            throw new RuntimeException("获取access_token失败: " + response);
+        }
+    }
+    @Override
+    public String getUserPhoneNumber(String accessToken, String code) {
+        String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
+
+        RestTemplate restTemplate = new RestTemplate();
+
+        // 设置 POST body
+        Map<String, String> requestBody = new HashMap<>();
+        requestBody.put("code", code);
+
+        // 发送 POST 请求
+        Map<String, Object> response = restTemplate.postForObject(url, requestBody, Map.class);
+        if (response != null && response.containsKey("phone_info")) {
+            @SuppressWarnings("unchecked")
+            Map<String, Object> phoneInfo = (Map<String, Object>) response.get("phone_info");
+            return (String) phoneInfo.get("phoneNumber");
+        } else {
+            throw new RuntimeException("获取手机号失败: " + response);
+        }
+    }
+
+    @Override
+    public boolean sendTemplateMessage(String openid, TemplateMessage message) {
+        String token = getAccessToken();
+        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token;
+
+        // 确保 message 中的 openid 一致
+        message.setTouser(openid);
+        RestTemplate restTemplate = new RestTemplate();
+        Map<String, Object> result = restTemplate.postForObject(url, message, Map.class);
+
+        if (result == null) return false;
+
+        Integer errcode = (Integer) result.get("errcode");
+        return errcode != null && errcode == 0;
+    }
+
+
+}

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

@@ -14,4 +14,10 @@ public interface LoanService {
     void updateLoanCaseById(LoanCaseDTO loanCaseDTO, Long caseId);
 
     LoanCaseVO findLoanCaseDetailsById(Long caseId);
+
+    LoanCaseVO findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete);
+
+    void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete);
+
+    void logic_delete(Long id);
 }

+ 8 - 0
src/main/java/com/loan/system/service/StepService.java

@@ -15,4 +15,12 @@ public interface StepService {
     StepVO updateUserByCaseId(String stepName, Long approverId, Long caseId);
 
     List<StepVO> getStepByCaseId(Long caseId);
+
+    StepVO findByStepNameAndCaseId(String stepName,Long caseId);
+
+    void updateUserId1ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
+
+    void updateUserId2ByCaseIdAndStepName(String stepName, Long approverId, Long caseId);
+
+    void logic_delete(Long id);
 }

+ 6 - 7
src/main/java/com/loan/system/service/UserService.java

@@ -4,15 +4,13 @@ import com.loan.system.domain.dto.UserLoginDTO;
 import com.loan.system.domain.entity.BizRecommender;
 import com.loan.system.domain.entity.Customer;
 import com.loan.system.domain.entity.User;
+import com.loan.system.domain.pojo.Result;
 
 import java.util.List;
 
 public interface UserService {
     User getUserByMobile(String  mobile);
 
-    Customer getCustomerByMobile(String mobile);
-
-    void addCustomer(Customer customer);
 
     List<Customer> getAllCustomers(Boolean isDelete);
 
@@ -20,11 +18,12 @@ public interface UserService {
 
     List<BizRecommender> getAllRecommenders(Boolean isDelete);
 
-    Customer getCustomerById(Long id , Boolean isDelete);
-
-    Customer getCustomerByKey(String key, boolean b);
 
-    User wxLogin(UserLoginDTO userLoginDTO);
+    //User wxLogin(UserLoginDTO userLoginDTO);
 
     User findByIdAndIsDelete(Long userId);
+
+    Result get_sessionId(String code);
+    User findByPhoneNumberAndIsDelete(String phoneNumber);
+    boolean existsByMobileAndIsDelete(String phoneNumber);
 }

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

@@ -0,0 +1,10 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.pojo.TemplateMessage;
+
+public interface WxService {
+    String wxDecrypt(String encryptedData, String sessionId, String vi) throws Exception;
+    String getAccessToken();
+    String getUserPhoneNumber(String accessToken, String code);
+    boolean sendTemplateMessage(String openid, TemplateMessage message);
+}

+ 1 - 4
src/main/resources/application.yaml

@@ -27,7 +27,4 @@ system:
     user-token-name: Authorization
     admin-secret-key: loanSystemTest
     admin-ttl: 604800000
-    admin-token-name: Authorization
-  wechat:
-    appid: ${system.wechat.appid}
-    secret: ${system.wechat.secret}
+    admin-token-name: Authorization