|
@@ -5,15 +5,11 @@ import com.alibaba.fastjson.JSONObject;
|
|
import com.caimei.modules.order.dao.NewOrderDao;
|
|
import com.caimei.modules.order.dao.NewOrderDao;
|
|
import com.caimei.modules.order.entity.*;
|
|
import com.caimei.modules.order.entity.*;
|
|
import com.caimei.modules.order.utils.Disguiser;
|
|
import com.caimei.modules.order.utils.Disguiser;
|
|
-import com.caimei.modules.order.utils.PayUtil;
|
|
|
|
import com.caimei.redis.RedisService;
|
|
import com.caimei.redis.RedisService;
|
|
import com.caimei.utils.MathUtil;
|
|
import com.caimei.utils.MathUtil;
|
|
-import com.thinkgem.jeesite.common.persistence.Page;
|
|
|
|
import com.thinkgem.jeesite.common.service.BaseService;
|
|
import com.thinkgem.jeesite.common.service.BaseService;
|
|
import okhttp3.*;
|
|
import okhttp3.*;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
-import org.slf4j.Logger;
|
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
@@ -24,7 +20,7 @@ import java.math.BigDecimal;
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
-import java.util.stream.Collectors;
|
|
|
|
|
|
+
|
|
|
|
|
|
@Service
|
|
@Service
|
|
@Transactional(readOnly = true)
|
|
@Transactional(readOnly = true)
|
|
@@ -73,85 +69,179 @@ public class SplitAccountService extends BaseService {
|
|
HashMap<String, BigDecimal> sbm = new HashMap<>();
|
|
HashMap<String, BigDecimal> sbm = new HashMap<>();
|
|
for (SplitAccountPo splitAccountPo : splitBillDetail) {
|
|
for (SplitAccountPo splitAccountPo : splitBillDetail) {
|
|
String subUserNo = splitAccountPo.getSubUserNo();
|
|
String subUserNo = splitAccountPo.getSubUserNo();
|
|
- if(sbm.containsKey(subUserNo)){
|
|
|
|
|
|
+ if (sbm.containsKey(subUserNo)) {
|
|
BigDecimal v = MathUtil.add(sbm.get(subUserNo), splitAccountPo.getSplitAccount());
|
|
BigDecimal v = MathUtil.add(sbm.get(subUserNo), splitAccountPo.getSplitAccount());
|
|
- sbm.put(subUserNo,v);
|
|
|
|
- }else{
|
|
|
|
- sbm.put(subUserNo,BigDecimal.valueOf(splitAccountPo.getSplitAccount()));
|
|
|
|
|
|
+ sbm.put(subUserNo, v);
|
|
|
|
+ } else {
|
|
|
|
+ sbm.put(subUserNo, BigDecimal.valueOf(splitAccountPo.getSplitAccount()));
|
|
|
|
+ }
|
|
|
|
+ // splitcode相同的收款的时候已经是成本已分帐
|
|
|
|
+ if (subUserNo.equals(shopOrder.getSplitCode())) {
|
|
|
|
+ splitAccountPo.setMbOrderId(orderRelation.getMbOrderId());
|
|
|
|
+ splitAccountPo.setOrderRequestNo(orderRelation.getOrderRequestNo());
|
|
|
|
+ splitAccountPo.setPayStatus(1);
|
|
|
|
+ // 保存分账详情
|
|
|
|
+ newOrderDao.insertSplitAccount(splitAccountPo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
|
|
ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
|
|
sbm.forEach((key, value) -> {
|
|
sbm.forEach((key, value) -> {
|
|
- AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
|
|
|
|
- splitBillRule.setSplitBillAmount(value);
|
|
|
|
- splitBillRule.setSplitBillMerchantNo(key);
|
|
|
|
- splitBillRules.add(splitBillRule);
|
|
|
|
|
|
+ // 不是自己的splitcode分走,是自己的不动
|
|
|
|
+ if (!key.equals(shopOrder.getSplitCode())) {
|
|
|
|
+ //佣金
|
|
|
|
+ AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
|
|
|
|
+ splitBillRule.setSplitBillAmount(value);
|
|
|
|
+ splitBillRule.setSplitBillMerchantNo(key);
|
|
|
|
+ splitBillRules.add(splitBillRule);
|
|
|
|
+ }else{
|
|
|
|
+ // 成本分账处理
|
|
|
|
+ // 子订单的splitcode和分账对象的splitcode一样的是留在账户里的钱,实际在付款完成后,付款状态就为已付款,分账状态就为已分账
|
|
|
|
+ // 为维持业务完整性,保持原来的分账流程不变
|
|
|
|
+ List<SplitAccountPo> splitAccountList = newOrderDao.getSplitAccountList(orderRelation.getMbOrderId());
|
|
|
|
+ if (splitAccountList != null && splitAccountList.size() > 0) {
|
|
|
|
+ Integer orderId = splitAccountList.get(0).getOrderId();
|
|
|
|
+ List<ShopOrderVo> shopOrderList = newOrderDao.getShopOrderByOrderId(orderId);
|
|
|
|
+ Integer shopOrderId = null;
|
|
|
|
+ String shopOrderNo = "";
|
|
|
|
+ for (SplitAccountPo account : splitAccountList) {
|
|
|
|
+ // 本次付供应商金额(分账金额)
|
|
|
|
+ Double splitAmount = account.getSplitAccount();
|
|
|
|
+ orderId = account.getOrderId();
|
|
|
|
+ Integer shopId = account.getShopId();
|
|
|
|
+ for (ShopOrderVo shop : shopOrderList) {
|
|
|
|
+ if (shopId.equals(shop.getShopId())) {
|
|
|
|
+ shopOrderId = shop.getShopOrderId();
|
|
|
|
+ shopOrderNo = shop.getShopOrderNo();
|
|
|
|
+ // 已付供应商金额
|
|
|
|
+ Double paidAmount = newOrderDao.getPaidShopAmount(shopOrderId);
|
|
|
|
+ Double paidShop = MathUtil.add(paidAmount, splitAmount).doubleValue();
|
|
|
|
+ shopOrder.setPayedShopAmount(paidShop);
|
|
|
|
+ if (MathUtil.compare(shopOrder.getShouldPayShopAmount(), paidShop) == 0) {
|
|
|
|
+ shopOrder.setPayStatus(3);
|
|
|
|
+ } else {
|
|
|
|
+ shopOrder.setPayStatus(2);
|
|
|
|
+ }
|
|
|
|
+ // 修改子订单付款状态及付款金额
|
|
|
|
+ newOrderDao.updateShopOrderByPayStatus(shopOrderId, paidShop, shopOrder.getPayStatus());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ String currentTime2 = format2.format(new Date());
|
|
|
|
+ // 保存付款单表
|
|
|
|
+ PayShopPo payShop = new PayShopPo();
|
|
|
|
+ payShop.setShopId(shopId);
|
|
|
|
+ payShop.setName("线上支付分账");
|
|
|
|
+ payShop.setTotalAmount(splitAmount);
|
|
|
|
+ payShop.setWipePayment(0d);
|
|
|
|
+ payShop.setPayType(6);
|
|
|
|
+ payShop.setStatus(1);
|
|
|
|
+ payShop.setDelFlag(0);
|
|
|
|
+ payShop.setApplyTime(currentTime2);
|
|
|
|
+ payShop.setReviewTime(currentTime2);
|
|
|
|
+ payShop.setPayTime(currentTime2);
|
|
|
|
+ newOrderDao.insertPayShop(payShop);
|
|
|
|
+ // 保存 付供应商记录
|
|
|
|
+ PayShopRecordPo shopRecord = new PayShopRecordPo();
|
|
|
|
+ shopRecord.setShopId(shopId);
|
|
|
|
+ shopRecord.setShopOrderId(shopOrderId);
|
|
|
|
+ shopRecord.setShopOrderNo(shopOrderNo);
|
|
|
|
+ shopRecord.setPayAmount(splitAmount);
|
|
|
|
+ shopRecord.setWipePayment(0d);
|
|
|
|
+ shopRecord.setPayType(6);
|
|
|
|
+ shopRecord.setPayTime(currentTime2);
|
|
|
|
+ shopRecord.setPayShopId(payShop.getId());
|
|
|
|
+ shopRecord.setStatus(1);
|
|
|
|
+ shopRecord.setDelFlag(0);
|
|
|
|
+ newOrderDao.insertPayShopRecord(shopRecord);
|
|
|
|
+ }
|
|
|
|
+ // 子订单是否全部付款
|
|
|
|
+ boolean isPay = true;
|
|
|
|
+ for (ShopOrderVo shops : shopOrderList) {
|
|
|
|
+ if (3 != shops.getPayStatus()) {
|
|
|
|
+ isPay = false;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 修改主订单付款状态
|
|
|
|
+ if (isPay) {
|
|
|
|
+ newOrderDao.updateOrderByPayStatus(orderId, 3);
|
|
|
|
+ } else {
|
|
|
|
+ newOrderDao.updateOrderByPayStatus(orderId, 2);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
});
|
|
});
|
|
- // 自己的不分
|
|
|
|
- splitBillRules.removeIf(s->s.getSplitBillMerchantNo().equals(shopOrder.getSplitCode()));
|
|
|
|
- //第三方分账接口
|
|
|
|
- try {
|
|
|
|
- AccountPayOrder accountPayOrder = new AccountPayOrder();
|
|
|
|
- accountPayOrder.setP1_bizType("AccountPaySub");
|
|
|
|
- accountPayOrder.setP2_signType("MD5");
|
|
|
|
- String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
|
|
|
|
- accountPayOrder.setP3_timestamp(format1);
|
|
|
|
- String substring = format1.substring(20);
|
|
|
|
- // fz+当前微秒时间+原唯一订单号
|
|
|
|
- accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
|
|
|
|
- //付款账户子订单绑定商户号
|
|
|
|
- accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
|
|
|
|
- AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
|
|
|
|
- //收款账户商编 填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
|
|
|
|
|
|
+ splitBillDetail.removeIf(s -> s.getSubUserNo().equals(shopOrder.getSplitCode()));
|
|
|
|
+ if (null != splitBillRules && splitBillRules.size() > 0) {
|
|
|
|
+ //第三方分账接口
|
|
|
|
+ try {
|
|
|
|
+ AccountPayOrder accountPayOrder = new AccountPayOrder();
|
|
|
|
+ accountPayOrder.setP1_bizType("AccountPaySub");
|
|
|
|
+ accountPayOrder.setP2_signType("MD5");
|
|
|
|
+ String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
|
|
|
|
+ accountPayOrder.setP3_timestamp(format1);
|
|
|
|
+ String substring = format1.substring(20);
|
|
|
|
+ // fz+当前微秒时间+原唯一订单号
|
|
|
|
+ accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
|
|
|
|
+ //付款账户子订单绑定商户号
|
|
|
|
+ accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
|
|
|
|
+ AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
|
|
|
|
+ //收款账户商编 填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
|
|
// accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
|
|
// accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
|
|
- accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
|
|
|
|
|
|
+ accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
|
|
// accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
|
|
// accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
|
|
- accountPayOrderExt.setServerCallbackUrl(Constant.betaSplit);
|
|
|
|
- accountPayOrderExt.setGoodsName("分账");
|
|
|
|
- if (null != splitBillRules && splitBillRules.size() > 0) {
|
|
|
|
- accountPayOrderExt.setSplitBillRules(splitBillRules);
|
|
|
|
- }
|
|
|
|
- String ext = JSON.toJSONString(accountPayOrderExt);
|
|
|
|
- logger.info("分账规则串json串:" + ext);
|
|
|
|
- accountPayOrder.setP6_ext(ext);
|
|
|
|
- // 生成签名
|
|
|
|
- StringBuilder builder = new StringBuilder();
|
|
|
|
- builder.append(Constant.SPLIT)
|
|
|
|
- .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
|
|
|
|
- .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
|
|
|
|
- .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
|
|
|
|
- .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
|
|
|
|
- .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
|
|
|
|
- .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
|
|
|
|
- .append(Constant.XUNI);
|
|
|
|
- String sign = Disguiser.disguiseMD5(builder.toString().trim());
|
|
|
|
- Map<String, String> bean = convertBean(accountPayOrder);
|
|
|
|
- logger.info("--------------------> 发送分账参数: " + bean);
|
|
|
|
- Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
|
|
|
|
- logger.info("----------------分账返回数据: " + map.toString());
|
|
|
|
- if (map != null) {
|
|
|
|
- String code = map.get("rt5_retCode");
|
|
|
|
- if (!"0000".equals(code)) {
|
|
|
|
- String msg = map.get("rt6_retMsg");
|
|
|
|
- logger.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
|
|
|
|
- } else {
|
|
|
|
- for (SplitAccountPo splitAccount : splitBillDetail) {
|
|
|
|
- splitAccount.setMbOrderId(orderRelation.getMbOrderId());
|
|
|
|
- splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
|
|
|
|
- splitAccount.setPayStatus(1);
|
|
|
|
- // 保存分账详情
|
|
|
|
- newOrderDao.insertSplitAccount(splitAccount);
|
|
|
|
|
|
+ accountPayOrderExt.setServerCallbackUrl(Constant.betaSplit);
|
|
|
|
+ accountPayOrderExt.setGoodsName("分账");
|
|
|
|
+ if (null != splitBillRules && splitBillRules.size() > 0) {
|
|
|
|
+ accountPayOrderExt.setSplitBillRules(splitBillRules);
|
|
|
|
+ }
|
|
|
|
+ String ext = JSON.toJSONString(accountPayOrderExt);
|
|
|
|
+ logger.info("分账规则串json串:" + ext);
|
|
|
|
+ accountPayOrder.setP6_ext(ext);
|
|
|
|
+ // 生成签名
|
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
|
+ builder.append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
|
|
|
|
+ .append(Constant.XUNI);
|
|
|
|
+ String sign = Disguiser.disguiseMD5(builder.toString().trim());
|
|
|
|
+ Map<String, String> bean = convertBean(accountPayOrder);
|
|
|
|
+ logger.info("--------------------> 发送分账参数: " + bean);
|
|
|
|
+ Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
|
|
|
|
+ logger.info("----------------分账返回数据: " + map.toString());
|
|
|
|
+ if (map != null) {
|
|
|
|
+ String code = map.get("rt5_retCode");
|
|
|
|
+ if (!"0000".equals(code)) {
|
|
|
|
+ String msg = map.get("rt6_retMsg");
|
|
|
|
+ logger.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
|
|
|
|
+ } else {
|
|
|
|
+ for (SplitAccountPo splitAccount : splitBillDetail) {
|
|
|
|
+ splitAccount.setMbOrderId(orderRelation.getMbOrderId());
|
|
|
|
+ splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
|
|
|
|
+ splitAccount.setPayStatus(1);
|
|
|
|
+ // 保存分账详情
|
|
|
|
+ newOrderDao.insertSplitAccount(splitAccount);
|
|
|
|
+ }
|
|
|
|
+ redisService.remove("XSFZMDS");
|
|
|
|
+ logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
|
|
}
|
|
}
|
|
- redisService.remove("XSFZMDS");
|
|
|
|
- logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
|
|
|
|
}
|
|
}
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error("【手动分账】>>>>>>>>>>错误信息", e);
|
|
}
|
|
}
|
|
- } catch (Exception e) {
|
|
|
|
- logger.error("【手动分账】>>>>>>>>>>错误信息", e);
|
|
|
|
- }
|
|
|
|
|
|
+ } else {
|
|
|
|
+ // 没有佣金分账,全是成本,本笔交易已分帐
|
|
|
|
+ newOrderDao.updateBySplitStatus(orderRelation.getMbOrderId());
|
|
|
|
+ //没有佣金分账也解锁
|
|
|
|
+ redisService.remove("XSFZMDS");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
private List<SplitAccountPo> setSplitAccountDetail(ShopOrderVo shopOrder, PayParamBo payParam) {
|
|
private List<SplitAccountPo> setSplitAccountDetail(ShopOrderVo shopOrder, PayParamBo payParam) {
|
|
@@ -227,11 +317,9 @@ public class SplitAccountService extends BaseService {
|
|
splitAccount.setShopId(orderProduct.getShopId());
|
|
splitAccount.setShopId(orderProduct.getShopId());
|
|
splitAccount.setSplitAccount(costPrice);
|
|
splitAccount.setSplitAccount(costPrice);
|
|
splitAccount.setProductType(1);
|
|
splitAccount.setProductType(1);
|
|
- if (StringUtils.isNotBlank(orderProduct.getSplitCode())) {
|
|
|
|
- // 该商品设置了商户号
|
|
|
|
- splitAccount.setType(4);
|
|
|
|
- splitAccount.setSubUserNo(orderProduct.getSplitCode());
|
|
|
|
- }
|
|
|
|
|
|
+ // 该商品设置了商户号
|
|
|
|
+ splitAccount.setType(4);
|
|
|
|
+ splitAccount.setSubUserNo(shopOrder.getSplitCode());
|
|
logger.info("成本分账参数------------->" + splitAccount.toString());
|
|
logger.info("成本分账参数------------->" + splitAccount.toString());
|
|
list.add(splitAccount);
|
|
list.add(splitAccount);
|
|
}
|
|
}
|
|
@@ -259,16 +347,14 @@ public class SplitAccountService extends BaseService {
|
|
splitAccount.setShopId(shopOrder.getShopId());
|
|
splitAccount.setShopId(shopOrder.getShopId());
|
|
splitAccount.setSplitAccount(shopPostFee);
|
|
splitAccount.setSplitAccount(shopPostFee);
|
|
splitAccount.setProductType(2);
|
|
splitAccount.setProductType(2);
|
|
- if (StringUtils.isNotBlank(shopOrder.getSplitCode())) {
|
|
|
|
- //供应商拥有子商户号
|
|
|
|
- splitAccount.setType(4);
|
|
|
|
- splitAccount.setSubUserNo(shopOrder.getSplitCode());
|
|
|
|
- }
|
|
|
|
|
|
+ //供应商拥有子商户号
|
|
|
|
+ splitAccount.setType(4);
|
|
|
|
+ splitAccount.setSubUserNo(shopOrder.getSplitCode());
|
|
logger.info("付供应商运费分账参数------------->" + splitAccount);
|
|
logger.info("付供应商运费分账参数------------->" + splitAccount);
|
|
list.add(splitAccount);
|
|
list.add(splitAccount);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- // 如果还有钱则为佣金,分到采美网络
|
|
|
|
|
|
+ // 如果还有钱则为佣金,分到信息
|
|
if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
//分账手续费0.1%采美承担,佣金扣除0.1%
|
|
//分账手续费0.1%采美承担,佣金扣除0.1%
|
|
Double amount = Math.max(MathUtil.mul(splitAmount, 0.001, 2).doubleValue(), 0.01);
|
|
Double amount = Math.max(MathUtil.mul(splitAmount, 0.001, 2).doubleValue(), 0.01);
|