|
@@ -104,15 +104,23 @@ public class SplitAccountService extends BaseService {
|
|
* 自己成本部分不需要加入分账参数,仅需在else中做业务表参数处理
|
|
* 自己成本部分不需要加入分账参数,仅需在else中做业务表参数处理
|
|
*/
|
|
*/
|
|
if (!key.equals(shopOrder.getSplitCode())) {
|
|
if (!key.equals(shopOrder.getSplitCode())) {
|
|
- //佣金
|
|
|
|
|
|
+ // 佣金
|
|
AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
|
|
AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
|
|
- splitBillRule.setSplitBillAmount(value);
|
|
|
|
|
|
+ // 分账计算的时候未处理手续费,总额处理手续费 x + x * 0.1% = value
|
|
|
|
+ BigDecimal div = MathUtil.div(value, 1.001, 2);
|
|
|
|
+ if (MathUtil.sub(value, div).doubleValue() < 0.01) {
|
|
|
|
+ // 如果手续费小于最低手续费,取0.01
|
|
|
|
+ div = MathUtil.round(MathUtil.sub(value, 0.01), 2);
|
|
|
|
+ }
|
|
|
|
+ splitBillRule.setSplitBillAmount(div);
|
|
splitBillRule.setSplitBillMerchantNo(key);
|
|
splitBillRule.setSplitBillMerchantNo(key);
|
|
splitBillRules.add(splitBillRule);
|
|
splitBillRules.add(splitBillRule);
|
|
} else {
|
|
} else {
|
|
- // 成本分账处理
|
|
|
|
- // 子订单的splitcode和分账对象的splitcode一样的是留在账户里的钱,实际在付款完成后,付款状态就为已付款,分账状态就为已分账
|
|
|
|
- // 为维持业务完整性,保持原来的分账流程不变
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 成本分账处理
|
|
|
|
+ * 子订单的splitcode和分账对象的splitcode一样的是留在账户里的钱,实际在付款完成后,付款状态就为已付款,分账状态就为已分账
|
|
|
|
+ * 为维持业务完整性,保持原来的分账流程不变
|
|
|
|
+ */
|
|
List<SplitAccountPo> splitAccountList = newOrderDao.getSplitAccountList(orderRelation.getMbOrderId());
|
|
List<SplitAccountPo> splitAccountList = newOrderDao.getSplitAccountList(orderRelation.getMbOrderId());
|
|
if (splitAccountList != null && splitAccountList.size() > 0) {
|
|
if (splitAccountList != null && splitAccountList.size() > 0) {
|
|
Integer orderId = splitAccountList.get(0).getOrderId();
|
|
Integer orderId = splitAccountList.get(0).getOrderId();
|
|
@@ -311,19 +319,12 @@ public class SplitAccountService extends BaseService {
|
|
List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByShopOrderId(shopOrder.getShopOrderId());
|
|
List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByShopOrderId(shopOrder.getShopOrderId());
|
|
|
|
|
|
for (OrderProductVo orderProduct : orderProductList) {
|
|
for (OrderProductVo orderProduct : orderProductList) {
|
|
- //成本价*数量
|
|
|
|
- double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
|
|
|
|
|
|
+ // 价格 * 数量 * 供应商成本比例/100
|
|
|
|
+ double costPrice = MathUtil.mul(orderProduct.getTotalAmount(), orderProduct.getShopPercent() / 100, 2).doubleValue();
|
|
if (2 == supportFlag) {
|
|
if (2 == supportFlag) {
|
|
//供应商自己承担手续费
|
|
//供应商自己承担手续费
|
|
costPrice = MathUtil.sub(costPrice, procedureFee).doubleValue();
|
|
costPrice = MathUtil.sub(costPrice, procedureFee).doubleValue();
|
|
}
|
|
}
|
|
- // 不含税能开发票
|
|
|
|
- if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
|
|
|
|
- //应付总税费
|
|
|
|
- Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
|
|
|
|
- //成本+税费
|
|
|
|
- costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
|
|
|
|
- }
|
|
|
|
/**
|
|
/**
|
|
* todo
|
|
* todo
|
|
* 出于兼容性考虑,且多次支付手续费不同,分账方式为循环每次支付记录,
|
|
* 出于兼容性考虑,且多次支付手续费不同,分账方式为循环每次支付记录,
|
|
@@ -363,38 +364,9 @@ public class SplitAccountService extends BaseService {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- // 还有钱就付供应商运费
|
|
|
|
- // 付供应商运费,是以供应商为单位的
|
|
|
|
- if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
|
|
- // 运费
|
|
|
|
- Double shopPostFee = shopOrder.getShopPostFee();
|
|
|
|
- if (MathUtil.compare(shopPostFee, 0) > 0) {
|
|
|
|
- // 查询已支付运费
|
|
|
|
- Double shipping = newOrderDao.getPaidShipping(shopOrder.getOrderId(), shopOrder.getShopId());
|
|
|
|
- shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
|
|
|
|
- if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
|
|
|
|
- splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
|
|
|
|
- } else {
|
|
|
|
- shopPostFee = splitAmount;
|
|
|
|
- splitAmount = 0.00;
|
|
|
|
- }
|
|
|
|
- SplitAccountPo splitAccount = new SplitAccountPo();
|
|
|
|
- splitAccount.setOrderId(shopOrder.getOrderId());
|
|
|
|
- splitAccount.setShopId(shopOrder.getShopId());
|
|
|
|
- splitAccount.setSplitAccount(shopPostFee);
|
|
|
|
- splitAccount.setProductType(2);
|
|
|
|
- //供应商拥有子商户号
|
|
|
|
- splitAccount.setType(4);
|
|
|
|
- splitAccount.setSubUserNo(shopOrder.getSplitCode());
|
|
|
|
- logger.info("付供应商运费分账参数------------->" + splitAccount);
|
|
|
|
- list.add(splitAccount);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // 如果还有钱则为佣金,分到信息
|
|
|
|
|
|
+ // 如果还有钱则为佣金,分到网络
|
|
if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
- //分账手续费0.1%采美承担,佣金扣除0.1%
|
|
|
|
- Double amount = Math.max(MathUtil.mul(splitAmount, 0.001, 2).doubleValue(), 0.01);
|
|
|
|
- splitAmount = MathUtil.sub(splitAmount, amount).doubleValue();
|
|
|
|
|
|
+ // 此处不考虑手续费,外部计算总额
|
|
SplitAccountPo splitAccount = new SplitAccountPo();
|
|
SplitAccountPo splitAccount = new SplitAccountPo();
|
|
splitAccount.setOrderId(shopOrder.getOrderId());
|
|
splitAccount.setOrderId(shopOrder.getOrderId());
|
|
splitAccount.setShopOrderId(shopOrder.getShopOrderId());
|
|
splitAccount.setShopOrderId(shopOrder.getShopOrderId());
|
|
@@ -472,237 +444,5 @@ public class SplitAccountService extends BaseService {
|
|
throw new IllegalStateException("分账异常", e);
|
|
throw new IllegalStateException("分账异常", e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-}
|
|
|
|
-
|
|
|
|
-// //正式
|
|
|
|
-//// public static final String callUrl = "https://core.caimei365.com/order/pay/delay/split/callback";
|
|
|
|
-// //测试
|
|
|
|
-// public static final String callUrl = "https://core-b.caimei365.com/order/pay/delay/split/callback";
|
|
|
|
-
|
|
|
|
-// @Transactional(readOnly = false)
|
|
|
|
-// public void SplitAccount() {
|
|
|
|
-// logger.info("【手动分账开始】>>>>>>>>>>手动分账");
|
|
|
|
-// Calendar calendar = Calendar.getInstance();
|
|
|
|
-// calendar.setTime(new Date());
|
|
|
|
-// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
-// String currentTime = format.format(calendar.getTime());
|
|
|
|
-// // 查询未分账已支付收款
|
|
|
|
-// List<OrderReceiptRelationPo> orderRelations = newOrderDao.getUndividedPaidReceipt(currentTime);
|
|
|
|
-// if (null != orderRelations && orderRelations.size() > 0) {
|
|
|
|
-// for (OrderReceiptRelationPo orderRelation : orderRelations) {
|
|
|
|
-// logger.info("【手动分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + ",进入手动分账");
|
|
|
|
-// // 收款对应的订单信息
|
|
|
|
-// OrderVo order = newOrderDao.getOrderByOrderId(orderRelation.getOrderId());
|
|
|
|
-// PayParamBo payParam = new PayParamBo();
|
|
|
|
-// payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
|
|
|
|
-// if (12 == orderRelation.getPayType()) {
|
|
|
|
-// // 网银支付
|
|
|
|
-// payParam.setPayWay("UNIONPAY");
|
|
|
|
-// }
|
|
|
|
-// if (20 == orderRelation.getPayType()) {
|
|
|
|
-// payParam.setPayWay("TRANSFER");
|
|
|
|
-// }
|
|
|
|
-// List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(order, payParam);
|
|
|
|
-// List<Map<String, String>> maps = new ArrayList<>();
|
|
|
|
-// //供应商子商户金额
|
|
|
|
-// for (SplitAccountPo account : splitBillDetail) {
|
|
|
|
-// if (null != account.getType() && 4 == account.getType()) {
|
|
|
|
-// //每个有供应商子商户的分账给对应供应商子商户
|
|
|
|
-// addMaps(maps, account.getSplitAccount(), account.getSubUserNo());
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// //公账-专票总金额,私账-无票总金额,公账-普票总金额
|
|
|
|
-// //佣金进网络
|
|
|
|
-// double totalAmount1 = 0.00;
|
|
|
|
-// double totalAmount2 = 0.00;
|
|
|
|
-// double totalAmount3 = 0.00;
|
|
|
|
-// double totalAmount4 = 0.00;
|
|
|
|
-// for (SplitAccountPo account : splitBillDetail) {
|
|
|
|
-// if (1 == account.getType()) {
|
|
|
|
-// totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount()).doubleValue();
|
|
|
|
-// } else if (2 == account.getType()) {
|
|
|
|
-// totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount()).doubleValue();
|
|
|
|
-// } else if (3 == account.getType()) {
|
|
|
|
-// totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount()).doubleValue();
|
|
|
|
-// } else if (5 == account.getType()) {
|
|
|
|
-// totalAmount4 = MathUtil.add(totalAmount4, account.getSplitAccount()).doubleValue();
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// addMaps(maps, totalAmount1, PayUtil.publicAccountNo);
|
|
|
|
-// addMaps(maps, totalAmount2, PayUtil.privateAccountNo);
|
|
|
|
-// addMaps(maps, totalAmount3, PayUtil.commonInvoiceNo);
|
|
|
|
-// // 网络
|
|
|
|
-// addMaps(maps, totalAmount4, PayUtil.brokerage);
|
|
|
|
-//// addMaps(maps, totalAmount4, PayUtil.publicAccountNo);
|
|
|
|
-// String parameters = JSON.toJSONString(maps);
|
|
|
|
-// logger.info("【手动分账】>>>>>>>>>>分账参数: " + parameters);
|
|
|
|
-//
|
|
|
|
-// //第三方分账接口
|
|
|
|
-// JSONObject result = null;
|
|
|
|
-// try {
|
|
|
|
-// // 时间戳
|
|
|
|
-// long time = System.currentTimeMillis() / 1000;
|
|
|
|
-// JSONObject json = new JSONObject();
|
|
|
|
-// json.put("merAccount", PayUtil.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", callUrl);
|
|
|
|
-// logger.info("回调接口>>>" + callUrl);
|
|
|
|
-// String sign = PayUtil.getPaySign(json, PayUtil.merKey);
|
|
|
|
-// json.put("sign", sign);
|
|
|
|
-// logger.info("发送参数json----->" + json);
|
|
|
|
-// String data = PayUtil.privateKeyEncrypt(json, PayUtil.merKey);
|
|
|
|
-// result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/splitOrder/v1", PayUtil.merAccount, data);
|
|
|
|
-// } catch (Exception e) {
|
|
|
|
-// logger.error("【手动分账】>>>>>>>>>>错误信息", e);
|
|
|
|
-// }
|
|
|
|
-// if (result != null) {
|
|
|
|
-// String code = result.getString("code");
|
|
|
|
-// if (!"000000".equals(code)) {
|
|
|
|
-// String msg = result.getString("msg");
|
|
|
|
-// logger.info("【手动分账】>>>>>>>>>>第三方延迟分账失败>>>>>>>msg:" + msg);
|
|
|
|
-// } else {
|
|
|
|
-// for (SplitAccountPo splitAccount : splitBillDetail) {
|
|
|
|
-// splitAccount.setMbOrderId(orderRelation.getMbOrderId());
|
|
|
|
-// splitAccount.setOrderRequestNo(orderRelation.getOrderRequestNo());
|
|
|
|
-// splitAccount.setPayStatus(1);
|
|
|
|
-// // 保存分账详情
|
|
|
|
-// newOrderDao.insertSplitAccount(splitAccount);
|
|
|
|
-// redisService.remove("XSFZMDS");
|
|
|
|
-// }
|
|
|
|
-// logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-//
|
|
|
|
-//
|
|
|
|
-// /**
|
|
|
|
-// * 分账参数添加
|
|
|
|
-// */
|
|
|
|
-// private void addMaps(List<Map<String, String>> maps, Double 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 List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
|
|
|
|
-// List<SplitAccountPo> list = new ArrayList<>();
|
|
|
|
-// // 本次支付金额,单位/元
|
|
|
|
-// double payAmount = MathUtil.div(payParam.getPayAmount(), 100).doubleValue();
|
|
|
|
-// // 待分账总金额
|
|
|
|
-// double splitAmount = payAmount;
|
|
|
|
-// // 总手续费
|
|
|
|
-// double procedureFee;
|
|
|
|
-// if ("UNIONPAY".equals(payParam.getPayWay())) {
|
|
|
|
-// procedureFee = 8.00;
|
|
|
|
-// } else {
|
|
|
|
-// //手续费
|
|
|
|
-// procedureFee = MathUtil.mul(payAmount, 0.0038, 2).doubleValue();
|
|
|
|
-// if (MathUtil.compare(procedureFee, 0) == 0) {
|
|
|
|
-// procedureFee = 0.01;
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
|
|
|
|
-// // 商品数据
|
|
|
|
-// List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByOrderId(order.getOrderId());
|
|
|
|
-// for (OrderProductVo orderProduct : orderProductList) {
|
|
|
|
-// double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
|
|
|
|
-// // 不含税能开发票
|
|
|
|
-// if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
|
|
|
|
-// //应付总税费
|
|
|
|
-// Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
|
|
|
|
-// costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
|
|
|
|
-// }
|
|
|
|
-// // 判断是否支付过
|
|
|
|
-// Double paidAmount = newOrderDao.getOrderProductPaidAmount(orderProduct.getOrderProductId());
|
|
|
|
-// //有已付
|
|
|
|
-// if (null != paidAmount && MathUtil.compare(paidAmount, 0) > 0) {
|
|
|
|
-// //已付>0,成本-已付
|
|
|
|
-// costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
|
|
|
|
-// }
|
|
|
|
-// // 待分账金额>成本
|
|
|
|
-// if (MathUtil.compare(splitAmount, costPrice) > 0) {
|
|
|
|
-// // 待分账金额-成本
|
|
|
|
-// splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
|
|
|
|
-// } else {
|
|
|
|
-// costPrice = splitAmount;
|
|
|
|
-// splitAmount = 0.00;
|
|
|
|
-// }
|
|
|
|
-// if (costPrice > 0) {
|
|
|
|
-// SplitAccountPo splitAccount = new SplitAccountPo();
|
|
|
|
-// splitAccount.setOrderId(order.getOrderId());
|
|
|
|
-// splitAccount.setOrderProductId(orderProduct.getOrderProductId());
|
|
|
|
-// splitAccount.setShopId(orderProduct.getShopId());
|
|
|
|
-// splitAccount.setSplitAccount(costPrice);
|
|
|
|
-// splitAccount.setProductType(1);
|
|
|
|
-// if (StringUtils.isNotBlank(orderProduct.getSplitCode())) {
|
|
|
|
-// // 该商品设置了商户号
|
|
|
|
-// splitAccount.setType(4);
|
|
|
|
-// splitAccount.setSubUserNo(orderProduct.getSplitCode());
|
|
|
|
-// }
|
|
|
|
-// logger.info("成本分账参数------------->" + splitAccount.toString());
|
|
|
|
-// list.add(splitAccount);
|
|
|
|
-// }
|
|
|
|
-// if (MathUtil.compare(splitAmount, 0) == 0) {
|
|
|
|
-// break;
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// // 付供应商运费,是以供应商为单位的
|
|
|
|
-// if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
|
|
-// List<ShopOrderVo> shopOrderList = newOrderDao.getShopOrderListByOrderId(order.getOrderId());
|
|
|
|
-// for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
|
-// // 运费
|
|
|
|
-// Double shopPostFee = shopOrder.getShopPostFee();
|
|
|
|
-// if (MathUtil.compare(shopPostFee, 0) > 0) {
|
|
|
|
-// // 查询已支付运费
|
|
|
|
-// Double shipping = newOrderDao.getPaidShipping(order.getOrderId(), shopOrder.getShopId());
|
|
|
|
-// shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
|
|
|
|
-// if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
|
|
|
|
-// splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
|
|
|
|
-// } else {
|
|
|
|
-// shopPostFee = splitAmount;
|
|
|
|
-// splitAmount = 0.00;
|
|
|
|
-// }
|
|
|
|
-// String commercialCode = newOrderDao.getShopCommercialCode(shopOrder.getShopId());
|
|
|
|
-// SplitAccountPo splitAccount = new SplitAccountPo();
|
|
|
|
-// splitAccount.setOrderId(order.getOrderId());
|
|
|
|
-// splitAccount.setShopId(shopOrder.getShopId());
|
|
|
|
-// splitAccount.setSplitAccount(shopPostFee);
|
|
|
|
-// splitAccount.setProductType(2);
|
|
|
|
-// if (StringUtils.isNotBlank(commercialCode)) {
|
|
|
|
-// //供应商拥有子商户号
|
|
|
|
-// splitAccount.setType(4);
|
|
|
|
-// splitAccount.setSubUserNo(commercialCode);
|
|
|
|
-// }
|
|
|
|
-// logger.info("付供应商运费分账参数------------->" + splitAccount);
|
|
|
|
-// list.add(splitAccount);
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// //佣金,公账
|
|
|
|
-// if (MathUtil.compare(splitAmount, 0) > 0) {
|
|
|
|
-// SplitAccountPo splitAccount = new SplitAccountPo();
|
|
|
|
-// splitAccount.setOrderId(order.getOrderId());
|
|
|
|
-// splitAccount.setSplitAccount(splitAmount);
|
|
|
|
-// splitAccount.setProductType(3);
|
|
|
|
-// splitAccount.setType(5);
|
|
|
|
-// //佣金进采美网络
|
|
|
|
-// splitAccount.setSubUserNo(PayUtil.brokerage);
|
|
|
|
-// logger.info("佣金分账参数------------->" + splitAccount);
|
|
|
|
-// list.add(splitAccount);
|
|
|
|
-// }
|
|
|
|
-// return list;
|
|
|
|
-// }
|
|
|
|
|
|
|
|
|
|
+}
|