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 getPayOnLineSwitch() { Integer status = payOrderMapper.getPayOnLineSwitch(); return ResponseJson.success(status); } @Override public synchronized ResponseJson 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 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 couponIds = couponMapper.getCurrentCouponIds(5); couponIds.forEach(couponId->{ couponShare.setType(2); couponShare.setShareCouponId(couponId); couponMapper.insertCouponShare(couponShare); BigDecimal couponAmount = couponMapper.getCouponAmount(couponId); HashMap 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 orderIdList = collageMapper.findNoPayCollageOrderIds(collage.getId()); orderIdList.forEach(noPayOrderId->{ orderMapper.cancelOrder(noPayOrderId, "拼团完成关闭其它未支付拼团订单"); }); HashMap map = new HashMap<>(); String mobile = collageMapper.getUserMobileByOrderId(orderId); List 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 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 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 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 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 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 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 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 splitBillDetail(OrderVo order, PaymentDto payment) { List 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 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 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 splitBillDetail, Integer orderId) { List> maps = new ArrayList<>(); List 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> maps, BigDecimal shopTotalAmount, String subUserNo) { if (MathUtil.compare(shopTotalAmount, 0) > 0) { Map map = new HashMap<>(3); map.put("subUserNo", subUserNo); map.put("splitBillType", "2"); map.put("splitBillValue", MathUtil.mul(shopTotalAmount, 100).toString()); maps.add(map); } } }