Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

yubin 2 долоо хоног өмнө
parent
commit
f1b05a6f31

+ 20 - 0
cif-service/src/main/java/com/txz/cif/dao/WithdrawRecordMapper.java

@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Select;
 
 import java.math.BigDecimal;
 import java.util.HashMap;
+import java.util.Map;
 
 public interface WithdrawRecordMapper extends Mapper<WithdrawRecord> {
 
@@ -14,4 +15,23 @@ public interface WithdrawRecordMapper extends Mapper<WithdrawRecord> {
 
     @Select("SELECT SUM(amount) FROM   c_withdraw_record WHERE status = #{status} and create_time > #{startTime} and create_time < #{endTime}")
     BigDecimal sumByStatus(HashMap map);
+
+    @Select("<script>" +
+            "SELECT SUM(amount) FROM c_withdraw_record " +
+            "<where> 1 = 1 " +
+            "<if test='channel != null'>AND channel = #{channel}</if>" +
+            "<if test='bank != null'>AND bank = #{bank}</if>" +
+            "<if test='userName != null'>AND user_name = #{userName}</if>" +
+            "<if test='userPhone != null'>AND user_phone = #{userPhone}</if>" +
+            "<if test='orderNo != null'>AND order_no = #{orderNo}</if>" +
+            "<if test='status != null'>AND status = #{status}</if>" +
+            "<if test='accountType != null'>AND account_type = #{accountType}</if>" +
+            "<if test='startTime != null'>AND create_time > #{startTime}</if>" +
+            "<if test='endTime != null'>AND #{endTime} > create_time </if>" +
+            "<if test='startSuccessTime != null'>AND success_time > #{startSuccessTime}</if>" +
+            "<if test='endSuccessTime != null'>AND #{endSuccessTime} > success_time  </if>" +
+
+            "</where>" +
+            "</script>")
+    BigDecimal sumByMap(HashMap map);
 }

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

@@ -6,6 +6,7 @@ import com.txz.cif.core.Service;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Map;
 
 
 /**
@@ -24,4 +25,6 @@ public interface WithdrawRecordService extends Service<WithdrawRecord> {
     Integer countByUserId(HashMap map);
 
     BigDecimal sumByStatus(HashMap map);
+
+    BigDecimal sumByMap(HashMap<String, String> map);
 }

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

@@ -3,6 +3,8 @@ 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 cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.txz.cif.configurer.LocalUtil;
 import com.txz.cif.constants.MyConstants;
 import com.txz.cif.core.AbstractService;
@@ -69,7 +71,7 @@ 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(BizTypeEnum.FREEZE.getKey())
                     .bizNo(param.getBizNo()).createTime(today).updateTime(today).transTime(param.getTransTime())
                     .debitAccount(account.getId()).creditAccount(account.getId())
                     .bizId(param.getBizId()).type(4).userId(param.getUserId())
@@ -78,7 +80,7 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
             accountService.deal(AccountFlow.builder().accountId(account.getId()).amount(flow.getAmount())
                     .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());
+                    .flowType(4).type(1).bizType(BizTypeEnum.FREEZE.getKey()).flowId(flow.getId()).build());
             AccountFreezd freezd = AccountFreezd
                     .builder()
                     .userId(param.getUserId())
@@ -359,7 +361,8 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
     
     @Override
     public Result withdraw(WithdrawParam param) {
-        
+//        log.error("withdraw : " + JSONUtil.toJsonStr(param));
+
         Account account = accountService.getAccount(param.getUserId(), param.getAccountType());
         if (account == null) {
             return Result.genFailResult(LocalUtil.get("account.not.found"));
@@ -384,7 +387,7 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
                 .type(3)
                 .build();
         saveUseGeneratedKeys(flow);
-        
+//        log.error("withdraw flowId: " + flow.getId() + " amount :"+param.getAmount().subtract(param.getFee()).toPlainString());
         // 借 :客户资金账户xx元 客户账号(负债类:贷方账户)-钱
         accountService.deal(AccountFlow.builder().accountId(account.getId()).amount(flow.getAmount())
                 .bizId(flow.getBizId()).aliases(account.getAliases()).transTime(param.getTransTime())
@@ -414,18 +417,19 @@ public class FlowServiceImpl extends AbstractService<Flow> implements FlowServic
                 .bizId(param.getBizId()).type(6)
                 .build();
         saveUseGeneratedKeys(flow2);
+//        log.error("withdraw flowId2: " + flow2.getId());
         // 借:个人账户钱包(贷)     -500元
         accountService.deal(AccountFlow.builder().accountId(account.getId()).amount(flow2.getAmount())
                 .bizId(flow2.getBizId()).aliases(account.getAliases()).transTime(param.getTransTime())
                 .bizNo(flow2.getBizNo()).balance(account.getBalance().subtract(flow2.getAmount()))
                 .freezeAmount(account.getFreezeAmount()).userId(flow2.getUserId())
-                .flowType(6).type(1).bizType(param.getBizType()).flowId(flow2.getId()).build());
+                .flowType(6).type(1).bizType(flow2.getBizType()).flowId(flow2.getId()).build());
         // 贷:平台主营收入(贷)   +500元
         accountService.deal(AccountFlow.builder().accountId(MyConstants.INNER_INCOME).amount(flow2.getAmount())
                 .bizId(flow2.getBizId()).aliases(innerIncomeAccount.getAliases()).transTime(param.getTransTime())
                 .bizNo(flow2.getBizNo()).balance(innerIncomeAccount.getBalance().add(flow2.getAmount()))
                 .freezeAmount(innerIncomeAccount.getFreezeAmount()).userId(flow2.getUserId())
-                .flowType(6).type(2).bizType(param.getBizType()).flowId(flow2.getId()).build());
+                .flowType(6).type(2).bizType(flow2.getBizType()).flowId(flow2.getId()).build());
 
         return Result.genSuccessResult();
     }

+ 30 - 10
cif-service/src/main/java/com/txz/cif/service/impl/WithdrawRecordServiceImpl.java

@@ -3,6 +3,7 @@ package com.txz.cif.service.impl;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.lock.LockInfo;
@@ -18,11 +19,13 @@ import com.txz.cif.dto.Result;
 import com.txz.cif.dto.tfpay.TFWithdrawDTO;
 import com.txz.cif.enums.AccountFreezdTypeEnum;
 import com.txz.cif.enums.BizTypeEnum;
-import com.txz.cif.model.*;
-import com.txz.cif.web.para.FreezdParam;
+import com.txz.cif.model.BizLog;
+import com.txz.cif.model.PaymentChannel;
+import com.txz.cif.model.User;
+import com.txz.cif.model.WithdrawRecord;
 import com.txz.cif.param.WithdrawParam;
 import com.txz.cif.service.*;
-import com.txz.cif.util.TFPayUtil;
+import com.txz.cif.web.para.FreezdParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,7 +34,6 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.Map;
 
 
 /**
@@ -72,11 +74,11 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
     public void add(WithdrawRecord withdrawRecord) {
         saveUseGeneratedKeys(withdrawRecord);
         // 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())
+                .amount(withdrawRecord.getAmount()).bizType(BizTypeEnum.FREEZE.getKey())
                 .bizId(withdrawRecord.getId() + "")
                 .bizNo(withdrawRecord.getOrderNo())
                 .transTime(withdrawRecord.getTransTime())
@@ -105,15 +107,15 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
                 }
                 switch (paymentChannel.getChannelName()) {
                     case "TFPAY":
-                        Map<String, Object> payMentChannelMap = TFPayUtil.convertObjectToMap(paymentChannel);
+//                        Map<String, Object> payMentChannelMap = TFPayUtil.convertObjectToMap(paymentChannel);
                         BizLogDTO bizLog = tfPayService.withdraw(
                                 TFWithdrawDTO.builder()
                                         .payMemberid(paymentChannel.getMerchantNum())
                                         .payOrderid(thirdOrderNo)
                                         .payApplydate(now.toString())
-                                        // 如需测试改成502
+                                        // fixme 如需测试改成502
                                         // .payChannelcode("502")
-                                        .payChannelcode(payMentChannelMap.get(w.getChannel().toLowerCase() + "WithdrawCode").toString())
+                                        .payChannelcode(getPayChannelcode(w.getBank(),paymentChannel))
                                         .payNotifyurl(paymentChannel.getWithdrawNotifyUrl())
                                         .payAmount(w.getAmount().subtract(w.getFee()).toString())
                                         .payProductname("提现")
@@ -165,7 +167,20 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
         this.update(WithdrawRecord.builder().id(w.getId())
                 .review(review).updateUser(userName).status(status).build());
     }
-    
+
+    private String getPayChannelcode(String channel, PaymentChannel paymentChannel) {
+        if (StrUtil.equals(channel.toLowerCase(),"bkash")){
+            return paymentChannel.getBkashWithdrawCode();
+        }
+        if (StrUtil.equals(channel.toLowerCase(),"nagad")){
+            return paymentChannel.getNagadWithdrawCode();
+        }
+        if (StrUtil.equals(channel.toLowerCase(),"rocket")){
+            return paymentChannel.getRocketWithdrawCode();
+        }
+        return "";
+    }
+
     @Override
     public void success(WithdrawRecord record, Date successTime) {
         if (record.getFreezeId() != null) {
@@ -201,4 +216,9 @@ public class WithdrawRecordServiceImpl extends AbstractService<WithdrawRecord> i
     public BigDecimal sumByStatus(HashMap map) {
         return withdrawRecordMapper.sumByStatus(map);
     }
+
+    @Override
+    public BigDecimal sumByMap(HashMap<String, String> map) {
+        return withdrawRecordMapper.sumByMap(map);
+    }
 }

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

@@ -204,6 +204,7 @@ public class RechargeRecordApiController {
                     .bank(user.getBank())
                     .methodId(methodId)
                     .channelId(paymentChannel == null ? null : paymentChannel.getId())
+                    .channel(paymentChannel == null ? null : paymentChannel.getChannelName())
                     .bankAccount(user.getBankAccount())
                     .bankAccountName(user.getBankAccountName())
                     .orderNo(orderNo)

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

@@ -169,7 +169,7 @@ public class UserApiController extends AbstractApiController {
                 if (user == null) {
                     return ResultGenerator.genFailResult(ResultCode.USER_IS_NULL);
                 }
-                if (user.getStatus() != 1) {
+                if (user.getStatus() != 1 || user.getHasLogin() == 2) {
                     return ResultGenerator.genFailResult(ResultCode.USER_STATUS_IS_ERROR);
                 }
                 String token = authService.buildJwtToken(user.getId());

+ 8 - 3
cif-service/src/main/java/com/txz/cif/web/WithdrawRecordApiController.java

@@ -140,8 +140,13 @@ public class WithdrawRecordApiController {
             if (param.getAmount().compareTo(new BigDecimal(20000)) > 0) {
                 return ResultGenerator.genFailResult(ResultCode.AMOUNT_OUT_MAX);
             }
-            
-            com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode("withdraw_rate");
+            String key = "";
+            if (param.getAccountType() == 1){
+                key = "withdraw_rate";
+            } else {
+                key = "earning_withdraw_rate";
+            }
+            com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode(key);
             String rate = openRedEnvelopeRate.getData().getValueInfo();
             BigDecimal fee = param.getAmount().multiply(new BigDecimal(rate)).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN);
             
@@ -167,7 +172,7 @@ public class WithdrawRecordApiController {
             withdrawRecord.setBank(user.getBank());
             withdrawRecord.setBankAccount(user.getBankAccount());
             withdrawRecord.setBankAccountName(user.getBankAccountName());
-            // withdrawRecord.setChannel(param.getChannel());
+//             withdrawRecord.setChannel(param.getChannel());
             withdrawRecord.setCurrency(param.getCurrency());
             withdrawRecord.setAmount(param.getAmount());
             withdrawRecord.setCreateTime(DateUtil.date());

+ 50 - 2
cif-service/src/main/java/com/txz/cif/web/mng/WithdrawRecordController.java

@@ -21,6 +21,7 @@ import com.txz.cif.service.WithdrawRecordService;
 import com.txz.cif.web.bo.WithdrawRecordBO;
 import com.txz.cif.web.para.RecordParam;
 import com.txz.cif.web.para.ReviewParam;
+import com.txz.cif.web.vo.ListVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -32,8 +33,12 @@ import tk.mybatis.mapper.entity.Example.Criteria;
 import javax.annotation.Resource;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by CodeGenerator on 2025/07/15.
@@ -122,54 +127,97 @@ public class WithdrawRecordController {
     
     @PostMapping("/list")
     @ApiOperation(value = "withdrawRecord获取列表", httpMethod = "POST")
-    public Result<List<WithdrawRecord>> list(@RequestBody RecordParam param) {
+    public Result<ListVO<PageInfo<WithdrawRecord>>> list(@RequestBody RecordParam param) {
         
         PageHelper.startPage(param.getPage(), param.getSize());
         
         Condition condition = new Condition(WithdrawRecord.class);
         Criteria criteria = condition.createCriteria();
+        HashMap<String,String> map = new HashMap<>();
         if (StrUtil.isNotBlank(param.getChannel())) {
             criteria.andEqualTo("channel", param.getChannel());
+            map.put("channel", param.getChannel());
         }
         if (StrUtil.isNotBlank(param.getMethodName())) {
             criteria.andEqualTo("bank", param.getMethodName());
+            map.put("bank", param.getMethodName());
         }
         if (StrUtil.isNotBlank(param.getUserName())) {
             criteria.andEqualTo("userName", param.getUserName());
+            map.put("userName", param.getUserName());
         }
         if (StrUtil.isNotBlank(param.getUserPhone())) {
             criteria.andEqualTo("userPhone", param.getUserPhone());
+            map.put("userPhone", param.getUserPhone());
         }
         if (StrUtil.isNotBlank(param.getOrderNo())) {
             criteria.andEqualTo("orderNo", param.getOrderNo());
+            map.put("orderNo", param.getOrderNo());
+
         }
         if (param.getStatus() != null) {
             criteria.andEqualTo("status", param.getStatus());
+            map.put("status", param.getStatus()+"");
         }
         if (param.getAccountType() != null) {
             criteria.andEqualTo("accountType", param.getAccountType());
+            map.put("accountType", param.getAccountType()+"");
         }
         if (param.getTimeType() != null) {
             if (param.getTimeType() == 1) {
                 if (StrUtil.isNotBlank(param.getStartTime())) {
                     criteria.andBetween("createTime", param.getStartTime(), param.getEndTime());
+                    map.put("startTime", param.getStartTime());
+                    map.put("endTime", param.getEndTime());
                 }
             } else if (param.getTimeType() == 2) {
                 if (StrUtil.isNotBlank(param.getStartTime())) {
                     criteria.andBetween("successTime", param.getStartTime(), param.getEndTime());
+                    map.put("startSuccessTime", param.getStartTime());
+                    map.put("endSuccessTime", param.getEndTime());
                 }
             }
         }
+        ListVO<PageInfo<WithdrawRecord>> vo = new ListVO();
+
         PageInfo pageInfo = null;
         try {
             condition.setOrderByClause("create_time desc");
             List<WithdrawRecord> list = withdrawRecordService.findByCondition(condition);
             pageInfo = new PageInfo(list);
+            vo.setList(pageInfo);
+            Integer num = withdrawRecordService.countByCondition(condition);
+            if (num == null){
+                num=0;
+            }
+            vo.setOrderNum(num);
+            BigDecimal amount = withdrawRecordService.sumByMap(map);
+            if (amount == null){
+                amount=BigDecimal.ZERO;
+            }
+            vo.setOrderAmount(amount);
+            criteria.andEqualTo("status", 4);
+            map.put("status", "4");
+            Integer successNum = withdrawRecordService.countByCondition(condition);
+            if (successNum == null){
+                successNum=0;
+            }
+            vo.setSuccessNum(successNum);
+            BigDecimal successAmount = withdrawRecordService.sumByMap(map);
+            if (successAmount == null){
+                successAmount=BigDecimal.ZERO;
+            }
+            vo.setSuccessAmount(successAmount);
+            BigDecimal successRate = BigDecimal.ZERO;
+            if (num != 0){
+                successRate=BigDecimal.valueOf(successNum).divide(BigDecimal.valueOf(num),2, RoundingMode.DOWN);
+            }
+            vo.setSuccessRate(successRate);
+            return ResultGenerator.genSuccessResult(vo);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);
             return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
         }
-        return ResultGenerator.genSuccessResult(pageInfo);
     }
     
     @GetMapping("/report")

+ 54 - 0
cif-service/src/main/java/com/txz/cif/web/vo/ListVO.java

@@ -0,0 +1,54 @@
+package com.txz.cif.web.vo;
+
+import com.alibaba.nacos.api.annotation.NacosApi;
+import com.github.pagehelper.PageInfo;
+import com.txz.cif.model.WithdrawRecord;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/2
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ListVO<T> {
+    
+    /**
+     * 订单数
+     */
+    private Integer orderNum;
+
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderAmount;
+
+    /**
+     * 成功订单数
+     */
+    private Integer successNum;
+
+    /**
+     * 成功金额
+     */
+    private BigDecimal successAmount;
+
+    /**
+     * 成功率
+     */
+    private BigDecimal successRate;
+    
+    /**
+     * 支付连接
+     */
+    private PageInfo<T> list;
+    
+}