|
@@ -1,26 +1,29 @@
|
|
|
package com.caimei.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.caimei.mapper.OrderMapper;
|
|
|
import com.caimei.mapper.PayOrderMapper;
|
|
|
import com.caimei.model.ResponseJson;
|
|
|
import com.caimei.model.dto.PaymentDto;
|
|
|
import com.caimei.model.po.CmDiscernReceiptPo;
|
|
|
+import com.caimei.model.po.CmPayShopPo;
|
|
|
+import com.caimei.model.po.CmPayShopRecordPo;
|
|
|
import com.caimei.model.po.CmReceiptOrderRelationPo;
|
|
|
-import com.caimei.model.vo.DiscernReceiptVo;
|
|
|
-import com.caimei.model.vo.OrderVo;
|
|
|
+import com.caimei.model.vo.*;
|
|
|
import com.caimei.service.PayOrderService;
|
|
|
import com.caimei.util.MathUtil;
|
|
|
import com.caimei.util.PayUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* Description
|
|
@@ -36,22 +39,48 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
@Resource
|
|
|
private OrderMapper orderMapper;
|
|
|
|
|
|
+ @Value("${caimei.delayedSplittingUrl}")
|
|
|
+ private String delayedSplittingUrl;
|
|
|
+
|
|
|
/**
|
|
|
* 商户标识
|
|
|
*/
|
|
|
- String merAccount = "aa9aee6a148843a6a9e4ea117df4454b";
|
|
|
+ String merAccount = "150a5459416b4046b9153c1cd442e397";
|
|
|
/**
|
|
|
* 私钥,商户密钥
|
|
|
*/
|
|
|
- String merKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM0qCTZFdi1I59/Jeis+8KVhzSNhsRrKiOlHazIVyxNLzUQvFpWN5PlfVKlnJToorURTStfjAv01HD0Z4ZvMauuHhDT0bptiDln928Ld6SzX889X2nsCxl0Q+WzrkFsnT6gotvGnTeQGUgbBV3SQD3IUOwRwxoWYbrZqxtqHFxqRAgMBAAECgYEAvsHx9MMbAToDVmEXtXP8/lh0Cwy/RgDA0d30voni2pslTNtXbVCUcIUBy8y6oVvG1nt3YEmTsuiZy/nvehPT6GV1Gqj8T6lqWQ8KQKsDGlubvh23tzNM90me2TLZEPdNqC5CPRrwYrjght4BXgzu7s2+5FpeYCob1gVNi+w0Jz0CQQD0dXb9Oez+Ybnxb3rCghGWM6cxi8fsqk6MuKaleg53qfXrkgAVH78faeWzRaeSbVOh5+Z9kX5HUeynfM7E/f4nAkEA1tmnvJp4JQaouO1Trzbnkhowjea5daK/tDE8K0hIMHUjAw+c1QTteGOVGBFBHWPkUwkSCd2HKmk4URkp/snMhwJAO32+qF+Jclq8EqqLmHxo5UHKxX7793d2yD5Dp++tR6fgBiUwyfNA4tc1pEwmPLdIbBVwfUyEC70/N39jHoOlbwI/dX6SPJI9IgKCQp+HJEriWQP5iaCjy7E1JVXHkeP1lop4mzPukJAhTbUn1AGbmncGZmKPetWrFYZ1ReR9EtlJAkEA2kBmARWyOTt8fbikImuHr65M+BDgD+2fkuDb5+tqJljNmSqAIRRwcXj1Je6vkzlDJuSw3wlG6iliFtwe0cq7+w==";
|
|
|
+ String merKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIggpVq2S1JLH0szxurEgVTz4JTpoyO6/YreVP3xl2bcVj8ekVU+GBwLXNhokxOavgY116XxScinFPa/VoWhaVzyLTbvKz5B6yytuRc3OkSqdDj83jCk+mpmJ5UuCRQ3jesaZAxRpPLzLc99sPtD7xnzEd9UWG8Hlnm6ATmmEQhDAgMBAAECgYBPX+nLGRyWYaNfsFM+tVJMfN/pNMqhnPkWLkoUwPhtS/EmYOaRc+GPCLkcnu2Tstk2udKCuk0xqOs6bZs/1DygxzifYUltWFpqQ2gfmDMoOL4GOflXEHIpoSzSinXz8rjjlQU0wgkbNn6wV6Ao4Jxm5Rzmr9mvTKrAwsnY2eZnYQJBAP+Gj3rrJ7s5778jCramS7yLei2ljkHa/7P0MQsJ+B02/V5CFCh6qKZ2aaAQdk6Z7og5f641TrKX76QetDItSgsCQQCIYVdOdkC3+P6r7WYKXEJ8fdIrf2xyhcCAt9I4q+rcID+ZQ+UqzPoBuib/xpgBZVukDpj9BbIyObyStkvQsNWpAkBd6ADQ5pz6ZKdkMiecym6pAwVKwz4Nm8M/Si2/5dEGQ5BH1Lb9zV4vlvLofURNTKrp61+uES8z2TybryEAE77TAkAD8YSbwTGX4DxE7mVf8VD+1oiIN3QET7fEQQx0FQyCdvA/10W+GhU0jZRpGu30RGEE+mMUFeEUMLUyLNE+ZI6ZAkEA2t0rz4UpljOPms3yfxvzFnShBdshFZOy8kZRG/+OL9entaSOJ0gDmfeFBE9oWXwTj8aVasgbrBV1HjNfyb8WfA==";
|
|
|
/**
|
|
|
* 公钥
|
|
|
*/
|
|
|
- String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNKgk2RXYtSOffyXorPvClYc0jYbEayojpR2syFcsTS81ELxaVjeT5X1SpZyU6KK1EU0rX4wL9NRw9GeGbzGrrh4Q09G6bYg5Z/dvC3eks1/PPV9p7AsZdEPls65BbJ0+oKLbxp03kBlIGwVd0kA9yFDsEcMaFmG62asbahxcakQIDAQAB";
|
|
|
+ String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIIKVatktSSx9LM8bqxIFU8+CU6aMjuv2K3lT98Zdm3FY/HpFVPhgcC1zYaJMTmr4GNdel8UnIpxT2v1aFoWlc8i027ys+QessrbkXNzpEqnQ4/N4wpPpqZieVLgkUN43rGmQMUaTy8y3PfbD7Q+8Z8xHfVFhvB5Z5ugE5phEIQwIDAQAB";
|
|
|
/**
|
|
|
* 用户编号
|
|
|
*/
|
|
|
- String merNo = "10001720";
|
|
|
+ String merNo = "10002106";
|
|
|
+ /**
|
|
|
+ * 公账-专票,子商户商编
|
|
|
+ */
|
|
|
+ String publicAccountNo = "20001793";
|
|
|
+ /**
|
|
|
+ * 公账-普票,子商户商编
|
|
|
+ */
|
|
|
+ String commonInvoiceNo = "20001754";
|
|
|
+ /**
|
|
|
+ * 私账-无票,子商户商编
|
|
|
+ */
|
|
|
+ String privateAccountNo = "20001924";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取线上支付开关状态
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Integer> getPayOnLineSwitch() {
|
|
|
+ Integer status = payOrderMapper.getPayOnLineSwitch();
|
|
|
+ return ResponseJson.success(status);
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public synchronized ResponseJson<JSONObject> pay(PaymentDto payment) {
|
|
@@ -102,8 +131,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
/**
|
|
|
* 设置第三方支付参数
|
|
|
*/
|
|
|
- private JSONObject getPayParameter(PaymentDto payment, long time) throws Exception {
|
|
|
- String userType = "ENTERPRISE";
|
|
|
+ private JSONObject getPayParameter(PaymentDto payment, long time) {
|
|
|
JSONObject json = new JSONObject();
|
|
|
json.put("merAccount", merAccount);
|
|
|
json.put("merNo", merNo);
|
|
@@ -115,11 +143,10 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
json.put("userIp", payment.getClientIp());
|
|
|
json.put("returnUrl", payment.getReturnUrl());
|
|
|
json.put("notifyUrl", payment.getNotifyUrl());
|
|
|
- if (null != payment.getBankCode()) {
|
|
|
+ if (StringUtils.isNotBlank(payment.getBankCode())) {
|
|
|
json.put("bankCode", payment.getBankCode());
|
|
|
}
|
|
|
- json.put("userType", userType);
|
|
|
- if (null != payment.getOrderId()) {
|
|
|
+ if (StringUtils.isNotBlank(payment.getOpenid())) {
|
|
|
json.put("openId", payment.getOpenid());
|
|
|
}
|
|
|
return json;
|
|
@@ -203,12 +230,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
//更新付款次数
|
|
|
order.setPaySuccessCounter(order.getPaySuccessCounter() + 1);
|
|
|
payOrderMapper.updateSelective(order);
|
|
|
- /*//修改支付链接状态
|
|
|
- OrderPayLinkVo orderPayLink = payOrderMapper.findOrderPayLink(order.getOrderId(), amount);
|
|
|
- if (null != orderPayLink && ("12".equals(payType) || "17".equals(payType))) {
|
|
|
- orderPayLink.setPayStatus("1");
|
|
|
- payOrderMapper.updateOrderPayLink(orderPayLink);
|
|
|
- }*/
|
|
|
//保存收款记录
|
|
|
String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
|
|
|
CmDiscernReceiptPo discernReceipt = new CmDiscernReceiptPo();
|
|
@@ -300,4 +321,336 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
}
|
|
|
return ResponseJson.success(result);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void delayedSplitting() {
|
|
|
+ log.info("延时分账,每一小时执行一次");
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ calendar.setTime(new Date());
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, -1);
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String currentTime = format.format(calendar.getTime());
|
|
|
+ List<CmReceiptOrderRelationPo> orderRelations = payOrderMapper.findUnallocatedAccount(currentTime);
|
|
|
+ if (orderRelations != null && orderRelations.size() > 0) {
|
|
|
+ for (CmReceiptOrderRelationPo orderRelation : orderRelations) {
|
|
|
+ log.info("订单id" + orderRelation.getOrderID() + ">>>进入延时分账");
|
|
|
+ OrderVo order = orderMapper.findOrder(orderRelation.getOrderID());
|
|
|
+ PaymentDto payment = new PaymentDto();
|
|
|
+ payment.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
|
|
|
+ List<SplitAccountVo> splitBillDetail = splitBillDetail(order, payment);
|
|
|
+ String parameters = ledgerParameters(splitBillDetail, order.getOrderId());
|
|
|
+ log.info("分账参数: " + parameters);
|
|
|
+
|
|
|
+ //第三方分账接口
|
|
|
+ JSONObject result = null;
|
|
|
+ try {
|
|
|
+ // 时间戳
|
|
|
+ long time = System.currentTimeMillis() / 1000;
|
|
|
+ JSONObject json = new JSONObject();
|
|
|
+ json.put("merAccount", merAccount);
|
|
|
+ json.put("orderId", orderRelation.getOrderRequestNo());
|
|
|
+ json.put("requestNo", orderRelation.getOrderRequestNo());
|
|
|
+ json.put("mbOrderId", orderRelation.getMbOrderId());
|
|
|
+ json.put("time", time);
|
|
|
+ json.put("splitBillDetail", parameters);
|
|
|
+ json.put("notifyUrl", delayedSplittingUrl);
|
|
|
+ log.info("回调接口>>>" + delayedSplittingUrl);
|
|
|
+ String sign = PayUtils.buildSign(json, merKey);
|
|
|
+ json.put("sign", sign);
|
|
|
+ String data = PayUtils.buildDataPrivate(json, merKey);
|
|
|
+ result = PayUtils.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/splitOrder/v1", merAccount, data);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("错误信息", e);
|
|
|
+ }
|
|
|
+ if (result != null) {
|
|
|
+ String code = result.getString("code");
|
|
|
+ if (!"000000".equals(code)) {
|
|
|
+ String msg = result.getString("msg");
|
|
|
+ log.info("第三方延迟分账失败>>>>>>>msg:" + msg);
|
|
|
+ } else {
|
|
|
+ //保存分账记录
|
|
|
+ for (SplitAccountVo splitAccount : splitBillDetail) {
|
|
|
+ splitAccount.setMbOrderId(orderRelation.getMbOrderId());
|
|
|
+ splitAccount.setOrderRequestNo(orderRelation.getOrderRequestNo());
|
|
|
+ splitAccount.setPayStatus("1");
|
|
|
+ payOrderMapper.insertSplitAccount(splitAccount);
|
|
|
+ }
|
|
|
+ log.info("此订单分账结束");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String delayedSplittingCallback(String data) {
|
|
|
+ try {
|
|
|
+ //公钥解密
|
|
|
+ JSONObject json = PayUtils.decryptDataPublic(data, publicKey);
|
|
|
+ log.info("公钥解密>>>>>>" + json);
|
|
|
+ //公钥验签
|
|
|
+ String signaa = json.getString("sign");
|
|
|
+ json.remove("sign");
|
|
|
+ String signbb = PayUtils.buildSign(json, publicKey);
|
|
|
+ if (!signaa.equals(signbb)) {
|
|
|
+ return "验签失败";
|
|
|
+ }
|
|
|
+ String mbOrderId = json.getString("mbOrderId");
|
|
|
+ String status = json.getString("status");
|
|
|
+ log.info("分账状态>>>" + status);
|
|
|
+ if ("FAILED".equals(status)) {
|
|
|
+ return "分账失败";
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改收款分账状态
|
|
|
+ payOrderMapper.updateBySplitStatus(mbOrderId);
|
|
|
+
|
|
|
+ Integer orderId = null;
|
|
|
+ List<SplitAccountVo> splitAccountList = payOrderMapper.findByMbOrderId(mbOrderId);
|
|
|
+ if (splitAccountList != null && splitAccountList.size() > 0) {
|
|
|
+ Integer shopOrderId = null;
|
|
|
+ String shopOrderNo = "";
|
|
|
+ for (SplitAccountVo account : splitAccountList) {
|
|
|
+ log.info("保存应付付供应商>>>>" + account.getShopId());
|
|
|
+ //本次付供应商金额(分账金额)
|
|
|
+ BigDecimal splitAmount = account.getSplitAccount();
|
|
|
+ orderId = account.getOrderId();
|
|
|
+ Integer shopId = account.getShopId();
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(orderId);
|
|
|
+ String payStatus = "";
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ if (shopId.equals(shopOrder.getShopId())) {
|
|
|
+ shopOrderId = shopOrder.getShopOrderId();
|
|
|
+ shopOrderNo = shopOrder.getShopOrderNo();
|
|
|
+ //已付供应商金额
|
|
|
+ BigDecimal paidAmount = payOrderMapper.findPaidShop(shopOrderId);
|
|
|
+ BigDecimal paidShop = MathUtil.add(paidAmount, splitAmount);
|
|
|
+ if (MathUtil.compare(shopOrder.getShouldPayShopAmount(), paidShop) == 0) {
|
|
|
+ payStatus = "3";
|
|
|
+ } else {
|
|
|
+ payStatus = "2";
|
|
|
+ }
|
|
|
+ //修改子订单付款状态及付款金额
|
|
|
+ payOrderMapper.updateShopOrderByPayStatus(shopOrderId, paidShop, payStatus);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String currentTime = format.format(new Date());
|
|
|
+ //保存付供应商记录
|
|
|
+ CmPayShopPo payShop = new CmPayShopPo();
|
|
|
+ payShop.setShopID(shopId);
|
|
|
+ payShop.setName("线上支付分账");
|
|
|
+ payShop.setTotalAmount(splitAmount);
|
|
|
+ payShop.setWipePayment(BigDecimal.ZERO);
|
|
|
+ payShop.setPayType("6");
|
|
|
+ payShop.setStatus("1");
|
|
|
+ payShop.setDelFlag("0");
|
|
|
+ payShop.setApplyTime(currentTime);
|
|
|
+ payShop.setReviewTime(currentTime);
|
|
|
+ payShop.setPayTime(currentTime);
|
|
|
+ payOrderMapper.insertPayShop(payShop);
|
|
|
+
|
|
|
+ CmPayShopRecordPo shopRecord = new CmPayShopRecordPo();
|
|
|
+ shopRecord.setShopID(shopId);
|
|
|
+ shopRecord.setShopOrderID(shopOrderId);
|
|
|
+ shopRecord.setShopOrderNo(shopOrderNo);
|
|
|
+ shopRecord.setPayAmount(splitAmount);
|
|
|
+ shopRecord.setWipePayment(BigDecimal.ZERO);
|
|
|
+ shopRecord.setPayType("6");
|
|
|
+ shopRecord.setPayTime(currentTime);
|
|
|
+ shopRecord.setPayShopID(payShop.getId().intValue());
|
|
|
+ shopRecord.setStatus("1");
|
|
|
+ shopRecord.setDelFlag("0");
|
|
|
+ payOrderMapper.insertPayShopRecord(shopRecord);
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改主订单付款状态
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(orderId);
|
|
|
+ //子订单是否全部付款
|
|
|
+ boolean isPay = true;
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ if (!"3".equals(shopOrder.getPayStatus())) {
|
|
|
+ isPay = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isPay) {
|
|
|
+ payOrderMapper.updateOrderByPayStatus(orderId, "3");
|
|
|
+ } else {
|
|
|
+ payOrderMapper.updateOrderByPayStatus(orderId, "2");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("分账异步通知异常", e);
|
|
|
+ return "分账失败";
|
|
|
+ }
|
|
|
+ return "SUCCESS";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分账详情
|
|
|
+ */
|
|
|
+ private List<SplitAccountVo> splitBillDetail(OrderVo order, PaymentDto payment) {
|
|
|
+ List<SplitAccountVo> list = new ArrayList<>();
|
|
|
+ //本次支付金额,单位/元
|
|
|
+ BigDecimal payAmount = MathUtil.div(payment.getPayAmount(), 100);
|
|
|
+ //待分账总金额
|
|
|
+ BigDecimal splitAmount = payAmount;
|
|
|
+ //总手续费
|
|
|
+ BigDecimal procedureFee = BigDecimal.ZERO;
|
|
|
+ //手续费
|
|
|
+ procedureFee = MathUtil.mul(payAmount, 0.0038, 2);
|
|
|
+ if (MathUtil.compare(procedureFee, 0) == 0) {
|
|
|
+ procedureFee = new BigDecimal("0.01");
|
|
|
+ }
|
|
|
+ splitAmount = MathUtil.sub(splitAmount, procedureFee);
|
|
|
+ List<OrderProductVo> orderProductList = payOrderMapper.findAllOrderProduct(order.getOrderId());
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
+ BigDecimal costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum());
|
|
|
+ //不含税能开发票
|
|
|
+ if ("0".equals(orderProduct.getIncludedTax()) && !"3".equals(orderProduct.getInvoiceType())) {
|
|
|
+ //应付总税费
|
|
|
+ BigDecimal payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum());
|
|
|
+ costPrice = MathUtil.add(costPrice, payableTax);
|
|
|
+ }
|
|
|
+ //判断是否支付过
|
|
|
+ BigDecimal paidAmount = payOrderMapper.findPaidAmount(orderProduct.getOrderProductId());
|
|
|
+ if (paidAmount == null || MathUtil.compare(paidAmount, costPrice) < 0) {
|
|
|
+ if (paidAmount != null && MathUtil.compare(paidAmount, 0) > 0) {
|
|
|
+ costPrice = MathUtil.sub(costPrice, paidAmount);
|
|
|
+ }
|
|
|
+ //待分账金额>=本次待分账金额
|
|
|
+ if (MathUtil.compare(splitAmount, costPrice) > -1) {
|
|
|
+ splitAmount = MathUtil.sub(splitAmount, costPrice);
|
|
|
+ } else {
|
|
|
+ costPrice = splitAmount;
|
|
|
+ splitAmount = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ String commercialCode = payOrderMapper.findCommercialCode(orderProduct.getShopId());
|
|
|
+ SplitAccountVo splitAccount = new SplitAccountVo();
|
|
|
+ splitAccount.setOrderId(order.getOrderId());
|
|
|
+ splitAccount.setOrderProductId(orderProduct.getOrderProductId());
|
|
|
+ splitAccount.setShopId(orderProduct.getShopId().intValue());
|
|
|
+ splitAccount.setSplitAccount(costPrice);
|
|
|
+ splitAccount.setProductType("1");
|
|
|
+ if (StringUtils.isNotBlank(commercialCode)) {
|
|
|
+ //供应商拥有子商户号
|
|
|
+ splitAccount.setType("4");
|
|
|
+ splitAccount.setSubUserNo(commercialCode);
|
|
|
+ } else {
|
|
|
+ if ("3".equals(orderProduct.getInvoiceType())) {
|
|
|
+ //不能开票,则分账到私账-无票
|
|
|
+ splitAccount.setType("2");
|
|
|
+ splitAccount.setSubUserNo(privateAccountNo);
|
|
|
+ } else if ("1".equals(orderProduct.getInvoiceType())) {
|
|
|
+ //开增值税发票,则分账到公账-专票
|
|
|
+ splitAccount.setType("1");
|
|
|
+ splitAccount.setSubUserNo(publicAccountNo);
|
|
|
+ } else if ("2".equals(orderProduct.getInvoiceType())) {
|
|
|
+ //开普通发票,则分账到公账-普票
|
|
|
+ splitAccount.setType("3");
|
|
|
+ splitAccount.setSubUserNo(commonInvoiceNo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ list.add(splitAccount);
|
|
|
+ if (MathUtil.compare(splitAmount, 0) == 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //付供应商运费,是以供应商为单位的
|
|
|
+ if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(order.getOrderId());
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ //运费
|
|
|
+ BigDecimal shopPostFee = shopOrder.getShopPostFee();
|
|
|
+ if (MathUtil.compare(shopPostFee, 0) > 0) {
|
|
|
+ BigDecimal shipping = payOrderMapper.findShipping(order.getOrderId(), shopOrder.getShopId());
|
|
|
+ shopPostFee = MathUtil.sub(shopPostFee, shipping);
|
|
|
+ if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
|
|
|
+ splitAmount = MathUtil.sub(splitAmount, shipping);
|
|
|
+ } else {
|
|
|
+ shopPostFee = splitAmount;
|
|
|
+ splitAmount = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ String commercialCode = payOrderMapper.findCommercialCode(Long.valueOf(shopOrder.getShopId()));
|
|
|
+ SplitAccountVo splitAccount = new SplitAccountVo();
|
|
|
+ splitAccount.setOrderId(order.getOrderId());
|
|
|
+ splitAccount.setShopId(shopOrder.getShopId());
|
|
|
+ splitAccount.setSplitAccount(shopPostFee);
|
|
|
+ splitAccount.setProductType("2");
|
|
|
+ if (StringUtils.isNotBlank(commercialCode)) {
|
|
|
+ //供应商拥有子商户号
|
|
|
+ splitAccount.setType("4");
|
|
|
+ splitAccount.setSubUserNo(commercialCode);
|
|
|
+ } else {
|
|
|
+ //私账
|
|
|
+ splitAccount.setType("2");
|
|
|
+ splitAccount.setSubUserNo(privateAccountNo);
|
|
|
+ }
|
|
|
+ list.add(splitAccount);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //佣金,公账
|
|
|
+ if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
|
+ SplitAccountVo splitAccount = new SplitAccountVo();
|
|
|
+ splitAccount.setOrderId(order.getOrderId());
|
|
|
+ splitAccount.setSplitAccount(splitAmount);
|
|
|
+ splitAccount.setProductType("3");
|
|
|
+ splitAccount.setType("1");
|
|
|
+ splitAccount.setSubUserNo(publicAccountNo);
|
|
|
+ list.add(splitAccount);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 整理第三方支付详情参数
|
|
|
+ */
|
|
|
+ private String ledgerParameters(List<SplitAccountVo> splitBillDetail, Integer orderId) {
|
|
|
+ List<Map<String, String>> maps = new ArrayList<>();
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(orderId);
|
|
|
+ //供应商子商户总金额
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ BigDecimal shopTotalAmount = BigDecimal.ZERO;
|
|
|
+ String subUserNo = "";
|
|
|
+ for (SplitAccountVo account : splitBillDetail) {
|
|
|
+ if ("4".equals(account.getType()) && shopOrder.getShopId().equals(account.getShopId())) {
|
|
|
+ shopTotalAmount = MathUtil.add(shopTotalAmount, account.getSplitAccount());
|
|
|
+ subUserNo = account.getSubUserNo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ addMaps(maps, shopTotalAmount, subUserNo);
|
|
|
+ }
|
|
|
+ //公账-专票总金额,私账-无票总金额,公账-普票总金额
|
|
|
+ BigDecimal totalAmount1 = BigDecimal.ZERO;
|
|
|
+ BigDecimal totalAmount2 = BigDecimal.ZERO;
|
|
|
+ BigDecimal totalAmount3 = BigDecimal.ZERO;
|
|
|
+ for (SplitAccountVo account : splitBillDetail) {
|
|
|
+ if ("1".equals(account.getType())) {
|
|
|
+ totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount());
|
|
|
+ } else if ("2".equals(account.getType())) {
|
|
|
+ totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount());
|
|
|
+ } else if ("3".equals(account.getType())) {
|
|
|
+ totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ addMaps(maps, totalAmount1, publicAccountNo);
|
|
|
+ addMaps(maps, totalAmount2, privateAccountNo);
|
|
|
+ addMaps(maps, totalAmount3, commonInvoiceNo);
|
|
|
+ return JSON.toJSONString(maps);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void addMaps(List<Map<String, String>> maps, BigDecimal shopTotalAmount, String subUserNo) {
|
|
|
+ if (MathUtil.compare(shopTotalAmount, 0) > 0) {
|
|
|
+ Map<String, String> map = new HashMap<>(3);
|
|
|
+ map.put("subUserNo", subUserNo);
|
|
|
+ map.put("splitBillType", "2");
|
|
|
+ map.put("splitBillValue", MathUtil.mul(shopTotalAmount, 100).toString());
|
|
|
+ maps.add(map);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|