|
@@ -1,12 +1,17 @@
|
|
|
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.*;
|
|
|
-import com.caimei.model.vo.*;
|
|
|
+import com.caimei.model.po.CmDiscernReceiptPo;
|
|
|
+import com.caimei.model.po.CmReceiptOrderRelationPo;
|
|
|
+import com.caimei.model.po.UserPo;
|
|
|
+import com.caimei.model.vo.DiscernReceiptVo;
|
|
|
+import com.caimei.model.vo.OrderPayLinkVo;
|
|
|
+import com.caimei.model.vo.OrderProductVo;
|
|
|
+import com.caimei.model.vo.OrderVo;
|
|
|
import com.caimei.service.PayOrderService;
|
|
|
import com.caimei.util.MathUtil;
|
|
|
import com.caimei.util.Md5Util;
|
|
@@ -37,6 +42,8 @@ import java.util.*;
|
|
|
public class PayOrderServiceImpl implements PayOrderService {
|
|
|
@Resource
|
|
|
private PayOrderMapper payOrderMapper;
|
|
|
+ @Resource
|
|
|
+ private OrderMapper orderMapper;
|
|
|
|
|
|
/**
|
|
|
* 商户标识
|
|
@@ -54,18 +61,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
* 用户编号
|
|
|
*/
|
|
|
String merNo = "10001720";
|
|
|
- /**
|
|
|
- * 公账-专票,子商户商编
|
|
|
- */
|
|
|
- String publicAccountNo = "20001793";
|
|
|
- /**
|
|
|
- * 公账-普票,子商户商编
|
|
|
- */
|
|
|
- String commonInvoiceNo = "20001754";
|
|
|
- /**
|
|
|
- * 私账-无票,子商户商编
|
|
|
- */
|
|
|
- String privateAccountNo = "20001924";
|
|
|
|
|
|
/**
|
|
|
* 获取线上支付开关状态
|
|
@@ -81,7 +76,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
@Override
|
|
|
public ResponseJson<Map<String, Object>> checkoutCounter(Integer orderId) {
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
- OrderVo order = payOrderMapper.findOrder(orderId);
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
if (null == order) {
|
|
|
return ResponseJson.error("订单不存在", null);
|
|
|
}
|
|
@@ -122,7 +117,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
@Override
|
|
|
public synchronized ResponseJson<JSONObject> pay(PaymentDto payment) {
|
|
|
JSONObject result = null;
|
|
|
- OrderVo order = payOrderMapper.findOrder(payment.getOrderId());
|
|
|
+ OrderVo order = orderMapper.findOrder(payment.getOrderId());
|
|
|
if (null == order) {
|
|
|
return ResponseJson.error("订单不存在", null);
|
|
|
}
|
|
@@ -142,7 +137,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
if (MathUtil.compare(MathUtil.mul(order.getPayableAmount(), 100), payment.getPayAmount()) < 0) {
|
|
|
return ResponseJson.error("付款金额错误", null);
|
|
|
}
|
|
|
- //List<SplitAccountVo> splitBillDetail = null;
|
|
|
try {
|
|
|
// 时间戳
|
|
|
long time = System.currentTimeMillis() / 1000;
|
|
@@ -157,11 +151,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
String payType = getPayType(payment);
|
|
|
String attach = order.getOrderId() + "," + payType;
|
|
|
json.put("attach", attach);
|
|
|
- //分账详情
|
|
|
- /*splitBillDetail = splitBillDetail(order, payment);
|
|
|
- String parameters = ledgerParameters(splitBillDetail, order.getOrderID());
|
|
|
- log.info("分账参数: " + parameters);
|
|
|
- json.put("splitBillDetail", parameters);*/
|
|
|
String sign = PayUtils.buildSign(json, merKey);
|
|
|
json.put("sign", sign);
|
|
|
String data = PayUtils.buildDataPrivate(json, merKey);
|
|
@@ -176,74 +165,9 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
log.info("第三方支付失败>>>>>>>msg:" + msg);
|
|
|
return ResponseJson.error(msg, null);
|
|
|
}
|
|
|
-
|
|
|
- //保存分账信息
|
|
|
- //saveSplitBillDetail(splitBillDetail, result);
|
|
|
return ResponseJson.success(result);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 整理第三方支付详情参数
|
|
|
- */
|
|
|
- private String ledgerParameters(List<SplitAccountVo> splitBillDetail, Integer orderId) {
|
|
|
- List<Map<String, String>> maps = new ArrayList<>();
|
|
|
- List<ShopOrderVo> shopOrderList = payOrderMapper.findShopOrder(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);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 保存分账信息
|
|
|
- */
|
|
|
- private void saveSplitBillDetail(List<SplitAccountVo> splitBillDetail, JSONObject result) {
|
|
|
- JSONObject data = result.getJSONObject("data");
|
|
|
- String mbOrderId = data.getString("mbOrderId");
|
|
|
- String orderRequestNo = data.getString("orderId");
|
|
|
- for (SplitAccountVo splitAccount : splitBillDetail) {
|
|
|
- splitAccount.setMbOrderId(mbOrderId);
|
|
|
- splitAccount.setOrderRequestNo(orderRequestNo);
|
|
|
- splitAccount.setPayStatus("0");
|
|
|
- payOrderMapper.insertSplitAccount(splitAccount);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 设置第三方支付参数
|
|
|
*/
|
|
@@ -270,130 +194,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
return json;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 分账详情
|
|
|
- */
|
|
|
- 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;
|
|
|
- if ("UNIONPAY".equals(payment.getPayWay())) {
|
|
|
- procedureFee = new BigDecimal(8);
|
|
|
- } else {
|
|
|
- //手续费
|
|
|
- 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 = payOrderMapper.findShopOrder(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("2");
|
|
|
- splitAccount.setSubUserNo(privateAccountNo);
|
|
|
- list.add(splitAccount);
|
|
|
- }
|
|
|
- return list;
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public String paymentCallback(String data) throws Exception {
|
|
@@ -426,7 +226,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
Integer orderId = Integer.valueOf(split[0]);
|
|
|
//支付类型
|
|
|
String payType = split[1];
|
|
|
- OrderVo order = payOrderMapper.findOrder(orderId);
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
//支付记录
|
|
|
List<DiscernReceiptVo> discernReceiptList = payOrderMapper.getDiscernReceipt(order);
|
|
|
BigDecimal receiptAmount = BigDecimal.ZERO;
|
|
@@ -506,8 +306,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
relation.setSplitStatus("0");
|
|
|
payOrderMapper.insertOrderRelation(relation);
|
|
|
log.info(">>>>>>>>>>>>>>>>>>>>>>>保存付款金额到收款记录," + amount);
|
|
|
- //修改分账付款状态
|
|
|
- //payOrderMapper.updateSplitAccountByPay(mbOrderId);
|
|
|
return "SUCCESS";
|
|
|
}
|
|
|
|
|
@@ -539,7 +337,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
if (null == orderPayLink) {
|
|
|
return ResponseJson.error("参数异常", null);
|
|
|
}
|
|
|
- OrderVo order = payOrderMapper.findOrder(orderPayLink.getOrderId().intValue());
|
|
|
+ OrderVo order = orderMapper.findOrder(orderPayLink.getOrderId().intValue());
|
|
|
if (null == order) {
|
|
|
return ResponseJson.error("订单不存在", null);
|
|
|
}
|
|
@@ -586,9 +384,9 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
int code = 0;
|
|
|
if (null == orderPayLink) {
|
|
|
//已重新生成链接
|
|
|
- return ResponseJson.error("链接更新,请重新获取");
|
|
|
+ return ResponseJson.error("链接更新,请重新获取", null);
|
|
|
} else {
|
|
|
- OrderVo order = payOrderMapper.findOrder(orderPayLink.getOrderId().intValue());
|
|
|
+ OrderVo order = orderMapper.findOrder(orderPayLink.getOrderId().intValue());
|
|
|
List<DiscernReceiptVo> discernReceiptList = payOrderMapper.getDiscernReceipt(order);
|
|
|
if (orderPayLink.getEffectiveTime().compareTo(new Date()) < 0) {
|
|
|
//链接失效
|
|
@@ -617,7 +415,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
|
|
|
@Override
|
|
|
public ResponseJson<String> payWhetherSuccess(Integer orderId, Integer paySuccessCounter) {
|
|
|
- OrderVo order = payOrderMapper.findOrder(orderId);
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
if (order.getPaySuccessCounter().equals(paySuccessCounter)) {
|
|
|
return ResponseJson.error(-2, "支付失败", null);
|
|
|
} else if (order.getPaySuccessCounter() > paySuccessCounter) {
|