Ver Fonte

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/main/java/com/loan/system/controller/wechat/ApprovalController.java
#	src/main/java/com/loan/system/controller/wechat/CollateralController.java
#	src/main/java/com/loan/system/controller/wechat/UserController.java
#	src/main/java/com/loan/system/domain/dto/CollateralPlanApprovalDTO.java
#	src/main/java/com/loan/system/domain/dto/CollateralPlanDTO.java
#	src/main/java/com/loan/system/domain/entity/CollateralPlan.java
#	src/main/java/com/loan/system/domain/enums/DecisionEnum.java
#	src/main/java/com/loan/system/domain/vo/CollateralPlanVO.java
#	src/main/java/com/loan/system/repository/CollateralPlanRepository.java
#	src/main/java/com/loan/system/repository/CollateralRepository.java
#	src/main/java/com/loan/system/repository/StepRepository.java
#	src/main/java/com/loan/system/repository/UserRepository.java
#	src/main/java/com/loan/system/service/CollateralPlanService.java
#	src/main/java/com/loan/system/service/CollateralService.java
#	src/main/java/com/loan/system/service/Impl/CollateralPlanServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/CollateralServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/StepServiceImpl.java
#	src/main/java/com/loan/system/service/Impl/UserServiceImpl.java
#	src/main/java/com/loan/system/service/UserService.java
#	src/main/resources/application-dev.yaml
#	src/main/resources/application.yaml
25057 há 4 meses atrás
pai
commit
42a754e9f5

+ 28 - 0
pom.xml

@@ -22,6 +22,32 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20231013</version> <!-- 使用最新版本 -->
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.10.0</version>
+        </dependency>
+
         <dependency>
             <groupId>javax.annotation</groupId>
             <artifactId>jsr250-api</artifactId>
@@ -307,6 +333,8 @@
                             <version>${org.lombok.version}</version>
                         </path>
                     </annotationProcessorPaths>
+                    <source>8</source>
+                    <target>8</target>
                 </configuration>
             </plugin>
         </plugins>

+ 1 - 0
src/main/java/com/loan/system/constant/JwtClaimsConstant.java

@@ -4,6 +4,7 @@ public class JwtClaimsConstant {
 
     public static final String EMP_ID = "empId";
     public static final String USER_ID = "userId";
+    public static final String CUSTOMER_ID = "customerId";
     public static final String PHONE = "phone";
     public static final String OPENID = "openid";
     public static final String isCustomer = "isCustomer";

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

@@ -0,0 +1,14 @@
+package com.loan.system.domain;
+
+import lombok.Data;
+
+@Data
+public class WXAuth {
+    private String encryptedData;
+    private String iv;
+    private String sessionKey;
+    private String signature;
+    private String rawData;
+
+
+}

+ 16 - 0
src/main/java/com/loan/system/domain/dto/CustomerLoginDTO.java

@@ -0,0 +1,16 @@
+package com.loan.system.domain.dto;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerLoginDTO implements Serializable {
+    private String mobile;
+    private String openid;
+}

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

@@ -5,7 +5,7 @@ import lombok.*;
 import javax.persistence.*;
 import java.time.Instant;
 
-
+@Builder
 @Entity
 @Table(name = "approval_record", indexes = {
         @Index(name = "idx_case_id", columnList = "case_id")

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

@@ -51,5 +51,8 @@ public class LoanCase extends BaseEntity{
 
     @Column(name = "is_delete")
     private Boolean isDelete;
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "customer_id", insertable = false, updatable = false, referencedColumnName = "id")
+    private Customer customer;
 
 }

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

@@ -0,0 +1,16 @@
+package com.loan.system.domain.entity;
+
+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;
+}

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

@@ -116,6 +116,14 @@ public enum ExceptionEnum {
     COLLATERAL_PLAN_HAS_ENOUGH(-319,"计划数已达上限"),
 
 
+    COLLATERAL_NOT_EXIST(-310, "抵押物不存在"),
+    COLLATERAL_PLAN_NOT_EXIST(-311,"计划不存在"),
+    COLLATERAL_PLAN_NOT_ALREADY_APPROVED(-312,"计划未处于待审批状态"),
+    COLLATERAL_PLAN_NOT_ALREADY_EXECUTION(-313,"计划未处于待执行状态"),
+    COLLATERAL_PLAN_NOT_EQUAL_WAREHOUSE(-314,"计划与入库操作不符"),
+    COLLATERAL_PLAN_NOT_EQUAL_OUTBOUND(-315,"计划与出库操作不符"),
+    COLLATERAL_PLAN_ALREADY_EXIST(-316,"该押品已有计划未执行完成,不能重复添加"),
+
 
     STEP_EXIST(-350, "项目环节已存在"),
     STEP_NOT_EXIST(-351, "项目环节不存在"),

+ 22 - 0
src/main/java/com/loan/system/repository/ApprovalRepository.java

@@ -0,0 +1,22 @@
+package com.loan.system.repository;
+
+import com.loan.system.domain.entity.ApprovalRecord;
+import org.springframework.data.domain.Sort;
+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;
+
+public interface ApprovalRepository 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);
+
+}

+ 24 - 0
src/main/java/com/loan/system/repository/LoanCaseRepository.java

@@ -0,0 +1,24 @@
+package com.loan.system.repository;
+
+
+import com.loan.system.domain.entity.LoanCase;
+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;
+
+public interface LoanCaseRepository extends JpaRepository<LoanCase,Long> {
+    LoanCase findByIdAndIsDelete(Long customerId,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);
+
+
+}

+ 4 - 3
src/main/java/com/loan/system/repository/LoanRepository.java

@@ -41,8 +41,9 @@ public interface LoanRepository extends JpaRepository<LoanCase,Long> {
            "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);
+    @Query("SELECT lc FROM LoanCase lc LEFT JOIN FETCH lc.customer WHERE lc.id = :caseId AND lc.isDelete = :isDelete")
+    LoanCase findLoanCaseById(@Param("caseId") Long caseId, @Param("isDelete") boolean isDelete);
+
 
     @Modifying
     @Transactional
@@ -51,7 +52,7 @@ public interface LoanRepository extends JpaRepository<LoanCase,Long> {
 
     @Modifying
     @Transactional
-    @Query("UPDATE LoanCase SET updateTime = ?3, isDelete = ?2 WHERE id = ?1 AND isDelete = ?2")
+    @Query("UPDATE LoanCase SET updateTime = ?3, isDelete = ?2 WHERE id = ?1 AND isDelete = false")
     void logic_delete(Long id, boolean isDelete, String updateTime);
 
     Boolean existsByIdAndIsDelete(Long caseId, boolean isDelete);

+ 30 - 0
src/main/java/com/loan/system/service/Impl/LoanCaseServiceImpl.java

@@ -0,0 +1,30 @@
+package com.loan.system.service.Impl;
+
+import com.loan.system.domain.entity.LoanCase;
+import com.loan.system.repository.LoanCaseRepository;
+import com.loan.system.service.LoanCaseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Service
+public class LoanCaseServiceImpl implements LoanCaseService {
+    @Autowired
+    private LoanCaseRepository LoanCaseRepository;
+
+    @Override
+
+    public LoanCase findByIdAndIsDelete(Long id){
+        return LoanCaseRepository.findByIdAndIsDelete(id,false);
+    };
+    @Override
+    public void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete){
+        LoanCaseRepository.updateUpdatetimeByIdAndIsDeleted(id,false, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+    @Override
+    public void logic_delete(Long id){
+           LoanCaseRepository.logic_delete(id, true, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+}

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

@@ -219,8 +219,8 @@ public class LoanServiceImpl implements LoanService {
 //    }
 
     @Override
-    public LoanCase findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete) {
-        return loanRepository.findLoanCaseById(caseId, isDelete);
+    public LoanCaseVO findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete) {
+        return BeanUtil.copyProperties(loanRepository.findLoanCaseById(caseId, isDelete), LoanCaseVO.class);
     }
 
     @Override

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

@@ -0,0 +1,11 @@
+package com.loan.system.service;
+
+import com.loan.system.domain.entity.LoanCase;
+
+public interface LoanCaseService {
+    LoanCase findByIdAndIsDelete(Long id);
+
+    void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete);
+
+    void logic_delete(Long id);
+}

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

@@ -17,7 +17,7 @@ public interface LoanService {
 
     LoanCaseVO findLoanCaseDetailsById(Long caseId);
 
-    LoanCase findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete);
+    LoanCaseVO findLoanCaseByIdAndIsDelete(Long caseId, boolean isDelete);
 
     void updateUpdatetimeByIdAndIsDeleted(Long id,boolean isDelete);
 

+ 4 - 1
src/main/java/com/loan/system/utils/JwtTokenUtil.java

@@ -1,5 +1,6 @@
 package com.loan.system.utils;
 
+import com.loan.system.constant.JwtClaimsConstant;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.ExpiredJwtException;
 import io.jsonwebtoken.Jwts;
@@ -86,7 +87,9 @@ public class JwtTokenUtil implements Serializable {
     public static String getUsernameFromToken(String token) {
         return getClaimsFromToken(token).getSubject();
     }
-
+    public static Long getUserIdFromToken(String token){
+        return (Long) getClaimsFromToken(token).get(JwtClaimsConstant.USER_ID);
+    }
     public static String getNumberFromToken(String token){
         return (String) getClaimsFromToken(token).get("number");
     }

+ 0 - 122
src/main/java/com/loan/system/utils/WeChatUtil.java

@@ -1,122 +0,0 @@
-package com.loan.system.utils;
-
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.codec.binary.Base64;
-import org.codehaus.xfire.client.Client;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author raptor
- * @description WeChatUtil
- * @date 2021/4/1 13:21
- */
-public class WeChatUtil {
-    private static ObjectMapper mapper = new ObjectMapper();
-    private static ApplicationContext appContext;
-
-    /**
-     *
-     * @param person_info
-     * 接收人信息,每个人员信息格式为:名字|学工号|部门ID|部门名称|对应微信账号,
-     * 人与人之间用“^@^”隔开(如果数据无法提供,可以写空,但是“|”不可省略),必须
-     *                      "raptor|202050235|11644008804352|杭州电子科技大学|18758159060"
-     * @param priority  发送优先级(1:紧急通知;2:验证码;3:立即发送;4:发送),必须
-     * @param wechat_info   内容,必须
-     * @return  {"result":true,"msg_id":"22961055561793536","msg":"发布成功"}
-     */
-    public static Object sendWeChatMessage(String person_info, String priority, String wechat_info){
-        Map<String, Object> map = new HashMap<String, Object>(16);
-        try {
-            appContext = new ClassPathXmlApplicationContext(new String[] {});
-            // webservice 地址由生产环境决定
-            org.springframework.core.io.Resource resource = appContext
-                    .getResource("http://i.hdu.edu.cn/tp_mp/service/WechatService?wsdl");
-
-            /** start 协议参数 start **/
-            // 调用接口的第三方系统协议名称。由双方协议确定。(*必填项)
-            map.put("tp_name", "Document");
-            // 提供接口服务的系统名称(sys/up/mp…)。由统一门户系统提供。(*必填项)
-            map.put("sys_id", "mp");
-            // 接口方法所属模块。由统一门户系统提供。(*必填项)
-            map.put("module_id", "wechat");
-            // SHA 加密后第三方系统的权限密钥值。权限密钥由统一门户系统提供。(*必填项)
-            map.put("secret_key", getSHA("xWpDa+fGlqkXGUZLNjawGT+9MHw="));
-            // 对应的接口方法名称,由统一门户系统提供。(*必填项)
-            map.put("interface_method", "saveWechatInfo");
-            /** end 协议参数 end **/
-
-            map.put("person_info", person_info);
-
-            map.put("send_priority", priority);
-
-            /** start 业务参数 start **/
-            //发送微信发布类型(text:⽂本;news:图⽂;image:图⽚;file:⽂件;video:视频;voice:⾳频),不可为空,参数不可省略
-            map.put("wechat_type", "text");
-            //内容,必须
-            map.put("wechat_info", wechat_info);
-            //发送⼈ID_NUMBER,需要发送回执的时候不可为空,参数不可省略
-            map.put("operator_id_number", "09901");
-            //发送微信附件(包括图⽚,⽂件,视频和⾳频的附件路径),为空,参数不可	省略
-            map.put("wechat_attachment", "");
-            //发送附件名称,为空,参数不可省略
-            map.put("attachment_name", "");
-            //发送附件标题,为空,参数不可省略
-            map.put("attachment_title", "");
-            //发送附件描述,为空,参数不可省略
-            map.put("attachment_des", "");
-            //发送附件时⻓(视频和⾳频),为空,参数不可省略
-            map.put("attachment_time", "");
-            //发送模板选择,不发送模板值为”0”,参数不可省略
-            map.put("templet_id", "0");
-            //发送回执选择,不发送回执值为”0”,参数不可省略
-            map.put("receipt_id", "0");
-            //发送⼈签名,根据模板⽽定,选择的模板有“发送⼈签名”标签的需要写值,其他为空,参数不可省略
-            map.put("person_send", "公管处");
-            /** end 业务参数 end **/
-
-
-
-            String json = mapper.writeValueAsString(map);
-            // 请求参数
-            System.out.println("json:" + json);
-
-            Client client = new Client(resource.getInputStream(), null);
-            Object[] result = client.invoke("saveWechatInfo", new Object[] { json });
-
-            // 返回结果
-            System.out.println(result[0]);
-
-            client.close();
-            return result[0];
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-    /**
-     * 获取 SHA 值  
-     *
-     * @author neusoft
-     * @since V7.0
-     * @param password
-     * @return SHA(password)
-     */
-    private static String getSHA(String password) {
-        try {
-            MessageDigest sha = MessageDigest.getInstance("SHA");
-            sha.update(password.getBytes());
-            byte[] hash = sha.digest();
-            return new String(Base64.encodeBase64(hash));
-        } catch (NoSuchAlgorithmException e1) {
-            e1.printStackTrace();
-        }
-        return "";
-    }
-}