Mr.qian il y a 3 semaines
Parent
commit
572d1429ce

+ 1 - 1
cif-service/src/main/java/com/txz/cif/dao/AccountFreezdMapper.java

@@ -9,7 +9,7 @@ import java.math.BigDecimal;
 
 public interface AccountFreezdMapper extends Mapper<AccountFreezd> {
     
-    @Select("SELECT SUM(amount) - SUM(unfreeze_amount) FROM c_account_freezd WHERE type = 2 AND user_id = #{userId}")
+    @Select("SELECT IFNULL(SUM(amount), 0) - IFNULL(SUM(unfreeze_amount), 0) FROM c_account_freezd WHERE type = 2 AND status IN (1,2) AND user_id = #{userId} ")
     BigDecimal sumFreezdForRefundByUserId(@Param("userId") Long userId);
     
 }

+ 33 - 13
cif-service/src/main/java/com/txz/cif/service/FlowService.java

@@ -1,4 +1,5 @@
 package com.txz.cif.service;
+
 import com.txz.cif.dto.Result;
 import com.txz.cif.model.Flow;
 import com.txz.cif.core.Service;
@@ -6,60 +7,79 @@ import com.txz.cif.model.RedEnvelope;
 import com.txz.cif.param.*;
 import com.txz.cif.web.para.FreezdParam;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 
 /**
  * Created by CodeGenerator on 2022/11/02.
  */
 public interface FlowService extends Service<Flow> {
-
-
+    
+    
     /**
      * 冻结
+     *
      * @param param
+     *
      * @return 流水号
      */
     Result freeze(FreezdParam param);
-
+    
     /**
      * 解冻(全额解冻)
+     *
      * @param freezdId
      */
     Result unFreeze(Long freezdId);
-
+    
     /**
      * 充值
+     *
      * @param param
+     *
      * @return
      */
     Result recharge(RechargeParam param);
-
+    
     /**
      * 支付
+     *
      * @param param
+     *
      * @return
      */
     Result pay(PayParam param);
-
+    
     /**
      * 退款
+     *
      * @param param
+     *
      * @return
      */
     Result refund(RefundParam param);
-
-
-
+    
+    
     /**
      * 提现
+     *
      * @param param
+     *
      * @return
      */
     Result withdraw(WithdrawParam param);
-
-
+    
+    
     Result settle(RedEnvelope redEnvelope);
-
-
+    
+    
     Integer countByUserId(HashMap map);
+    
+    /**
+     * 部分解冻
+     */
+    BigDecimal partialThaw(Long id, BigDecimal partialThawAmount);
+    
+    void unfreezeRefund();
+    
 }

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

@@ -1,29 +1,38 @@
 package com.txz.cif.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.txz.cif.configurer.LocalUtil;
 import com.txz.cif.constants.MyConstants;
+import com.txz.cif.core.AbstractService;
 import com.txz.cif.core.ServiceException;
 import com.txz.cif.dao.FlowMapper;
 import com.txz.cif.dto.Result;
+import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
 import com.txz.cif.enums.AccountFreezdTypeEnum;
 import com.txz.cif.enums.BizTypeEnum;
 import com.txz.cif.model.*;
-import com.txz.cif.param.*;
+import com.txz.cif.param.PayParam;
+import com.txz.cif.param.RechargeParam;
+import com.txz.cif.param.RefundParam;
+import com.txz.cif.param.WithdrawParam;
 import com.txz.cif.service.AccountFlowService;
 import com.txz.cif.service.AccountFreezdService;
 import com.txz.cif.service.AccountService;
 import com.txz.cif.service.FlowService;
-import com.txz.cif.core.AbstractService;
 import com.txz.cif.web.para.FreezdParam;
+import com.txz.operating.dto.ConfigDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import tk.mybatis.mapper.entity.Condition;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * Created by CodeGenerator on 2022/11/02.
@@ -44,6 +53,9 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
     @Resource
     private AccountFreezdService accountFreezdService;
     
+    @Resource
+    private OperatingConfigDubboServiceClient operatingConfigDubboServiceClient;
+    
     @Override
     public Result freeze(FreezdParam param) {
         try {
@@ -66,9 +78,19 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
                     .bizId(flow.getBizId()).aliases(account.getAliases()).transTime(param.getTransTime()).userId(flow.getUserId())
                     .bizNo(flow.getBizNo()).balance(account.getBalance()).freezeAmount(account.getFreezeAmount().add(param.getAmount()))
                     .flowType(4).type(1).bizType(param.getBizType()).flowId(flow.getId()).build());
-            AccountFreezd freezd = AccountFreezd.builder().accountId(account.getId()).bizId(flow.getId())
-                    .amount(param.getAmount()).createTime(today).unfreezeAmount(BigDecimal.ZERO).type(param.getType())
-                    .updateTime(today).status(1).build();
+            AccountFreezd freezd = AccountFreezd
+                    .builder()
+                    .userId(param.getUserId())
+                    .accountId(account.getId())
+                    .bizId(flow.getId())
+                    .amount(param.getAmount())
+                    .createTime(today)
+                    .unfreezeAmount(BigDecimal.ZERO)
+                    .type(param.getType())
+                    .updateTime(today)
+                    .status(1)
+                    .unfreezeTime(param.getUnfreezeTime())
+                    .build();
             accountFreezdService.saveUseGeneratedKeys(freezd);
             return Result.genSuccessResult(freezd.getId());
         } catch (Exception e) {
@@ -221,17 +243,43 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
         
         // 冻结金额
         BigDecimal sumFreezdAmount = accountFreezdService.sumFreezdForRefundByUserId(param.getUserId());
-        if (account.getBalance().subtract(account.getFreezeAmount()).add(sumFreezdAmount).compareTo(param.getAmount()) == -1) {
-            return Result.genFailResult(LocalUtil.get("account.not.found"));
+        
+        if (sumFreezdAmount.compareTo(BigDecimal.ZERO) == 0) {
+            if (account.getBalance().subtract(account.getFreezeAmount()).add(sumFreezdAmount).compareTo(param.getAmount()) == -1) {
+                return Result.genFailResult(LocalUtil.get("account.not.found"));
+            }
+            Condition c = new Condition(AccountFreezd.class);
+            c.createCriteria()
+                    .andEqualTo("type", AccountFreezdTypeEnum.REFUND_FREEZE)
+                    .andIn("status", CollUtil.newArrayList(1, 2))
+                    .andEqualTo("userId", param.getUserId())
+            ;
+            c.setOrderByClause("create_time");
+            List<AccountFreezd> accounts = accountFreezdService.findByCondition(c);
+            if (CollectionUtil.isNotEmpty(accounts)) {
+                BigDecimal totalAmount = param.getAmount();
+                for (AccountFreezd accountFreezd : accounts) {
+                    totalAmount = partialThaw(accountFreezd.getId(), totalAmount);
+                    if (totalAmount.compareTo(BigDecimal.ZERO) == 0) {
+                        break;
+                    }
+                }
+            }
         }
         
         // 借:个人账户钱包(贷)     -500元
         // 贷:平台主营收入(贷)   +500元
         Date today = DateUtil.date();
-        Flow flow = Flow.builder().amount(param.getAmount()).bizType(param.getBizType())
+        Flow flow = Flow.builder().amount(param.getAmount())
+                .bizType(param.getBizType())
                 .userId(param.getUserId())
-                .bizNo(param.getBizNo()).createTime(today).updateTime(today).transTime(param.getTransTime())
-                .debitAccount(account.getId()).creditAccount(MyConstants.INNER_INCOME).createUser(param.getUserId() + "")
+                .bizNo(param.getBizNo())
+                .createTime(today)
+                .updateTime(today)
+                .transTime(param.getTransTime())
+                .debitAccount(account.getId())
+                .creditAccount(MyConstants.INNER_INCOME)
+                .createUser(param.getUserId() + "")
                 .bizId(param.getBizId()).type(6)
                 .build();
         saveUseGeneratedKeys(flow);
@@ -271,7 +319,13 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
                 .debitAccount(MyConstants.INNER_REFUND).creditAccount(account.getId())
                 .bizId(param.getBizId()).type(9).createUser(param.getUserId() + "")
                 .build();
+        
+        com.txz.operating.result.Result<ConfigDTO> refundFreezeTime = operatingConfigDubboServiceClient.getConfigByCode("refund_freeze_time");
+        int days = Integer.parseInt(refundFreezeTime.getData().getValueInfo());
+        Date unfreezeTime = DateUtil.offsetDay(new Date(), days);
+        
         freeze(FreezdParam.builder()
+                .userId(param.getUserId())
                 .accountType(account.getType())
                 .amount(param.getAmount())
                 .bizType(param.getBizType())
@@ -280,6 +334,7 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
                 .transTime(param.getTransTime())
                 .userId(param.getUserId())
                 .type(AccountFreezdTypeEnum.REFUND_FREEZE)
+                .unfreezeTime(unfreezeTime)
                 .build()
         );
         saveUseGeneratedKeys(flow);
@@ -311,11 +366,18 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
         }
         
         Date today = DateUtil.date();
-        Flow flow = Flow.builder().amount(param.getAmount()).bizType(param.getBizType())
+        Flow flow = Flow.builder()
+                .amount(param.getAmount())
+                .bizType(param.getBizType())
                 .userId(param.getUserId())
-                .bizNo(param.getBizNo()).createTime(today).updateTime(today).transTime(param.getTransTime())
-                .creditAccount(MyConstants.INNER_CAPITAL).debitAccount(account.getId())
-                .bizId(param.getBizId()).type(3)
+                .bizNo(param.getBizNo())
+                .createTime(today)
+                .updateTime(today)
+                .transTime(param.getTransTime())
+                .creditAccount(MyConstants.INNER_CAPITAL)
+                .debitAccount(account.getId())
+                .bizId(param.getBizId())
+                .type(3)
                 .build();
         saveUseGeneratedKeys(flow);
         
@@ -371,5 +433,40 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
         return cFlowMapper.countByUserId(map);
     }
     
+    @Override
+    public BigDecimal partialThaw(Long id, BigDecimal partialThawAmount) {
+        AccountFreezd accountFreezd = accountFreezdService.findById(id);
+        // 可用冻结金额
+        BigDecimal canUseAmount = accountFreezd.getAmount().subtract(accountFreezd.getUnfreezeAmount());
+        // 可用金额小于等于总金额
+        if (canUseAmount.compareTo(partialThawAmount) != 1) {
+            accountFreezd.setStatus(3);
+            accountFreezd.setUnfreezeAmount(accountFreezd.getAmount());
+            accountFreezd.setUpdateTime(new Date());
+            accountFreezdService.update(accountFreezd);
+            return partialThawAmount.subtract(canUseAmount);
+        } else {
+            accountFreezd.setStatus(2);
+            accountFreezd.setUnfreezeAmount(accountFreezd.getUnfreezeAmount().add(partialThawAmount));
+            accountFreezd.setUpdateTime(new Date());
+            accountFreezdService.update(accountFreezd);
+            return BigDecimal.ZERO;
+        }
+    }
+    
+    @Override
+    public void unfreezeRefund() {
+        Condition c = new Condition(AccountFreezd.class);
+        c.createCriteria()
+                .andEqualTo("type", AccountFreezdTypeEnum.REFUND_FREEZE)
+                .andIn("status", CollUtil.newArrayList(1, 2))
+                .andLessThanOrEqualTo("unfreezeTime", new Date())
+        ;
+        List<AccountFreezd> accounts = accountFreezdService.findByCondition(c);
+        for (AccountFreezd accountFreezd : accounts) {
+            unFreeze(accountFreezd.getId());
+        }
+    }
+    
     
 }

+ 4 - 2
cif-service/src/main/java/com/txz/cif/service/impl/WithdrawRecordServiceImpl.java

@@ -71,9 +71,10 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
     @Override
     public void add(WithdrawRecord withdrawRecord) {
         saveUseGeneratedKeys(withdrawRecord);
-        Account account = accountService.getAccount(withdrawRecord.getUserId(), withdrawRecord.getAccountType());
+        // Account account = accountService.getAccount(withdrawRecord.getUserId(), withdrawRecord.getAccountType());
         // 冻结金额+手续费
         Result freeze = flowService.freeze(FreezdParam.builder()
+                .userId(withdrawRecord.getUserId())
                 .accountType(withdrawRecord.getAccountType())
                 .amount(withdrawRecord.getAmount().add(withdrawRecord.getFee())).bizType(BizTypeEnum.WITHDRAW.getKey())
                 .bizId(withdrawRecord.getId() + "")
@@ -171,7 +172,8 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
             flowService.unFreeze(record.getFreezeId());
         }
         flowService.withdraw(WithdrawParam.builder()
-                .accountType(record.getAccountType()).bizType(BizTypeEnum.WITHDRAW.getKey())
+                .accountType(record.getAccountType())
+                .bizType(BizTypeEnum.WITHDRAW.getKey())
                 .userId(record.getUserId())
                 .amount(record.getAmount())
                 .bizId(record.getId() + "")

+ 29 - 10
cif-service/src/main/java/com/txz/cif/task/GeneralJob.java

@@ -8,6 +8,7 @@ import com.txz.cif.configurer.Parameters;
 import com.txz.cif.dubbo.client.OrderDubboServiceClient;
 import com.txz.cif.model.RedEnvelope;
 import com.txz.cif.service.DayCutService;
+import com.txz.cif.service.FlowService;
 import com.txz.cif.service.RechargeRecordService;
 import com.txz.cif.service.RedEnvelopeService;
 import com.xxl.job.core.biz.model.ReturnT;
@@ -48,10 +49,13 @@ public class GeneralJob {
     
     @Resource
     private RechargeRecordService rechargeRecordService;
-
+    
     @Resource
     private RedEnvelopeService redEnvelopeService;
     
+    @Resource
+    private FlowService flowService;
+    
     /**
      * 日切
      */
@@ -67,11 +71,14 @@ public class GeneralJob {
         }
         return ReturnT.SUCCESS;
     }
-
+    
     /**
      * 结算
+     *
      * @param param
+     *
      * @return
+     *
      * @throws Exception
      */
     @XxlJob("settle")
@@ -79,13 +86,13 @@ public class GeneralJob {
         try {
             logger.info("【执行结算】开始");
             Condition c = new Condition(RedEnvelope.class);
-            c.createCriteria().andEqualTo("status",1).andLessThanOrEqualTo("settleTime", DateUtil.now());
+            c.createCriteria().andEqualTo("status", 1).andLessThanOrEqualTo("settleTime", DateUtil.now());
             List<RedEnvelope> redEnvelopes = redEnvelopeService.findByCondition(c);
-            if (CollUtil.isNotEmpty(redEnvelopes)){
-                for (RedEnvelope r: redEnvelopes){
+            if (CollUtil.isNotEmpty(redEnvelopes)) {
+                for (RedEnvelope r : redEnvelopes) {
                     try {
                         redEnvelopeService.settle(r);
-                    }catch (Exception e) {
+                    } catch (Exception e) {
                         logger.error("【执行结算】异常:e{}", e);
                         return ReturnT.FAIL;
                     }
@@ -112,7 +119,6 @@ public class GeneralJob {
         logger.error("[checkin]:" + ret);
         
         
-
         return ReturnT.SUCCESS;
     }
     
@@ -156,7 +162,7 @@ public class GeneralJob {
         }
         return ReturnT.SUCCESS;
     }
-
+    
     @XxlJob("activityStatusJudgmentTimedTask")
     public ReturnT<String> activityStatusJudgmentTimedTask(String param) throws Exception {
         try {
@@ -169,8 +175,8 @@ public class GeneralJob {
         }
         return ReturnT.SUCCESS;
     }
-
-
+    
+    
     @XxlJob("closeRecharge")
     public ReturnT<String> closeRecharge() throws Exception {
         try {
@@ -184,6 +190,19 @@ public class GeneralJob {
         return ReturnT.SUCCESS;
     }
     
+    @XxlJob("unfreezeRefund")
+    public ReturnT<String> unfreezeRefund() throws Exception {
+        try {
+            logger.info("【退款解冻】开始");
+            flowService.unfreezeRefund();
+            logger.info("【退款解冻】完成");
+        } catch (Exception e) {
+            logger.error("【退款解冻】异常:e{}", e);
+            return ReturnT.FAIL;
+        }
+        return ReturnT.SUCCESS;
+    }
+    
     public static void main(String[] args) {
         //        int quhao = 154;
         //        int weihao = 9642;

+ 2 - 0
cif-service/src/main/java/com/txz/cif/web/para/FreezdParam.java

@@ -65,6 +65,8 @@ public class FreezdParam implements Serializable {
      */
     private AccountFreezdTypeEnum type;
     
+    private Date unfreezeTime;
+    
     /**
      * c_flow
      */