linxk 3 weeks ago
parent
commit
819f9d17aa
21 changed files with 508 additions and 454 deletions
  1. 13 11
      cif-service/pom.xml
  2. 1 1
      cif-service/src/main/java/com/txz/cif/core/AbstractApiController.java
  3. 160 121
      cif-service/src/main/java/com/txz/cif/core/AuthService.java
  4. 17 7
      cif-service/src/main/java/com/txz/cif/dubbo/impl/AccountDubboServiceImpl.java
  5. 2 140
      cif-service/src/main/java/com/txz/cif/model/AccountFreezd.java
  6. 4 0
      cif-service/src/main/java/com/txz/cif/model/WithdrawRecord.java
  7. 3 0
      cif-service/src/main/java/com/txz/cif/service/RechargeRecordService.java
  8. 1 0
      cif-service/src/main/java/com/txz/cif/service/WithdrawRecordService.java
  9. 1 1
      cif-service/src/main/java/com/txz/cif/service/impl/FlowServiceImpl.java
  10. 27 0
      cif-service/src/main/java/com/txz/cif/service/impl/RechargeRecordServiceImpl.java
  11. 27 0
      cif-service/src/main/java/com/txz/cif/service/impl/WithdrawRecordServiceImpl.java
  12. 0 15
      cif-service/src/main/java/com/txz/cif/web/AccountApiController.java
  13. 24 4
      cif-service/src/main/java/com/txz/cif/web/RechargeRecordApiController.java
  14. 4 0
      cif-service/src/main/java/com/txz/cif/web/UserApiController.java
  15. 182 0
      cif-service/src/main/java/com/txz/cif/web/WithdrawRecordApiController.java
  16. 0 51
      cif-service/src/main/java/com/txz/cif/web/mng/RechargeRecordController.java
  17. 0 51
      cif-service/src/main/java/com/txz/cif/web/mng/RedEnvelopeController.java
  18. 0 51
      cif-service/src/main/java/com/txz/cif/web/mng/WithdrawRecordController.java
  19. 40 0
      cif-service/src/main/java/com/txz/cif/web/para/WithdrawParam.java
  20. 1 1
      cif-service/src/main/resources/mapper/AccountFreezdMapper.xml
  21. 1 0
      cif-service/src/main/resources/mapper/WithdrawRecordMapper.xml

+ 13 - 11
cif-service/pom.xml

@@ -75,11 +75,18 @@
 <!--            <version>0.5.2</version>-->
 <!--        </dependency>-->
 
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt</artifactId>
-            <version>0.9.1</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>io.jsonwebtoken</groupId>-->
+<!--            <artifactId>jjwt</artifactId>-->
+<!--            <version>0.9.1</version>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>cn.hutool</groupId>-->
+<!--            <artifactId>hutool-all</artifactId>-->
+<!--            <version>RELEASE</version>-->
+<!--            <scope>compile</scope>-->
+<!--        </dependency>-->
 
 <!--        <dependency>-->
 <!--            <groupId>com.google.firebase</groupId>-->
@@ -115,12 +122,7 @@
 <!--            <scope>provided</scope>-->
         </dependency>
 
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>RELEASE</version>
-            <scope>compile</scope>
-        </dependency>
+
 
 
         <!--异维科技dubbo接口包依赖-->

+ 1 - 1
cif-service/src/main/java/com/txz/cif/core/AbstractApiController.java

@@ -10,7 +10,7 @@ public abstract class AbstractApiController {
      * 从 Header 中获取
      */
     public static final String X_CLIENT_TOKEN_USERID = "x-client-token-userId";
-    public static final String X_CLIENT_TOKEN_OPERATORID = "x-client-token-operatorId";
+    public static final String X_CLIENT_TOKEN = "token";
 
 
 }

+ 160 - 121
cif-service/src/main/java/com/txz/cif/core/AuthService.java

@@ -1,121 +1,160 @@
-package com.txz.cif.core;
-
-import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.json.JSONUtil;
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.ExpiredJwtException;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.ImmutableTriple;
-import org.apache.commons.lang3.tuple.Triple;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
-
-@Service
-@Slf4j
-public class AuthService {
-
-    private static final String BEARER = "Bearer ";
-
-    /**
-     * jwt token 密钥,主要用于token解析,签名验证
-     */
-    @Value("${spring.security.oauth2.jwt.signingKey}")
-    private static String signingKey = "txz123456";
-
-
-    public String buildJwtToken( Long userId) {
-        String KEY = "txz123456";
-        Date now = DateUtil.date();
-        Date exp = DateUtil.offset(now, DateField.DAY_OF_YEAR,30);
-        Map<String, Object> claims = new HashMap<String, Object>();
-        claims.put("userId", userId);
-
-        String jwtToken = Jwts.builder()
-                .setClaims(claims)
-                .setId(UUID.randomUUID().toString())
-                .setIssuedAt(now)
-                .setSubject("sawa")
-                .signWith(SignatureAlgorithm.HS256, KEY.getBytes())
-                .setExpiration(exp).compact();
-
-        return "Bearer " +jwtToken;
-    }
-
-    public String buildJwtTokenWithRole( Long userId,Integer role, Integer day) {
-        String KEY = "123456";
-        Date now = DateUtil.date();
-        Date exp = DateUtil.offset(now, DateField.DAY_OF_YEAR,day);
-        Map<String, Object> claims = new HashMap<String, Object>();
-        claims.put("userId", userId);
-        claims.put("role", role);
-
-        String jwtToken = Jwts.builder()
-                .setClaims(claims)
-                .setId(UUID.randomUUID().toString())
-                .setIssuedAt(now)
-                .setSubject("sawa")
-                .signWith(SignatureAlgorithm.HS256, KEY.getBytes())
-                .setExpiration(exp).compact();
-
-        return "Bearer " +jwtToken;
-    }
-
-    public Claims getClaimsFromToken(String authentication) {
-        try {
-            final Claims claims = this.getJwt(authentication);
-            boolean pass = DateUtil.compare(DateUtil.date(),claims.getExpiration()) < 0;
-            if (pass){
-                return claims;
-            }
-        } catch (Exception e) {
-            log.error("get userId from token error:{}", e.getMessage());
-        }
-        return null;
-    }
-
-
-    private static Claims getJwt(String jwtToken) {
-        if (jwtToken.startsWith(BEARER)) {
-            jwtToken = StringUtils.substring(jwtToken, BEARER.length());
-        }
-        Claims claims;
-        try {
-            claims = Jwts.parser()  //得到DefaultJwtParser
-                    .setSigningKey(signingKey.getBytes()) //设置签名的秘钥
-                    .parseClaimsJws(jwtToken).getBody();
-        } catch(ExpiredJwtException e) {
-            claims = e.getClaims();
-        }
-
-        return claims;
-    }
-
-    public Long getTokenUserId(HttpServletRequest request) {
-        if (request == null){
-            ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-            if (null != sra) {
-                request = sra.getRequest();
-            } else {
-                return null;
-            }
-        }
-        String token = request.getHeader("token");
-        Claims claims = getJwt(token);
-        return Long.valueOf(claims.get("userId").toString());
-    }
-
-}
-
-
-
-
+//package com.txz.cif.core;
+//
+//import cn.hutool.core.date.DateField;
+//import cn.hutool.core.date.DateUtil;
+//import cn.hutool.json.JSONUtil;
+//import io.jsonwebtoken.Claims;
+//import io.jsonwebtoken.ExpiredJwtException;
+//import io.jsonwebtoken.Jwts;
+//import io.jsonwebtoken.SignatureAlgorithm;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.lang3.StringUtils;
+//import org.apache.commons.lang3.tuple.ImmutableTriple;
+//import org.apache.commons.lang3.tuple.Triple;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Service;
+//import org.springframework.web.context.request.RequestContextHolder;
+//import org.springframework.web.context.request.ServletRequestAttributes;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import java.util.*;
+//
+//
+//@Service
+//@Slf4j
+//public class AuthService {
+//
+//    private static final String BEARER = "Bearer ";
+//
+//    /**
+//     * jwt token 密钥,主要用于token解析,签名验证
+//     */
+//    @Value("${spring.security.oauth2.jwt.signingKey}")
+//    private static String signingKey = "txz123456";
+//
+//
+//    public String buildJwtToken( Long userId) {
+//        String KEY = "txz123456";
+//        Date now = DateUtil.date();
+//        Date exp = DateUtil.offset(now, DateField.DAY_OF_YEAR,30);
+//        Map<String, Object> claims = new HashMap<String, Object>();
+//        claims.put("userId", userId);
+//
+//        String jwtToken = Jwts.builder()
+//                .setClaims(claims)
+//                .setId(UUID.randomUUID().toString())
+//                .setIssuedAt(now)
+//                .setSubject("sawa")
+//                .signWith(SignatureAlgorithm.HS256, KEY.getBytes())
+//                .setExpiration(exp).compact();
+//
+//        return "Bearer " +jwtToken;
+//    }
+//
+//    public String buildJwtTokenWithRole( Long userId,Integer role, Integer day) {
+//        String KEY = "123456";
+//        Date now = DateUtil.date();
+//        Date exp = DateUtil.offset(now, DateField.DAY_OF_YEAR,day);
+//        Map<String, Object> claims = new HashMap<String, Object>();
+//        claims.put("userId", userId);
+//        claims.put("role", role);
+//
+//        String jwtToken = Jwts.builder()
+//                .setClaims(claims)
+//                .setId(UUID.randomUUID().toString())
+//                .setIssuedAt(now)
+//                .setSubject("sawa")
+//                .signWith(SignatureAlgorithm.HS256, KEY.getBytes())
+//                .setExpiration(exp).compact();
+//
+//        return "Bearer " +jwtToken;
+//    }
+//
+//    public Claims getClaimsFromToken(String authentication) {
+//        try {
+//            final Claims claims = this.getJwt(authentication);
+//            boolean pass = DateUtil.compare(DateUtil.date(),claims.getExpiration()) < 0;
+//            if (pass){
+//                return claims;
+//            }
+//        } catch (Exception e) {
+//            log.error("get userId from token error:{}", e.getMessage());
+//        }
+//        return null;
+//    }
+//
+//
+//    private static Claims getJwt(String jwtToken) {
+//        if (jwtToken.startsWith(BEARER)) {
+//            jwtToken = StringUtils.substring(jwtToken, BEARER.length());
+//        }
+//        Claims claims;
+//        try {
+//            claims = Jwts.parser()  //得到DefaultJwtParser
+//                    .setSigningKey(signingKey.getBytes()) //设置签名的秘钥
+//                    .parseClaimsJws(jwtToken).getBody();
+//        } catch(ExpiredJwtException e) {
+//            claims = e.getClaims();
+//        }
+//
+//        return claims;
+//    }
+//
+//    public Long getTokenUserId(HttpServletRequest request) {
+//        if (request == null){
+//            ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//            if (null != sra) {
+//                request = sra.getRequest();
+//            } else {
+//                return null;
+//            }
+//        }
+//        String token = request.getHeader("token");
+//        Claims claims = getJwt(token);
+//        return Long.valueOf(claims.get("userId").toString());
+//    }
+//
+//    /**
+//     * 验证 JWT token 的有效性
+//     * @param token 待验证的 token 字符串(可带或不带 "Bearer " 前缀)
+//     * @return 验证结果对象,包含:
+//     *         - 是否有效(boolean)
+//     *         - 如果无效,错误信息(String)
+//     *         - 如果有效,解析出的 Claims 对象(Claims)
+//     */
+//    public Triple<Boolean, String, Claims> verifyToken(String token) {
+//        try {
+//            // 1. 检查token是否为空
+//            if (StringUtils.isBlank(token)) {
+//                return ImmutableTriple.of(false, "Token不能为空", null);
+//            }
+//
+//            // 2. 解析token获取Claims
+//            Claims claims = getJwt(token);
+//
+//            // 3. 检查token是否过期
+//            if (DateUtil.compare(DateUtil.date(), claims.getExpiration()) >= 0) {
+//                return ImmutableTriple.of(false, "Token已过期", claims);
+//            }
+//
+//            // 4. 检查必要字段(根据业务需求)
+//            if (claims.get("userId") == null) {
+//                return ImmutableTriple.of(false, "无效Token: 缺少userId字段", claims);
+//            }
+//
+//            // 5. 所有检查通过,返回有效
+//            return ImmutableTriple.of(true, null, claims);
+//        } catch (ExpiredJwtException e) {
+//            // 专门处理过期异常,可以获取到过期的claims
+//            return ImmutableTriple.of(false, "Token已过期", e.getClaims());
+//        } catch (Exception e) {
+//            log.error("Token验证失败: {}", e.getMessage());
+//            return ImmutableTriple.of(false, "无效Token: " + e.getMessage(), null);
+//        }
+//    }
+//
+//}
+//
+//
+//
+//

+ 17 - 7
cif-service/src/main/java/com/txz/cif/dubbo/impl/AccountDubboServiceImpl.java

@@ -6,16 +6,19 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.txz.cif.core.ServiceException;
 import com.txz.cif.dto.Result;
+import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
 import com.txz.cif.model.Account;
 import com.txz.cif.model.User;
 import com.txz.cif.param.*;
 import com.txz.cif.service.*;
 import com.txz.cif.web.para.RedEnvelopeParam;
+import com.txz.operating.dto.ConfigDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,6 +38,9 @@ public class AccountDubboServiceImpl implements AccountDubboService {
     @Resource
     private RedEnvelopeService redEnvelopeService;
 
+    @Resource
+    private OperatingConfigDubboServiceClient operatingConfigDubboServiceClient;
+
 
 //    @Override
 //    public Result freeze(FreezdParam param) {
@@ -80,7 +86,10 @@ public class AccountDubboServiceImpl implements AccountDubboService {
                 .build());
         if (StrUtil.equals("200",result.getCode())){
             //计算开团红包金额
-            BigDecimal amount = param.getAmount();
+            com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode("open_red_envelope_rate");
+            String rate = openRedEnvelopeRate.getData().getValueInfo();
+            BigDecimal amount = param.getAmount().multiply(new BigDecimal(rate)).divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN);
+
             //开团红包
             Result result1 = redEnvelopeService.addRedEnvelope(RedEnvelopeParam.builder()
                     .amount(amount).bizType(1).orderNo(param.getBizNo())
@@ -119,7 +128,9 @@ public class AccountDubboServiceImpl implements AccountDubboService {
 
         }
         //TODO 计算参团红包金额
-        BigDecimal amount = param.getAmount();
+        com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode("join_red_envelope_rate");
+        String rate = openRedEnvelopeRate.getData().getValueInfo();
+        BigDecimal amount = param.getAmount().multiply(new BigDecimal(rate)).divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN);
         //参团红包
         Result result1 = redEnvelopeService.addRedEnvelope(RedEnvelopeParam.builder()
                 .amount(amount).bizType(2).orderNo(param.getBizNo())
@@ -144,7 +155,10 @@ public class AccountDubboServiceImpl implements AccountDubboService {
             }
         }
         //TODO 计算参团红包金额
-        BigDecimal amount = param.getAmount();
+        com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode("join_red_envelope_rate");
+        String rate = openRedEnvelopeRate.getData().getValueInfo();
+        BigDecimal amount = param.getAmount().multiply(new BigDecimal(rate)).divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN);
+
         //参团红包
         Result result1 = redEnvelopeService.addRedEnvelope(RedEnvelopeParam.builder()
                 .amount(amount).bizType(2).orderNo(param.getBizNo())
@@ -154,10 +168,6 @@ public class AccountDubboServiceImpl implements AccountDubboService {
         return Result.genSuccessResult();
     }
 
-//    @Override
-//    public Result trans(TransParam param) {
-//        return flowService.trans(param);
-//    }
 
     @Override
     public Result addRedEnvelope(SignRedEnvelopeParam param) {

+ 2 - 140
cif-service/src/main/java/com/txz/cif/model/AccountFreezd.java

@@ -31,9 +31,9 @@ public class AccountFreezd {
     /**
      * 流水号
      */
-    @Column(name = "flow_id")
+    @Column(name = "biz_id")
     @ApiModelProperty(value="flowId流水号")
-    private Long flowId;
+    private Long bizId;
 
     /**
      * 冻结金额
@@ -68,143 +68,5 @@ public class AccountFreezd {
     @ApiModelProperty(value="updateTime更新时间")
     private Date updateTime;
 
-    /**
-     * @return id
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * @param id
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 获取账户id
-     *
-     * @return account_id - 账户id
-     */
-    public Long getAccountId() {
-        return accountId;
-    }
-
-    /**
-     * 设置账户id
-     *
-     * @param accountId 账户id
-     */
-    public void setAccountId(Long accountId) {
-        this.accountId = accountId;
-    }
-
-    /**
-     * 获取流水号
-     *
-     * @return flow_id - 流水号
-     */
-    public Long getFlowId() {
-        return flowId;
-    }
-
-    /**
-     * 设置流水号
-     *
-     * @param flowId 流水号
-     */
-    public void setFlowId(Long flowId) {
-        this.flowId = flowId;
-    }
-
-    /**
-     * 获取冻结金额
-     *
-     * @return amount - 冻结金额
-     */
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    /**
-     * 设置冻结金额
-     *
-     * @param amount 冻结金额
-     */
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
 
-    /**
-     * 获取解冻金额
-     *
-     * @return unfreeze_amount - 解冻金额
-     */
-    public BigDecimal getUnfreezeAmount() {
-        return unfreezeAmount;
-    }
-
-    /**
-     * 设置解冻金额
-     *
-     * @param unfreezeAmount 解冻金额
-     */
-    public void setUnfreezeAmount(BigDecimal unfreezeAmount) {
-        this.unfreezeAmount = unfreezeAmount;
-    }
-
-    /**
-     * 获取状态 1冻结中 2部分冻结 3已解冻
-     *
-     * @return status - 状态 1冻结中 2部分冻结 3已解冻
-     */
-    public Integer getStatus() {
-        return status;
-    }
-
-    /**
-     * 设置状态 1冻结中 2部分冻结 3已解冻
-     *
-     * @param status 状态 1冻结中 2部分冻结 3已解冻
-     */
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    /**
-     * 获取创建时间
-     *
-     * @return create_time - 创建时间
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * 设置创建时间
-     *
-     * @param createTime 创建时间
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
-     * 获取更新时间
-     *
-     * @return update_time - 更新时间
-     */
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    /**
-     * 设置更新时间
-     *
-     * @param updateTime 更新时间
-     */
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
 }

+ 4 - 0
cif-service/src/main/java/com/txz/cif/model/WithdrawRecord.java

@@ -52,6 +52,10 @@ public class WithdrawRecord {
     @ApiModelProperty(value="status状态 1处理中 2提现成功 3提现失败 4超时取消")
     private Integer status;
 
+    @Column(name = "account_type")
+    @ApiModelProperty(value="账号类型 1钱包 2收益")
+    private Integer accountType;
+
     /**
      * 渠道
      */

+ 3 - 0
cif-service/src/main/java/com/txz/cif/service/RechargeRecordService.java

@@ -8,4 +8,7 @@ import com.txz.cif.core.Service;
  */
 public interface RechargeRecordService extends Service<RechargeRecord> {
 
+    void success(RechargeRecord record);
+
+    void fail(RechargeRecord record);
 }

+ 1 - 0
cif-service/src/main/java/com/txz/cif/service/WithdrawRecordService.java

@@ -8,4 +8,5 @@ import com.txz.cif.core.Service;
  */
 public interface WithdrawRecordService extends Service<WithdrawRecord> {
 
+    void add(WithdrawRecord withdrawRecord);
 }

+ 1 - 1
cif-service/src/main/java/com/txz/cif/service/impl/FlowServiceImpl.java

@@ -172,7 +172,7 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
         if (innerCapitalAccount == null){
             return Result.genFailResult("账号未找到");
         }
-        flow = Flow.builder().amount(param.getAmount()).bizType(10)
+        flow = Flow.builder().amount(param.getDiscount()).bizType(10)
                 .bizNo(param.getBizNo()).createTime(today).updateTime(today).transTime(param.getTransTime())
                 .debitAccount(MyConstants.INNER_REBATE).creditAccount(account.getId())
                 .bizId(param.getBizId()).type(1)

+ 27 - 0
cif-service/src/main/java/com/txz/cif/service/impl/RechargeRecordServiceImpl.java

@@ -1,7 +1,10 @@
 package com.txz.cif.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.txz.cif.dao.RechargeRecordMapper;
 import com.txz.cif.model.RechargeRecord;
+import com.txz.cif.param.RechargeParam;
+import com.txz.cif.service.FlowService;
 import com.txz.cif.service.RechargeRecordService;
 import com.txz.cif.core.AbstractService;
 import org.springframework.stereotype.Service;
@@ -19,4 +22,28 @@ public class RechargeRecordServiceImpl extends AbstractService<RechargeRecord> i
     @Resource
     private RechargeRecordMapper cRechargeRecordMapper;
 
+    @Resource
+    private FlowService flowService;
+    @Override
+    public void success(RechargeRecord record) {
+        update(RechargeRecord.builder()
+                .id(record.getId())
+                .successTime(DateUtil.date())
+                .status(2)
+                .build());
+        flowService.recharge(RechargeParam.builder()
+                        .amount(record.getAmount())
+                        .bizNo(record.getOrderNo())
+                        .bizId(record.getId()+"")
+                        .userId(record.getUserId())
+                        .bizType(1001)
+                        .discount(record.getDiscount())
+                        .transTime(record.getTransTime())
+                .build());
+    }
+
+    @Override
+    public void fail(RechargeRecord record) {
+        update(RechargeRecord.builder() .id(record.getId()) .status(3).build());
+    }
 }

+ 27 - 0
cif-service/src/main/java/com/txz/cif/service/impl/WithdrawRecordServiceImpl.java

@@ -1,13 +1,20 @@
 package com.txz.cif.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.txz.cif.dao.WithdrawRecordMapper;
+import com.txz.cif.model.Account;
+import com.txz.cif.model.AccountFreezd;
 import com.txz.cif.model.WithdrawRecord;
+import com.txz.cif.service.AccountFreezdService;
+import com.txz.cif.service.AccountService;
 import com.txz.cif.service.WithdrawRecordService;
 import com.txz.cif.core.AbstractService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
 
 
 /**
@@ -19,4 +26,24 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
     @Resource
     private WithdrawRecordMapper cWithdrawRecordMapper;
 
+    @Resource
+    private AccountFreezdService accountFreezdService;
+
+    @Resource
+    private AccountService accountService;
+
+    @Override
+    public void add(WithdrawRecord withdrawRecord) {
+        saveUseGeneratedKeys(withdrawRecord);
+        Account account = accountService.getAccount(withdrawRecord.getUserId(), withdrawRecord.getAccountType());
+        //冻结金额
+        accountFreezdService.save(AccountFreezd.builder()
+                        .bizId(withdrawRecord.getId())
+                        .accountId(account.getId())
+                        .amount(withdrawRecord.getAmount().add(withdrawRecord.getFee()))
+                        .createTime(DateUtil.date())
+                        .unfreezeAmount(BigDecimal.ZERO)
+                        .status(1)
+                .build());
+    }
 }

+ 0 - 15
cif-service/src/main/java/com/txz/cif/web/AccountApiController.java

@@ -55,21 +55,6 @@ public class AccountApiController extends AbstractApiController {
 	@Resource
 	private UserService userService;
 
-	public static void main(String[] args) {
-		String month = DateUtil.format(DateUtil.beginOfMonth(DateUtil.date()),"yyyy-MM-dd");
-		Date a = DateUtil.beginOfMonth(DateUtil.date());
-		System.out.println(month.substring(0,4));
-		System.out.println(month);
-	}
-
-	Map<String, IndexCollectBO> getInitMonth(){
-		Map<String,IndexCollectBO> bos = new HashMap<>(12);
-		for (int i = 0; i < 12; i++) {
-			String name = DateUtil.offsetMonth(DateUtil.beginOfYear(DateUtil.date()),i).toString("yyyy-MM");
-			bos.put(name,IndexCollectBO.builder().name(name).num(BigDecimal.ZERO).build());
-		}
-		return bos;
-	}
 
 	@PostMapping("/accountFlowList")
 	@ApiOperation(value = "出入流水",httpMethod = "POST")

+ 24 - 4
cif-service/src/main/java/com/txz/cif/web/RechargeRecordApiController.java

@@ -2,21 +2,22 @@ package com.txz.cif.web;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.generator.SnowflakeGenerator;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.txz.cif.core.AuthService;
 import com.txz.cif.core.Result;
 import com.txz.cif.core.ResultGenerator;
 import com.txz.cif.model.Goods;
 import com.txz.cif.model.RechargeRecord;
 import com.txz.cif.model.User;
-import com.txz.cif.service.GoodsService;
-import com.txz.cif.service.RechargeRecordService;
+import com.txz.cif.param.RechargeParam;
+import com.txz.cif.service.*;
 
 import com.txz.cif.core.ResultCode;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.txz.cif.service.SequenceService;
-import com.txz.cif.service.UserService;
 import org.springframework.web.bind.annotation.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,6 +55,8 @@ public class RechargeRecordApiController {
 	@Resource
 	private UserService userService;
 
+
+
 	@Resource
 	private SequenceService sequenceService;
 
@@ -96,6 +99,23 @@ public class RechargeRecordApiController {
 
     }
 
+	@GetMapping("/callback")
+	@ApiOperation(value = "三方回调",httpMethod = "GET")
+	public Result<RechargeRecord> detail(@RequestParam String data) {
+		//TODO 回调成功
+		JSONObject json = JSONUtil.parseObj(data);
+		String orderNo = json.getStr("orderNo");
+		RechargeRecord record = rechargeRecordService.findBy("orderNo", orderNo);
+		if (record == null){
+			return ResultGenerator.genFailResult("订单未找到");
+		}
+		if (StrUtil.equals("1",json.getStr("status"))){
+			rechargeRecordService.success(record);
+		} else {
+			rechargeRecordService.fail(record);
+		}
+		return ResultGenerator.genSuccessResult();
+	}
 
 
     @GetMapping("/detail")

+ 4 - 0
cif-service/src/main/java/com/txz/cif/web/UserApiController.java

@@ -22,6 +22,7 @@ import com.txz.cif.web.para.UserInfoForm;
 import com.txz.cif.core.*;
 import com.txz.cif.model.*;
 import com.txz.cif.service.*;
+import com.txz.core.AuthService;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
@@ -82,6 +83,9 @@ public class UserApiController extends AbstractApiController {
                 if (user.getStatus() != 1){
                     return ResultGenerator.genFailResult(ResultCode.USER_STATUS_IS_ERROR);
                 }
+                String token = authService.buildJwtToken(user.getId());
+                user.setLastToken(token);
+                userService.update(User.builder().id(user.getId()).lastToken(token).build());
             } else {
                 return ResultGenerator.genFailResult(ResultCode.UNLOGIN_PWD_ERROR);
             }

+ 182 - 0
cif-service/src/main/java/com/txz/cif/web/WithdrawRecordApiController.java

@@ -0,0 +1,182 @@
+package com.txz.cif.web;
+import cn.hutool.core.date.DateUtil;
+import com.txz.cif.core.Result;
+import com.txz.cif.core.ResultGenerator;
+import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
+import com.txz.cif.model.Account;
+import com.txz.cif.model.WithdrawRecord;
+import com.txz.cif.service.AccountService;
+import com.txz.cif.service.SequenceService;
+import com.txz.cif.service.WithdrawRecordService;
+
+import com.txz.cif.core.ResultCode;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.txz.cif.web.para.WithdrawParam;
+import com.txz.core.AuthService;
+import com.txz.operating.dto.ConfigDTO;
+import io.jsonwebtoken.Claims;
+import org.apache.commons.lang3.tuple.Triple;
+import org.springframework.web.bind.annotation.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.txz.core.ServiceException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
+
+import static com.txz.cif.core.AbstractApiController.X_CLIENT_TOKEN;
+
+/**
+* Created by CodeGenerator on 2025/07/15.
+*/
+@Api(tags = "[api]提现管理")
+@RestController
+@RequestMapping("/api/withdraw/record")
+public class WithdrawRecordApiController {
+
+	private static Logger log = LoggerFactory.getLogger(WithdrawRecordApiController.class);
+
+    @Resource
+    private WithdrawRecordService withdrawRecordService;
+
+	@Resource
+	private SequenceService sequenceService;
+
+	@Resource
+	private AuthService authService;
+
+	@Resource
+	private AccountService accountService;
+
+	@Resource
+	private OperatingConfigDubboServiceClient operatingConfigDubboServiceClient;
+
+    @PostMapping("/add")
+	@ApiOperation(value = "新增提现订单",httpMethod = "POST")
+    public Result add(@RequestBody WithdrawParam param,@RequestHeader(value = X_CLIENT_TOKEN,required = false) String token) {
+    	if(param == null){
+    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
+    	}
+    	try {
+
+			Triple<Boolean, String, Claims> result = authService.verifyToken(token);
+
+			if (!result.getLeft()) {
+				// token无效
+				String errorMsg = result.getMiddle();
+				// 处理错误情况...
+				return ResultGenerator.genFailResult(ResultCode.OAUTH_INVALID_ACCESS_TOKEN);
+			}
+			Claims claims = result.getRight();
+			Long userId = Long.valueOf(claims.get("userId").toString());
+			com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode("join_red_envelope_rate");
+			String rate = openRedEnvelopeRate.getData().getValueInfo();
+			BigDecimal fee = param.getAmount().multiply(new BigDecimal(rate)).divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN);
+
+			String orderNo = sequenceService.genSerialNumber("withdraw_rule",null);
+
+
+
+			WithdrawRecord withdrawRecord = new WithdrawRecord();
+			withdrawRecord.setOrderNo(orderNo);
+			withdrawRecord.setStatus(1);
+			withdrawRecord.setTransTime(DateUtil.date());
+			withdrawRecord.setUserId(userId);
+			withdrawRecord.setAccountType(param.getAccountType());
+			withdrawRecord.setFee(fee);
+			withdrawRecord.setChannel(param.getChannel());
+			withdrawRecord.setCurrency(param.getCurrency());
+			withdrawRecord.setAmount(param.getAmount());
+    		withdrawRecord.setCreateTime(DateUtil.date());
+    		withdrawRecordService.add(withdrawRecord);
+			return ResultGenerator.genSuccessResult(withdrawRecord);
+		} catch (Exception e) {
+			log.error("新增对象操作异常e:{}",e);
+			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+		}
+
+    }
+
+    @GetMapping("/delete")
+	@ApiOperation(value = "withdrawRecord删除",httpMethod = "GET")
+    public Result delete(@RequestParam Integer id) {
+    	if(id == null){
+    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
+    	}
+    	try {
+    		withdrawRecordService.deleteById(id);
+		} catch (Exception e) {
+			log.error("删除对象操作异常e:{}",e);
+			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+		}
+        return ResultGenerator.genSuccessResult();
+    }
+
+    @PostMapping("/update")
+	@ApiOperation(value = "withdrawRecord更新",httpMethod = "POST")
+    public Result update(@RequestBody WithdrawRecord withdrawRecord) {
+    	if(withdrawRecord == null){
+    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
+    	}
+    	if(withdrawRecord.getId() == null){
+    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
+    	}
+    	try {
+    //		withdrawRecord.setUpdateTime(new Date());
+    //		withdrawRecord.setUpdateUserId(userId);
+    		withdrawRecordService.update(withdrawRecord);
+		} catch (Exception e) {
+			log.error("更新对象操作异常e:{}",e);
+			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+		}
+        return ResultGenerator.genSuccessResult();
+    }
+
+    @GetMapping("/detail")
+	@ApiOperation(value = "withdrawRecord获取详情",httpMethod = "GET")
+    public Result<WithdrawRecord> detail(@RequestParam Integer id) {
+    	if(id == null){
+    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
+    	}
+
+    	WithdrawRecord withdrawRecord = null;
+    	try {
+    		withdrawRecord = withdrawRecordService.findById(id);
+		} catch (Exception e) {
+			log.error("查询对象操作异常e:{}",e);
+			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+		}
+
+        return ResultGenerator.genSuccessResult(withdrawRecord);
+    }
+
+    @PostMapping("/list")
+	@ApiOperation(value = "withdrawRecord获取列表",httpMethod = "POST")
+    public Result<List<WithdrawRecord>> list(@RequestBody WithdrawRecord withdrawRecord, @RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "0") Integer size) {
+
+        PageHelper.startPage(page, size);
+
+        Condition condition = new Condition(withdrawRecord.getClass());
+        Criteria criteria = condition.createCriteria();
+//        criteria.andEqualTo("name", city.getName());
+		PageInfo pageInfo = null;
+		try {
+    		 List<WithdrawRecord> list = withdrawRecordService.findByCondition(condition);
+    		 pageInfo = new PageInfo(list);
+		} catch (Exception e) {
+			log.error("查询对象操作异常e:{}",e);
+			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+		}
+        return ResultGenerator.genSuccessResult(pageInfo);
+    }
+}

+ 0 - 51
cif-service/src/main/java/com/txz/cif/web/mng/RechargeRecordController.java

@@ -35,58 +35,7 @@ public class RechargeRecordController {
     @Resource
     private RechargeRecordService rechargeRecordService;
 
-    @PostMapping("/add")
-	@ApiOperation(value = "rechargeRecord新增",httpMethod = "POST")
-    public Result add(@RequestBody RechargeRecord rechargeRecord) {
-    	if(rechargeRecord == null){
-    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-    	}
-    	try {
-    //		rechargeRecord.setCreateTime(new Date());
-    //		rechargeRecord.setCreateUserId(userId);
-    		rechargeRecordService.save(rechargeRecord);
-		} catch (Exception e) {
-			log.error("新增对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
 
-        return ResultGenerator.genSuccessResult(rechargeRecord);
-    }
-
-    @GetMapping("/delete")
-	@ApiOperation(value = "rechargeRecord删除",httpMethod = "GET")
-    public Result delete(@RequestParam Integer id) {
-    	if(id == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-    	try {
-    		rechargeRecordService.deleteById(id);
-		} catch (Exception e) {
-			log.error("删除对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-        return ResultGenerator.genSuccessResult();
-    }
-
-    @PostMapping("/update")
-	@ApiOperation(value = "rechargeRecord更新",httpMethod = "POST")
-    public Result update(@RequestBody RechargeRecord rechargeRecord) {
-    	if(rechargeRecord == null){
-    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-    	}
-    	if(rechargeRecord.getId() == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-    	try {
-    //		rechargeRecord.setUpdateTime(new Date());
-    //		rechargeRecord.setUpdateUserId(userId);
-    		rechargeRecordService.update(rechargeRecord);
-		} catch (Exception e) {
-			log.error("更新对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-        return ResultGenerator.genSuccessResult();
-    }
 
     @GetMapping("/detail")
 	@ApiOperation(value = "rechargeRecord获取详情",httpMethod = "GET")

+ 0 - 51
cif-service/src/main/java/com/txz/cif/web/mng/RedEnvelopeController.java

@@ -35,58 +35,7 @@ public class RedEnvelopeController {
     @Resource
     private RedEnvelopeService redEnvelopeService;
 
-    @PostMapping("/add")
-	@ApiOperation(value = "redEnvelope新增",httpMethod = "POST")
-    public Result add(@RequestBody RedEnvelope redEnvelope) {
-    	if(redEnvelope == null){
-    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-    	}
-    	try {
-    //		redEnvelope.setCreateTime(new Date());
-    //		redEnvelope.setCreateUserId(userId);
-    		redEnvelopeService.save(redEnvelope);
-		} catch (Exception e) {
-			log.error("新增对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
 
-        return ResultGenerator.genSuccessResult(redEnvelope);
-    }
-
-    @GetMapping("/delete")
-	@ApiOperation(value = "redEnvelope删除",httpMethod = "GET")
-    public Result delete(@RequestParam Integer id) {
-    	if(id == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-    	try {
-    		redEnvelopeService.deleteById(id);
-		} catch (Exception e) {
-			log.error("删除对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-        return ResultGenerator.genSuccessResult();
-    }
-
-    @PostMapping("/update")
-	@ApiOperation(value = "redEnvelope更新",httpMethod = "POST")
-    public Result update(@RequestBody RedEnvelope redEnvelope) {
-    	if(redEnvelope == null){
-    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-    	}
-    	if(redEnvelope.getId() == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-    	try {
-    //		redEnvelope.setUpdateTime(new Date());
-    //		redEnvelope.setUpdateUserId(userId);
-    		redEnvelopeService.update(redEnvelope);
-		} catch (Exception e) {
-			log.error("更新对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-        return ResultGenerator.genSuccessResult();
-    }
 
     @GetMapping("/detail")
 	@ApiOperation(value = "redEnvelope获取详情",httpMethod = "GET")

+ 0 - 51
cif-service/src/main/java/com/txz/cif/web/mng/WithdrawRecordController.java

@@ -35,58 +35,7 @@ public class WithdrawRecordController {
     @Resource
     private WithdrawRecordService withdrawRecordService;
 
-    @PostMapping("/add")
-	@ApiOperation(value = "withdrawRecord新增",httpMethod = "POST")
-    public Result add(@RequestBody WithdrawRecord withdrawRecord) {
-    	if(withdrawRecord == null){
-    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-    	}
-    	try {
-    //		withdrawRecord.setCreateTime(new Date());
-    //		withdrawRecord.setCreateUserId(userId);
-    		withdrawRecordService.save(withdrawRecord);
-		} catch (Exception e) {
-			log.error("新增对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
 
-        return ResultGenerator.genSuccessResult(withdrawRecord);
-    }
-
-    @GetMapping("/delete")
-	@ApiOperation(value = "withdrawRecord删除",httpMethod = "GET")
-    public Result delete(@RequestParam Integer id) {
-    	if(id == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-    	try {
-    		withdrawRecordService.deleteById(id);
-		} catch (Exception e) {
-			log.error("删除对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-        return ResultGenerator.genSuccessResult();
-    }
-
-    @PostMapping("/update")
-	@ApiOperation(value = "withdrawRecord更新",httpMethod = "POST")
-    public Result update(@RequestBody WithdrawRecord withdrawRecord) {
-    	if(withdrawRecord == null){
-    		return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-    	}
-    	if(withdrawRecord.getId() == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-    	try {
-    //		withdrawRecord.setUpdateTime(new Date());
-    //		withdrawRecord.setUpdateUserId(userId);
-    		withdrawRecordService.update(withdrawRecord);
-		} catch (Exception e) {
-			log.error("更新对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-        return ResultGenerator.genSuccessResult();
-    }
 
     @GetMapping("/detail")
 	@ApiOperation(value = "withdrawRecord获取详情",httpMethod = "GET")

+ 40 - 0
cif-service/src/main/java/com/txz/cif/web/para/WithdrawParam.java

@@ -0,0 +1,40 @@
+package com.txz.cif.web.para;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import javax.persistence.*;
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel(value="提现入参")
+public class WithdrawParam {
+
+    /**
+     * 交易金额
+     */
+    @ApiModelProperty(value="amount交易金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value="账户类型 1钱包账户 2收益账户")
+    private Integer accountType;
+
+    /**
+     * 渠道
+     */
+    @ApiModelProperty(value="channel渠道")
+    private String channel;
+
+    /**
+     * 币种
+     */
+    @ApiModelProperty(value="currency币种")
+    private String currency;
+
+
+}

+ 1 - 1
cif-service/src/main/resources/mapper/AccountFreezdMapper.xml

@@ -7,7 +7,7 @@
     -->
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="account_id" jdbcType="BIGINT" property="accountId" />
-    <result column="flow_id" jdbcType="BIGINT" property="flowId" />
+    <result column="biz_id" jdbcType="BIGINT" property="bizId" />
     <result column="amount" jdbcType="DECIMAL" property="amount" />
     <result column="unfreeze_amount" jdbcType="DECIMAL" property="unfreezeAmount" />
     <result column="status" jdbcType="INTEGER" property="status" />

+ 1 - 0
cif-service/src/main/resources/mapper/WithdrawRecordMapper.xml

@@ -11,6 +11,7 @@
     <result column="amount" jdbcType="DECIMAL" property="amount" />
     <result column="fee" jdbcType="DECIMAL" property="fee" />
     <result column="status" jdbcType="INTEGER" property="status" />
+    <result column="account_type" jdbcType="INTEGER" property="accountType" />
     <result column="channel" jdbcType="VARCHAR" property="channel" />
     <result column="currency" jdbcType="VARCHAR" property="currency" />
     <result column="user_name" jdbcType="VARCHAR" property="userName" />