igl hace 6 meses
padre
commit
e76e9bce02

+ 4 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/AssetClient.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.client;
 
 import com.chelvc.cloud.vehicle.client.dto.MerchantAssetDTO;
+import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -19,4 +20,7 @@ public interface AssetClient {
 
     @PostMapping(value = "/asset/withdraw/notify")
     void withdrawNotify(@RequestBody WithdrawNotifyParam param);
+
+    @PostMapping(value = "/asset/transfer/notify")
+    void transferNotify(@RequestBody TransferNotifyParam param);
 }

+ 10 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/constant/TradeConstant.java

@@ -26,4 +26,14 @@ public interface TradeConstant {
      * 被分账方入网
      */
     static final String DECLARE_URL = "https://apis.5upay.com/serviceprovider/declaration/declare";
+
+    /**
+     * 转账回调地址
+     */
+    static final String TRANSFER_NOTIFY_URL = "";
+
+    /**
+     * 转账地址
+     */
+    static final String TRANSFER_URL = "https://apis.5upay.com/transferAccount/order";
 }

+ 58 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/param/TransferNotifyParam.java

@@ -0,0 +1,58 @@
+package com.chelvc.cloud.vehicle.client.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 转账回调参数
+ */
+@Data
+public class TransferNotifyParam implements Serializable {
+
+    private static final long serialVersionUID = 3682560818657891605L;
+
+    /**
+     * 商户编号
+     */
+    private String merchantId;
+    /**
+     * 收款方编号
+     */
+    private String receiverId;
+    /**
+     * 订单编号
+     */
+    private String requestId;
+    /**
+     * 收款方类型
+     */
+    private String receiverType;
+    /**
+     * 转账金额:分
+     */
+    private String amount;
+    /**
+     * 币种
+     */
+    private String currency;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态
+     * SUCCESS 转账成功
+     * FAILED 转账失败
+     * CANCEL 转账取消
+     */
+    private String status;
+    /**
+     * 完成时间
+     */
+    private String completeDateTime;
+    /**
+     * 错误信息
+     */
+    private String errorMessage;
+}

+ 10 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/controller/AssetController.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.controller;
 
 import com.chelvc.cloud.vehicle.client.dto.MerchantAssetDTO;
+import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
 import com.chelvc.cloud.vehicle.server.service.AssetService;
@@ -39,4 +40,13 @@ public class AssetController {
     public void withdrawNotify(@RequestBody WithdrawNotifyParam param) {
         this.assetService.withdrawNotify(param);
     }
+
+    /**
+     * 转账回调接口
+     *
+     */
+    @PostMapping("/asset/transfer/notify")
+    public void transferNotify(@RequestBody TransferNotifyParam param) {
+        this.assetService.transferNotify(param);
+    }
 }

+ 4 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/MerchantAuth.java

@@ -33,6 +33,7 @@ public class MerchantAuth implements Entity<Long> {
     private String businessLicenseNumber; // 营业执照证件号
     private Date businessLicenseExpirationDate; // 营业执照有效期
     private String idCardNumber; // 身份证号
+    private Date idCardExpirationDateStart; // 身份证有效期开始时间
     private Date idCardExpirationDate; // 身份证有效期
     private String storeImage; // 店铺图
     private String legalRepresentativeName; // 法人姓名
@@ -52,6 +53,9 @@ public class MerchantAuth implements Entity<Long> {
     private String reviewer; // 审核人
     private String recommendationUser; // 推荐人
     private Date reviewTime; // 审核时间
+    private String accountName; // 开户名称
+    private String bankCardNo; // 开户账号
+    private String reservedPhoneNo; //银行预留手机号
 
     /**
      * 营业执照证件号

+ 3 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsWithdraw.java

@@ -43,6 +43,9 @@ public class OmsWithdraw extends ModifyEntity<Long>
     /** 提现渠道:1-首信易 */
     private Integer channel;
 
+    /** 0-提现;1-用户转账 */
+    private Integer flag;
+
     /** 提现金额 */
     private BigDecimal amount;
 

+ 5 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AssetService.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.service;
 
 import com.chelvc.cloud.vehicle.client.dto.MerchantAssetDTO;
+import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
 import com.chelvc.cloud.vehicle.server.entity.Asset;
@@ -34,4 +35,8 @@ public interface AssetService {
     void withdraw(WithdrawParam param);
 
     void withdrawNotify(WithdrawNotifyParam param);
+
+    void transferNotify(TransferNotifyParam param);
+
+    void transfer(Long sourceUserId, Long targetUserId, Integer type, BigDecimal amount);
 }

+ 1 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsWithdrawService.java

@@ -5,7 +5,7 @@ import com.chelvc.cloud.vehicle.server.entity.OmsWithdraw;
 import java.math.BigDecimal;
 
 public interface OmsWithdrawService {
-    Long createWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel);
+    Long createWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel, Integer flag);
 
     int updateStatusById(Long id, Integer status);
 

+ 122 - 12
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssetServiceImpl.java

@@ -9,6 +9,7 @@ import com.chelvc.cloud.vehicle.client.constant.PlatformConstant;
 import com.chelvc.cloud.vehicle.client.constant.ReserveStatus;
 import com.chelvc.cloud.vehicle.client.constant.TradeConstant;
 import com.chelvc.cloud.vehicle.client.dto.*;
+import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
 import com.chelvc.cloud.vehicle.server.dao.AssetMapper;
@@ -156,19 +157,41 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
         }
         Long finalUserId = userId;
         DatabaseContextHolder.transactional((Executor) () -> {
+            Long withdrawId = null;
+            JSONObject json = null;
             //生成提现订单
-            Long withdrawId = withdrawService.createWithdraw(finalUserId, type, amount, 1);
-            String sxyMerchantId = merchantRelation.getSxyMerchantId();
-            //生成提现参数
-            HashMap<String, Object> map = new HashMap<>();
-            map.put("merchantId", sxyMerchantId);
-            map.put("requestId", withdrawId);
-            map.put("withdrawAmount", amount.multiply(new BigDecimal("100")));
-            map.put("notifyUrl", TradeConstant.WITHDRAW_NOTIFY_URL);
-            map.put("remark", "");
-            Gson gson = new Gson();
-            JSONObject json = TradeHandle.handle(gson.toJson(map),
-                    TradeConstant.WITHDRAW_URL, sxyMerchantId, TradeConstant.PARTNER_ID);
+            if(type == 2){
+                withdrawId = withdrawService.createWithdraw(finalUserId, type, amount, 1, 0);
+                //商户提现操作
+                String sxyMerchantId = merchantRelation.getSxyMerchantId();
+                //生成提现参数
+                HashMap<String, Object> map = new HashMap<>();
+                map.put("merchantId", sxyMerchantId);
+                map.put("requestId", withdrawId);
+                map.put("withdrawAmount", amount.multiply(new BigDecimal("100")));
+                map.put("notifyUrl", TradeConstant.WITHDRAW_NOTIFY_URL);
+                map.put("remark", "");
+                Gson gson = new Gson();
+                json = TradeHandle.handle(gson.toJson(map),
+                        TradeConstant.WITHDRAW_URL, sxyMerchantId, TradeConstant.PARTNER_ID);
+            } else {
+                //用户先转账后提现
+                withdrawId = withdrawService.createWithdraw(finalUserId, 1, amount, 1, 1);
+                MerchantRelation relation = merchantRelationService.queryByUserIdAndType(finalUserId, 1);
+                //生成转账参数
+                HashMap<String, Object> map = new HashMap<>();
+                map.put("merchantId", TradeConstant.PARTNER_ID);
+                map.put("requestId", withdrawId);
+                map.put("receiverId", relation.getSxyMerchantId());
+                map.put("receiverType", "MERCHANT_ACC");
+                map.put("amount", amount.multiply(new BigDecimal("100")));
+                map.put("currency", "CNY");
+                map.put("notifyUrl", TradeConstant.TRANSFER_NOTIFY_URL);
+                map.put("deputeMark", "NOT_DO_DEPUTE");
+                Gson gson = new Gson();
+                json = TradeHandle.handle(gson.toJson(map),
+                        TradeConstant.TRANSFER_URL, relation.getSxyMerchantId(), TradeConstant.PARTNER_ID);
+            }
             String status = json.getString("status");
             if(!"SUCCESS".equals(status)){
                 //提现申请失败
@@ -184,6 +207,44 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
         });
     }
 
+    /**
+     * 转账
+     * @param sourceUserId
+     * @param targetUserId
+     * @param type
+     * @param amount
+     */
+    @Override
+    public void transfer(Long sourceUserId, Long targetUserId, Integer type, BigDecimal amount){
+        Long withdrawId = withdrawService.createWithdraw(targetUserId, type, amount, 1, 1);
+        MerchantRelation relation = merchantRelationService.queryByUserIdAndType(targetUserId, type);
+        //生成转账参数
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("merchantId", TradeConstant.PARTNER_ID);
+        map.put("requestId", withdrawId);
+        map.put("receiverId", relation.getSxyMerchantId());
+        map.put("receiverType", "MERCHANT_ACC");
+        map.put("amount", amount.multiply(new BigDecimal("100")));
+        map.put("currency", "CNY");
+        map.put("notifyUrl", TradeConstant.TRANSFER_NOTIFY_URL);
+        map.put("deputeMark", "NOT_DO_DEPUTE");
+        Gson gson = new Gson();
+        JSONObject json = TradeHandle.handle(gson.toJson(map),
+                TradeConstant.TRANSFER_URL, relation.getSxyMerchantId(), TradeConstant.PARTNER_ID);
+        String status = json.getString("status");
+        if(!"SUCCESS".equals(status)){
+            //转账申请失败
+            withdrawService.updateStatusById(withdrawId, 2);
+            return;
+        }
+        //冻结金额
+        int i = baseMapper.updateFrozenAmount(amount, LocalDateTime.now(), sourceUserId, type);
+        if(i != 1){
+            withdrawService.updateStatusById(withdrawId, 2);
+            throw new ResourceUnavailableException("提现申请失败");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void withdrawNotify(WithdrawNotifyParam param) {
@@ -215,4 +276,53 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
             }
         }
     }
+
+    @Override
+    public void transferNotify(TransferNotifyParam param) {
+        String requestId = param.getRequestId();
+        Long id = Long.parseLong(requestId);
+        OmsWithdraw withdraw = withdrawService.queryById(id);
+        if(withdraw == null){
+            return;
+        }
+        String withdrawAmount = param.getAmount();
+        BigDecimal amount = withdraw.getAmount();
+        if(amount.compareTo(new BigDecimal(withdrawAmount)) != 0){
+            //金额不一致
+            return;
+        }
+        String transferStatus = param.getStatus();
+        int status = 2;
+        if("SUCCESS".equals(transferStatus)){
+            status = 1;
+        }
+        //更新转账订单状态和外部订单号
+        int i = withdrawService.updateByNotify(id, null, status);
+        if(i == 1){
+            if(status == 2){
+                //失败解冻金额
+                baseMapper.backFrozen(amount, withdraw.getUserId(), withdraw.getType(), LocalDateTime.now());
+            } else {
+                //用户提现
+                Long withdrawId = withdrawService.createWithdraw(withdraw.getUserId(), 1, amount, 1, 0);
+                //商户提现操作
+                String sxyMerchantId = param.getReceiverId();
+                //生成提现参数
+                HashMap<String, Object> map = new HashMap<>();
+                map.put("merchantId", sxyMerchantId);
+                map.put("requestId", withdrawId);
+                map.put("withdrawAmount", amount.multiply(new BigDecimal("100")));
+                map.put("notifyUrl", TradeConstant.WITHDRAW_NOTIFY_URL);
+                map.put("remark", "");
+                Gson gson = new Gson();
+                JSONObject json = TradeHandle.handle(gson.toJson(map),
+                        TradeConstant.WITHDRAW_URL, sxyMerchantId, TradeConstant.PARTNER_ID);
+                String result = json.getString("status");
+                if(!"SUCCESS".equals(result)){
+                    //提现申请失败
+                    withdrawService.updateStatusById(withdrawId, 2);
+                }
+            }
+        }
+    }
 }

+ 5 - 5
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantRelationServiceImpl.java

@@ -68,13 +68,13 @@ public class MerchantRelationServiceImpl extends ServiceImpl<MerchantRelationMap
         JSONObject bankCardInfo = new JSONObject();
         //bankCardInfo.put("bankName", ""); //开户行名称
         //bankCardInfo.put("bankBranchName", ""); //支行名称
-        bankCardInfo.put("accountName", "");
-        bankCardInfo.put("bankCardNo", "");
+        bankCardInfo.put("accountName", merchantAuth.getAccountName()); //开户名称
+        bankCardInfo.put("bankCardNo", merchantAuth.getBankCardNo()); //开户账号
         bankCardInfo.put("accountType", "PRIVATE");
         bankCardInfo.put("liquidationType", "WITHDRAW");
         bankCardInfo.put("withdrawRateType", "SINGLE");
-        bankCardInfo.put("withdrawRate", "0.00");
-        bankCardInfo.put("reservedPhoneNo", ""); //银行预留手机号
+        bankCardInfo.put("withdrawRate", "1.00");
+        bankCardInfo.put("reservedPhoneNo", merchantAuth.getReservedPhoneNo()); //银行预留手机号
         jsonObject.put("bankCardInfo", bankCardInfo);
 
         //商户资质信息
@@ -83,7 +83,7 @@ public class MerchantRelationServiceImpl extends ServiceImpl<MerchantRelationMap
         certificateInfo.put("legalPersonPhone", merchantAuth.getMobileNumber());
         certificateInfo.put("legalPersonIdType", "IDCARD");
         certificateInfo.put("legalPersonIdNo", merchantAuth.getIdCardNumber());
-        certificateInfo.put("idEffectiveDateStart", "");  //身份证号有效期开始
+        certificateInfo.put("idEffectiveDateStart", merchantAuth.getIdCardExpirationDateStart());  //身份证号有效期开始
         certificateInfo.put("idEffectiveDateEnd", merchantAuth.getIdCardExpirationDate());
         certificateInfo.put("cerNo", merchantAuth.getBusinessLicenseId());
         certificateInfo.put("sellingArea", "C");

+ 4 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OderHandleServiceImpl.java

@@ -120,6 +120,8 @@ public class OderHandleServiceImpl implements OrderHandleService {
         currencyRecordService.recordFlow(merchantId, 2, 0, orderId, userId, 0, operateAmount, merchantDeduct, merchantRealityAmount);
         //记录商家余额明细
         balanceDetailService.recordFlow(omsOrder.getId(), 2, merchantId, operateAmount, surplusAmount, 0, 1, userId);
+        //给商家转账
+        assetService.transfer(0L, merchantId, 2, merchantRealityAmount);
         //邀请用户---分得佣金
         if (userAmount.compareTo(BigDecimal.ZERO) > 0) {
             platformAmount = platformAmount.subtract(userAmount);
@@ -139,6 +141,8 @@ public class OderHandleServiceImpl implements OrderHandleService {
             assetService.updateAsset(0, realityAmount, inviteMerchantId, 1, 1);
             //邀请商家流水
             currencyRecordService.recordFlow(inviteMerchantId, 1, 0, orderId, userId, 2, merchantAmount, deduct, realityAmount);
+            //商家佣金转账
+            assetService.transfer(0L, inviteMerchantId, 2, realityAmount);
         }
         //平台流水
         BigDecimal deduct = BigDecimal.ZERO;  //扣税

+ 2 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsWithdrawServiceImpl.java

@@ -21,13 +21,14 @@ public class OmsWithdrawServiceImpl extends ServiceImpl<OmsWithdrawMapper,
         OmsWithdraw> implements OmsWithdrawService {
 
     @Override
-    public Long createWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel) {
+    public Long createWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel, Integer flag) {
         OmsWithdraw withdraw = new OmsWithdraw();
         withdraw.setAmount(amount);
         withdraw.setChannel(channel);
         withdraw.setStatus(0);
         withdraw.setUserId(userId);
         withdraw.setType(type);
+        withdraw.setFlag(flag);
         withdraw.setCreateTime(new Date());
         int i = baseMapper.insert(withdraw);
         if(i != 1){