|
@@ -1,15 +1,28 @@
|
|
|
package com.chelvc.cloud.vehicle.server.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.chelvc.cloud.vehicle.client.constant.PlatformConstant;
|
|
|
+import com.chelvc.cloud.vehicle.client.constant.TradeConstant;
|
|
|
import com.chelvc.cloud.vehicle.client.dto.UserCouponDTO;
|
|
|
import com.chelvc.cloud.vehicle.server.dao.OmsOrderMapper;
|
|
|
import com.chelvc.cloud.vehicle.server.entity.MerchantRelation;
|
|
|
import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
|
|
|
import com.chelvc.cloud.vehicle.server.service.*;
|
|
|
import com.chelvc.framework.common.exception.ResourceUnavailableException;
|
|
|
+import com.upay.sdk.entity.SplitDetail;
|
|
|
+import com.upay.sdk.exception.HmacVerifyException;
|
|
|
+import com.upay.sdk.exception.RequestException;
|
|
|
+import com.upay.sdk.exception.ResponseException;
|
|
|
+import com.upay.sdk.exception.UnknownException;
|
|
|
+import com.upay.sdk.executer.ResultListenerAdpater;
|
|
|
+import com.upay.sdk.onlinepay.builder.SplitOrderBuilder;
|
|
|
+import com.upay.sdk.onlinepay.executer.OnlinePayOrderExecuter;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -17,6 +30,7 @@ import org.springframework.stereotype.Service;
|
|
|
import java.io.BufferedInputStream;
|
|
|
import java.io.FileInputStream;
|
|
|
import java.io.FileNotFoundException;
|
|
|
+import java.io.PrintWriter;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
@@ -28,7 +42,11 @@ import java.security.cert.CertificateFactory;
|
|
|
import java.security.cert.X509Certificate;
|
|
|
import java.util.Date;
|
|
|
import java.util.Objects;
|
|
|
+import java.util.UUID;
|
|
|
|
|
|
+import static com.chelvc.cloud.vehicle.client.constant.TradeConstant.NOTIFY_DOMAIN;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
|
|
public class OderHandleServiceImpl implements OrderHandleService {
|
|
@@ -227,6 +245,187 @@ public class OderHandleServiceImpl implements OrderHandleService {
|
|
|
}*/
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void splitOrder(OmsOrder omsOrder) {
|
|
|
+ //分账订单号
|
|
|
+ String requestId = UUID.randomUUID().toString().replaceAll("-", "");
|
|
|
+ omsOrder.setStatus(4);
|
|
|
+ omsOrder.setConfirmStatus(1);
|
|
|
+ omsOrder.setReceiveTime(new Date());
|
|
|
+ omsOrder.setUpdateTime(new Date());
|
|
|
+ omsOrder.setRequestId(requestId);
|
|
|
+ int i = omsOrderMapper.updateById(omsOrder);
|
|
|
+ if (i != 1) {
|
|
|
+ throw new ResourceUnavailableException("处理失败");
|
|
|
+ }
|
|
|
+ //分佣逻辑=====================================
|
|
|
+ //实际支付金额
|
|
|
+ BigDecimal payAmount = omsOrder.getPayAmount();
|
|
|
+ Long userId = omsOrder.getUserId();
|
|
|
+ Long merchantId = omsOrder.getMerchantId();
|
|
|
+
|
|
|
+ BigDecimal userAmount = BigDecimal.ZERO;
|
|
|
+ BigDecimal merchantAmount = BigDecimal.ZERO;
|
|
|
+ BigDecimal feeAmount = omsOrder.getFeeAmount();
|
|
|
+ //计算优惠券
|
|
|
+ Long couponId = omsOrder.getCouponId();
|
|
|
+ if(couponId != null){
|
|
|
+ UserCouponDTO userCoupon = userCouponService.getUserCoupon(couponId);
|
|
|
+ if(userCoupon != null){
|
|
|
+ Long couponMerchantId = userCoupon.getMerchantId();
|
|
|
+ if(couponMerchantId == 0L){
|
|
|
+ //平台补贴给商家
|
|
|
+ BigDecimal couponAmount = omsOrder.getCouponAmount();
|
|
|
+ //给商家转账
|
|
|
+ assetService.transfer(0L, merchantId, 2, couponAmount, "平台优惠券补贴");
|
|
|
+ //更新平台资产
|
|
|
+ BigDecimal platformTotal = assetService.updateAsset(1, couponAmount, 0L, 0, 1);
|
|
|
+ //记录平台余额明细
|
|
|
+ balanceDetailService.recordFlow(omsOrder.getId(), 0, 0L, couponAmount, BigDecimal.ZERO,
|
|
|
+ couponAmount, platformTotal, 1, 9, merchantId);
|
|
|
+ BigDecimal surplusAmount = assetService.updateAsset(0, couponAmount, merchantId, 2, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String sxyMerchantId = TradeConstant.PARTNER_ID;
|
|
|
+ //原订单流水号(serialNumber)是交易流水号而不是银行流水号
|
|
|
+ Long orderId = omsOrder.getId();
|
|
|
+ //此处为退款金额
|
|
|
+ String totalSplitAmount = String.valueOf(payAmount.multiply(new BigDecimal("100")));
|
|
|
+ //服务商id
|
|
|
+ String partnerId = TradeConstant.PARTNER_ID;
|
|
|
+ //通知地址
|
|
|
+ String notifyUrl = NOTIFY_DOMAIN + TradeConstant.SPLIT_ORDER_NOTIFY_URL;
|
|
|
+ SplitOrderBuilder builder = new SplitOrderBuilder(sxyMerchantId);
|
|
|
+ builder.setOrderId(String.valueOf(orderId))
|
|
|
+ .setRequestId(requestId)
|
|
|
+ .setTotalSplitAmount(totalSplitAmount)
|
|
|
+ .setNotifyUrl(notifyUrl);
|
|
|
+ builder.setPartnerId(partnerId);
|
|
|
+
|
|
|
+ MerchantRelation merchantRelation = merchantRelationService.queryByUserIdAndType(merchantId, 2);
|
|
|
+ //应该分账金额
|
|
|
+ BigDecimal splitAmount = payAmount.subtract(feeAmount);
|
|
|
+ //平台抽佣
|
|
|
+ int platformRatio = platformProfitRatioService.queryRatio(merchantId);
|
|
|
+ //平台抽佣金额----向上取整保留2位小数
|
|
|
+ BigDecimal platformAmount = new BigDecimal(platformRatio).divide(new BigDecimal("100"), 2, RoundingMode.UP)
|
|
|
+ .multiply(splitAmount).setScale(2, RoundingMode.UP);
|
|
|
+
|
|
|
+ //售卖商家应得金额
|
|
|
+ BigDecimal goodsMerchantAmount = splitAmount.subtract(platformAmount);
|
|
|
+
|
|
|
+ //售卖商家分账
|
|
|
+ SplitDetail splitDetail = getSplitStr(merchantRelation.getSxyMerchantId(), goodsMerchantAmount);
|
|
|
+ builder.addSplitDetails(splitDetail);
|
|
|
+
|
|
|
+ //用户抽佣----查看消费用户上级
|
|
|
+ boolean flag = false;
|
|
|
+ Long inviteUserId = userInviteService.queryUserByTarget(userId, 1);
|
|
|
+ if (inviteUserId != null) {
|
|
|
+ //用户分佣
|
|
|
+ int userRatio = userProfitRatioService.queryRatio(inviteUserId, 1);
|
|
|
+ if (userRatio > 0) {
|
|
|
+ userAmount = new BigDecimal(userRatio).divide(new BigDecimal("100"), 2, RoundingMode.UP)
|
|
|
+ .multiply(platformAmount).setScale(2, RoundingMode.UP);
|
|
|
+ MerchantRelation relation = merchantRelationService.queryByUserIdAndType(inviteUserId, 1);
|
|
|
+ if(relation != null && StringUtils.isNotBlank(relation.getSxyMerchantId()) && userAmount.compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ flag = true;
|
|
|
+ //邀请用户分账
|
|
|
+ SplitDetail splitUserDetail = getSplitStr(relation.getSxyMerchantId(), userAmount);
|
|
|
+ builder.addSplitDetails(splitUserDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //商户抽佣----查看消费用户上级
|
|
|
+ Long inviteMerchantId = userInviteService.queryUserByTarget(merchantId, 2);
|
|
|
+ if (inviteMerchantId != null) {
|
|
|
+ //商户分佣
|
|
|
+ int merchantRatio = userProfitRatioService.queryRatio(inviteMerchantId, 2);
|
|
|
+ MerchantRelation inviteMerchantRelation = merchantRelationService.queryByUserIdAndType(inviteMerchantId, 2);
|
|
|
+ if (merchantRatio > 0 && StrUtil.isNotBlank(inviteMerchantRelation.getSxyMerchantId())) {
|
|
|
+ merchantAmount = new BigDecimal(merchantRatio).divide(new BigDecimal("100"), 2, RoundingMode.UP)
|
|
|
+ .multiply(platformAmount).setScale(2, RoundingMode.UP);
|
|
|
+ if(merchantAmount.compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ SplitDetail splitStr = getSplitStr(inviteMerchantRelation.getSxyMerchantId(), merchantAmount);
|
|
|
+ builder.addSplitDetails(splitStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ BigDecimal platformRealAmount = platformAmount.subtract(merchantAmount);
|
|
|
+ if(flag){
|
|
|
+ platformRealAmount = platformRealAmount.subtract(userAmount);
|
|
|
+ }
|
|
|
+ platformRealAmount = platformRealAmount.add(feeAmount);
|
|
|
+ if(platformRealAmount.compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ SplitDetail splitStr = getSplitStr(TradeConstant.PARTNER_ID, platformRealAmount);
|
|
|
+ builder.addSplitDetails(splitStr);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ OnlinePayOrderExecuter executer = new OnlinePayOrderExecuter();
|
|
|
+ BigDecimal finalPlatformRealAmount = platformRealAmount;
|
|
|
+ BigDecimal finalMerchantAmount = merchantAmount;
|
|
|
+ boolean finalFlag = flag;
|
|
|
+ executer.bothSplitOrder(builder, new ResultListenerAdpater() {
|
|
|
+ /**
|
|
|
+ * 提交成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void success(JSONObject jsonObject) {
|
|
|
+ log.info("分账成功:{}", jsonObject);
|
|
|
+ assetService.updatePlatformAsset(finalPlatformRealAmount, payAmount);
|
|
|
+ assetService.updateAsset(0, goodsMerchantAmount, merchantId, 2, 1);
|
|
|
+ if(finalMerchantAmount.compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ assetService.updateAsset(0, finalMerchantAmount, inviteMerchantId, 2, 1);
|
|
|
+ }
|
|
|
+ if(finalFlag){
|
|
|
+ assetService.updateAsset(0, finalMerchantAmount, inviteUserId, 1, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (ResponseException e) {
|
|
|
+ log.error("响应异常</br>");
|
|
|
+ log.error(e.toString());
|
|
|
+ } catch (HmacVerifyException e) {
|
|
|
+ log.error("签名验证异常</br>");
|
|
|
+ log.error(e.toString());
|
|
|
+ } catch (RequestException e) {
|
|
|
+ log.error("请求异常</br>");
|
|
|
+ log.error(e.toString());
|
|
|
+ } catch (UnknownException e) {
|
|
|
+ log.error("未知异常</br>");
|
|
|
+ log.error(e.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ //邀请用户---分得佣金
|
|
|
+ if (userAmount.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ BigDecimal deduct = BigDecimal.ZERO; //扣税
|
|
|
+ BigDecimal realityAmount = userAmount.subtract(deduct);
|
|
|
+ if(!flag){
|
|
|
+ //更新用户资产
|
|
|
+ BigDecimal userTotal = assetService.updateAsset(0, realityAmount, inviteUserId, 1, 1);
|
|
|
+ //邀请用户余额明细
|
|
|
+ balanceDetailService.recordFlow(orderId, 1, inviteUserId, userAmount, deduct,
|
|
|
+ realityAmount, userTotal, 0, 1, userId);
|
|
|
+ //用户资产记录到平台名下
|
|
|
+ BigDecimal platformTotal = assetService.updateAsset(0, realityAmount, 0L, 0, 1);
|
|
|
+ //用户佣金记录到平台余额名下
|
|
|
+ balanceDetailService.recordFlow(orderId, 0, 0L, userAmount, deduct,
|
|
|
+ realityAmount, platformTotal, 0, 1, userId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public SplitDetail getSplitStr(String merchantId, BigDecimal amount){
|
|
|
+ SplitDetail splitDetail = new SplitDetail();
|
|
|
+ splitDetail.setSubSplitRequestId(UUID.randomUUID().toString().replaceAll("-", ""));
|
|
|
+ splitDetail.setSplitAccId(merchantId);
|
|
|
+ splitDetail.setSplitAccType("MERCHANT_ACC");
|
|
|
+ splitDetail.setSplitAmount(amount.multiply(new BigDecimal("100")).longValue());
|
|
|
+ splitDetail.setRemark("收益");
|
|
|
+ return splitDetail;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void paySuccess(OmsOrder order) {
|
|
|
omsOrderMapper.updateById(order);
|