123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738 |
- package com.caimei.service.impl;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.caimei.mapper.*;
- import com.caimei.model.ResponseJson;
- import com.caimei.model.dto.PaymentDto;
- import com.caimei.model.po.*;
- import com.caimei.model.vo.*;
- import com.caimei.service.PayOrderService;
- import com.caimei.util.HttpRequest;
- 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.*;
- /**
- * Description
- *
- * @author : plf
- * @date : 2020/5/9
- */
- @Service
- @Slf4j
- public class PayOrderServiceImpl implements PayOrderService {
- @Resource
- private PayOrderMapper payOrderMapper;
- @Resource
- private OrderMapper orderMapper;
- @Resource
- private CouponMapper couponMapper;
- @Resource
- private CollageMapper collageMapper;
- @Value("${caimei.delayedSplittingUrl}")
- private String delayedSplittingUrl;
- @Value("${caimei.cloudApi}")
- private String cloudApi;
- /**
- * 商户标识
- */
- String merAccount = "150a5459416b4046b9153c1cd442e397";
- /**
- * 私钥,商户密钥
- */
- 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 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIIKVatktSSx9LM8bqxIFU8+CU6aMjuv2K3lT98Zdm3FY/HpFVPhgcC1zYaJMTmr4GNdel8UnIpxT2v1aFoWlc8i027ys+QessrbkXNzpEqnQ4/N4wpPpqZieVLgkUN43rGmQMUaTy8y3PfbD7Q+8Z8xHfVFhvB5Z5ugE5phEIQwIDAQAB";
- /**
- * 用户编号
- */
- 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) {
- JSONObject result = null;
- OrderVo order = orderMapper.findOrder(payment.getOrderId());
- if (null == order) {
- return ResponseJson.error("订单不存在", null);
- }
- if ("0".equals(order.getStatus()) || "33".equals(order.getStatus()) || "4".equals(order.getStatus()) || "5".equals(order.getStatus())
- || "6".equals(order.getStatus()) || "7".equals(order.getStatus())) {
- return ResponseJson.error("订单状态错误", null);
- }
- log.info("本次付款金额>>>>>" + payment.getPayAmount());
- if (MathUtil.compare(MathUtil.mul(order.getPayableAmount(), 100), payment.getPayAmount()) < 0) {
- return ResponseJson.error("付款金额错误", null);
- }
- try {
- // 时间戳
- long time = System.currentTimeMillis() / 1000;
- JSONObject json = getPayParameter(payment, time);
- // 商户订单号
- String orderId = order.getOrderNo() + "T" + time;
- json.put("orderId", orderId);
- //商品名称
- String product = "采美订单" + order.getOrderNo();
- json.put("product", product);
- //支付类型
- String payType = getPayType(payment);
- String attach = order.getOrderId() + "," + payType;
- json.put("attach", attach);
- 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/order/v1", merAccount, data);
- } catch (Exception e) {
- log.error("错误信息", e);
- return ResponseJson.error("支付失败", null);
- }
- String code = result.getString("code");
- if (!"000000".equals(code)) {
- String msg = result.getString("msg");
- log.info("第三方支付失败>>>>>>>msg:" + msg);
- return ResponseJson.error(msg, null);
- }
- return ResponseJson.success(result);
- }
- /**
- * 设置第三方支付参数
- */
- private JSONObject getPayParameter(PaymentDto payment, long time) {
- JSONObject json = new JSONObject();
- json.put("merAccount", merAccount);
- json.put("merNo", merNo);
- json.put("time", time);
- //支付金额
- json.put("amount", payment.getPayAmount());
- json.put("payWay", payment.getPayWay());
- json.put("payType", payment.getPayType());
- json.put("userIp", payment.getClientIp());
- json.put("returnUrl", payment.getReturnUrl());
- json.put("notifyUrl", payment.getNotifyUrl());
- if (StringUtils.isNotBlank(payment.getBankCode())) {
- json.put("bankCode", payment.getBankCode());
- }
- if (StringUtils.isNotBlank(payment.getOpenid())) {
- json.put("openId", payment.getOpenid());
- }
- return json;
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public String paymentCallback(String data) throws Exception {
- //公钥解密
- 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 orderStatus = json.getString("orderStatus");
- //附加数据,下单时若有传输则原样返回,下单时为空,则不返回该数据
- String attach = json.getString("attach");
- //平台唯一流水号
- String mbOrderId = json.getString("mbOrderId");
- //商户唯一订单号
- String orderRequestNo = json.getString("orderId");
- //订单金额,以元为单位
- BigDecimal amount = json.getBigDecimal("amount");
- log.info("订单状态>>>>>>" + orderStatus);
- if ("FAILED".equals(orderStatus)) {
- return "支付失败";
- }
- String[] split = attach.split(",");
- //订单id
- Integer orderId = Integer.valueOf(split[0]);
- //支付类型
- String payType = split[1];
- OrderVo order = orderMapper.findOrder(orderId);
- //支付记录
- List<DiscernReceiptVo> discernReceiptList = payOrderMapper.getDiscernReceipt(order);
- BigDecimal receiptAmount = BigDecimal.ZERO;
- if (null != discernReceiptList && discernReceiptList.size() > 0) {
- for (DiscernReceiptVo discernReceipt : discernReceiptList) {
- receiptAmount = receiptAmount.add(discernReceipt.getAssociateAmount());
- }
- }
- //已付金额+本次支付金额
- receiptAmount = MathUtil.add(receiptAmount, amount);
- log.info("已付金额+本次支付金额>>>>>>>" + receiptAmount);
- if (MathUtil.compare(order.getPayableAmount(), receiptAmount) == 0) {
- /*
- * 订单全部支付
- * 0待确认,11待收待发,12待收部发,13待收全发,21部收待发,22部收部发,23部收全发,
- * 31已收待发,32已收部发,33已收全发,4交易完成,5订单完成,6已关闭,7交易全退
- */
- if ("11".equals(order.getStatus()) || "21".equals(order.getStatus())) {
- order.setStatus("31");
- } else if ("12".equals(order.getStatus()) || "22".equals(order.getStatus())) {
- order.setStatus("32");
- } else {
- order.setStatus("33");
- }
- order.setPayFlag(1);
- order.setOnlinePayFlag(0);
- //(收款买家)收款状态:1待收款、2部分收款、3已收款
- order.setReceiptStatus(3);
- log.info("订单全部支付,修改订单状态>>>>>>" + order.getStatus());
- /*
- * 保存好友消费券赠送记录
- */
- // 查询好友邀请记录
- CouponSharePo couponShare = couponMapper.getCouponShareId(order.getUserId());
- if (null != couponShare) {
- List<Integer> couponIds = couponMapper.getCurrentCouponIds(5);
- couponIds.forEach(couponId->{
- couponShare.setType(2);
- couponShare.setShareCouponId(couponId);
- couponMapper.insertCouponShare(couponShare);
- BigDecimal couponAmount = couponMapper.getCouponAmount(couponId);
- HashMap<String, Object> map = new HashMap<>();
- String mobile = couponMapper.getUserMobile(couponShare.getShareUserId());
- String content = "恭喜您邀请的好友已成功消费一笔订单,现赠送" + couponAmount + "元优惠券到您的领券中心,请赶紧登录颜选美学小程序领取下单吧。退订回T";
- map.put("type", 3);
- map.put("mobile", mobile);
- map.put("content", content);
- String url = cloudApi + "/tools/sms/send";
- try {
- String result = HttpRequest.sendPost(url, map);
- log.info("【颜选美学好友消费券派送】mobile:" + mobile + ",result:" + result);
- // 保存短信发送条数+count
- couponMapper.updateSmsSendCount(19, 1);
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- }
- // 拼团数据更新
- CmHeheCollagePo collage = collageMapper.getCollageByOrderId(orderId);
- if (null != collage) {
- if (1 == collage.getLaunchFlag()) {
- // 拼团发起人支付订单,正式建立拼团
- collage.setStatus(1);
- Date startTime = new Date();
- collage.setStartTime(startTime);
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(startTime);
- calendar.add(Calendar.DAY_OF_MONTH, 1);
- collage.setEndTime(calendar.getTime());
- collageMapper.createCollage(collage);
- } else {
- // 已拼且已支付人数
- Integer memberNum = collageMapper.findCollageMemberNum(collage.getId());
- if (memberNum + 1 == collage.getMemberNum()) {
- // 拼团成功
- collage.setStatus(2);
- collage.setCompleteTime(new Date());
- collageMapper.completeCollage(collage);
- // 关闭其它未支付拼团订单
- List<Integer> orderIdList = collageMapper.findNoPayCollageOrderIds(collage.getId());
- orderIdList.forEach(noPayOrderId->{
- orderMapper.cancelOrder(noPayOrderId, "拼团完成关闭其它未支付拼团订单");
- });
- HashMap<String, Object> map = new HashMap<>();
- String mobile = collageMapper.getUserMobileByOrderId(orderId);
- List<String> mobileList = collageMapper.getMobilesByCollageId(collage.getId());
- mobileList.add(mobile);
- String content = "您的商品已拼团成功,请赶紧登录颜选美学小程序查看订单吧。";
- map.put("type", 1);
- map.put("content", content);
- String url = cloudApi + "/tools/sms/send";
- try {
- for (String userMobile : mobileList) {
- map.put("mobile", userMobile);
- String result = HttpRequest.sendPost(url, map);
- log.info("【颜选美学拼团成功短信派送】mobile:" + mobile + ",result:" + result);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
- } else {
- //部分支付
- if ("11".equals(order.getStatus()) || "21".equals(order.getStatus())) {
- order.setStatus("21");
- } else if ("12".equals(order.getStatus()) || "22".equals(order.getStatus())) {
- order.setStatus("22");
- } else {
- order.setStatus("23");
- }
- order.setOnlinePayFlag(0);
- //(收款买家)收款状态:1待收款、2部分收款、3已收款
- order.setReceiptStatus(2);
- }
- //更新付款次数
- order.setPaySuccessCounter(order.getPaySuccessCounter() + 1);
- payOrderMapper.updateSelective(order);
- //保存收款记录
- String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
- CmDiscernReceiptPo discernReceipt = new CmDiscernReceiptPo();
- discernReceipt.setPayWay("1");
- discernReceipt.setPayType(payType);
- discernReceipt.setReceiptType("1");
- discernReceipt.setReceiptStatus("3");
- discernReceipt.setReceiptAmount(amount);
- discernReceipt.setConfirmType("4");
- discernReceipt.setRePayFlag("1");
- discernReceipt.setFormData(json.toJSONString());
- discernReceipt.setReceiptDate(curDateStr);
- discernReceipt.setConfirmDate(curDateStr);
- discernReceipt.setReviewDate(curDateStr);
- discernReceipt.setUpdateDate(curDateStr);
- discernReceipt.setDelFlag("0");
- payOrderMapper.insertDiscernReceipt(discernReceipt);
- CmReceiptOrderRelationPo relation = new CmReceiptOrderRelationPo();
- relation.setReceiptID(discernReceipt.getId().intValue());
- relation.setOrderID(order.getOrderId());
- relation.setAssociateAmount(amount);
- relation.setRelationType("2");
- relation.setMbOrderId(mbOrderId);
- relation.setOrderRequestNo(orderRequestNo);
- relation.setDelFlag("0");
- relation.setSplitStatus("0");
- payOrderMapper.insertOrderRelation(relation);
- log.info(">>>>>>>>>>>>>>>>>>>>>>>保存付款金额到收款记录," + amount);
- return "SUCCESS";
- }
- /**
- * 支付状态转换
- */
- private String getPayType(PaymentDto payment) {
- String payType = payment.getPayType();
- if ("ALIPAY_H5".equals(payType)) {
- //支付宝H5
- return "14";
- } else if ("JSAPI_WEIXIN".equals(payType)) {
- //微信公众号支付
- return "13";
- } else if ("MINIAPP_WEIXIN".equals(payType)) {
- //微信小程序支付
- return "15";
- } else if ("GATEWAY_UNIONPAY".equals(payType) && "ENTERPRISE".equals(payment.getUserType())) {
- //企业网银
- return "12";
- } else {
- //个人网银
- return "17";
- }
- }
- @Override
- public ResponseJson<String> payWhetherSuccess(Integer orderId, Integer paySuccessCounter) {
- OrderVo order = orderMapper.findOrder(orderId);
- if (order.getPaySuccessCounter().equals(paySuccessCounter)) {
- return ResponseJson.error(-2, "支付失败", null);
- } else if (order.getPaySuccessCounter() > paySuccessCounter) {
- return ResponseJson.success("支付成功");
- } else {
- return ResponseJson.error("支付异常>>>>>>>" + order, null);
- }
- }
- @Override
- public ResponseJson<JSONObject> findOrderStatus(String mbOrderId) {
- // 时间戳
- long time = System.currentTimeMillis() / 1000;
- JSONObject json = new JSONObject();
- json.put("merAccount", merAccount);
- json.put("mbOrderId", mbOrderId);
- json.put("time", time);
- String sign = PayUtils.buildSign(json, merKey);
- json.put("sign", sign);
- String data = "";
- try {
- data = PayUtils.buildDataPrivate(json, merKey);
- } catch (Exception e) {
- log.error("错误信息", e);
- }
- JSONObject result = PayUtils.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/query/v1_1", merAccount, data);
- String code = result.getString("code");
- if (!"000000".equals(code)) {
- String msg = result.getString("msg");
- log.info("第三方查询订单失败>>>>>>>msg:" + msg);
- return ResponseJson.error(msg, null);
- }
- 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);
- Integer payStatus = null;
- for (ShopOrderVo shopOrder : shopOrderList) {
- if (shopId.equals(shopOrder.getShopId())) {
- shopOrderId = shopOrder.getShopOrderId();
- shopOrderNo = shopOrder.getShopOrderNo();
- //已付供应商金额
- Double paidAmount = payOrderMapper.findPaidShop(shopOrderId);
- Double paidShop = MathUtil.add(paidAmount, splitAmount).doubleValue();
- 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());
- //保存付供应商记录
- PayShopPo payShop = new PayShopPo();
- payShop.setShopId(shopId);
- payShop.setName("线上支付分账");
- payShop.setTotalAmount(splitAmount.doubleValue());
- payShop.setWipePayment(0d);
- payShop.setPayType(6);
- payShop.setStatus(1);
- payShop.setDelFlag(0);
- payShop.setApplyTime(currentTime);
- payShop.setReviewTime(currentTime);
- payShop.setPayTime(currentTime);
- payOrderMapper.insertPayShop(payShop);
- PayShopRecordPo shopRecord = new PayShopRecordPo();
- shopRecord.setShopId(shopId);
- shopRecord.setShopOrderId(shopOrderId);
- shopRecord.setShopOrderNo(shopOrderNo);
- shopRecord.setPayAmount(splitAmount.doubleValue());
- shopRecord.setWipePayment(0d);
- shopRecord.setPayType(6);
- shopRecord.setPayTime(currentTime);
- shopRecord.setPayShopId(payShop.getId());
- shopRecord.setStatus(1);
- shopRecord.setDelFlag(0);
- payOrderMapper.insertPayShopRecord(shopRecord);
- }
- //修改主订单付款状态
- List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(orderId);
- //子订单是否全部付款
- boolean isPay = true;
- for (ShopOrderVo shopOrder : shopOrderList) {
- if (3 != 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);
- }
- }
- log.info("分账详情(成本):" + splitAccount);
- 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, shopPostFee);
- } 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);
- }
- log.info("分账详情(付供应商运费):" + splitAccount);
- 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);
- log.info("分账详情(佣金):" + splitAccount);
- 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);
- }
- }
- }
|