SplitAccountService.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. package com.caimei.modules.order.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.caimei.modules.order.dao.NewOrderDao;
  5. import com.caimei.modules.order.entity.*;
  6. import com.caimei.modules.order.utils.Disguiser;
  7. import com.caimei.modules.order.utils.PayUtil;
  8. import com.caimei.redis.RedisService;
  9. import com.caimei.utils.MathUtil;
  10. import com.thinkgem.jeesite.common.persistence.Page;
  11. import okhttp3.*;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import javax.annotation.Resource;
  18. import java.io.IOException;
  19. import java.lang.reflect.Field;
  20. import java.math.BigDecimal;
  21. import java.text.SimpleDateFormat;
  22. import java.util.*;
  23. import java.util.concurrent.TimeUnit;
  24. import java.util.stream.Collectors;
  25. @Service
  26. @Transactional(readOnly = true)
  27. public class SplitAccountService {
  28. public static OkHttpClient client = new OkHttpClient.Builder()
  29. .connectTimeout(3, TimeUnit.SECONDS)
  30. .readTimeout(20, TimeUnit.SECONDS)
  31. .build();
  32. /**
  33. * 日志对象
  34. */
  35. private static Logger logger = LoggerFactory.getLogger(Logger.class);
  36. @Resource
  37. private NewOrderDao newOrderDao;
  38. @Resource
  39. private RedisService redisService;
  40. @Transactional(readOnly = false)
  41. public void SplitAccount() {
  42. logger.info("【手动分账开始】>>>>>>>>>>手动分账");
  43. Calendar calendar = Calendar.getInstance();
  44. calendar.setTime(new Date());
  45. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  46. String currentTime = format.format(calendar.getTime());
  47. // 查询未分账已支付收款
  48. List<OrderReceiptRelationPo> orderRelations = newOrderDao.getUndividedPaidReceipt(currentTime);
  49. if (null != orderRelations && orderRelations.size() > 0) {
  50. for (OrderReceiptRelationPo orderRelation : orderRelations) {
  51. logger.info("【分账】>>>>>>>>>>子订单id:" + orderRelation.getShopOrderId() + "进入分账");
  52. // 收款对应的订单信息
  53. ShopOrderVo shopOrder = newOrderDao.getShopOrderListByOrderId(orderRelation.getShopOrderId());
  54. PayParamBo payParam = new PayParamBo();
  55. //支付金额
  56. payParam.setAllPay(orderRelation.getAssociateAmount());
  57. if (12 == orderRelation.getPayType()) {
  58. // 网银支付
  59. payParam.setPayWay("UNIONPAY");
  60. }
  61. if (17 == orderRelation.getPayType()) {
  62. //b2c网银
  63. payParam.setPayWay("B2C");
  64. }
  65. //微信0.65%手续费
  66. if (8 == orderRelation.getPayType() || 13 == orderRelation.getPayType() || 15 == orderRelation.getPayType()) {
  67. payParam.setPayWay("WX");
  68. }
  69. List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(shopOrder, payParam);
  70. HashMap<String, BigDecimal> sbm = new HashMap<>();
  71. for (SplitAccountPo splitAccountPo : splitBillDetail) {
  72. String subUserNo = splitAccountPo.getSubUserNo();
  73. if(sbm.containsKey(subUserNo)){
  74. BigDecimal v = MathUtil.add(sbm.get(subUserNo), splitAccountPo.getSplitAccount());
  75. sbm.put(subUserNo,v);
  76. }else{
  77. sbm.put(subUserNo,BigDecimal.valueOf(splitAccountPo.getSplitAccount()));
  78. }
  79. }
  80. ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
  81. sbm.forEach((key, value) -> {
  82. AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
  83. splitBillRule.setSplitBillAmount(value);
  84. splitBillRule.setSplitBillMerchantNo(key);
  85. splitBillRules.add(splitBillRule);
  86. });
  87. // 自己的不分
  88. splitBillRules.removeIf(s->s.getSplitBillMerchantNo().equals(shopOrder.getSplitCode()));
  89. //第三方分账接口
  90. try {
  91. AccountPayOrder accountPayOrder = new AccountPayOrder();
  92. accountPayOrder.setP1_bizType("AccountPaySub");
  93. accountPayOrder.setP2_signType("MD5");
  94. String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
  95. accountPayOrder.setP3_timestamp(format1);
  96. String substring = format1.substring(20);
  97. // fz+当前微秒时间+原唯一订单号
  98. accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
  99. //付款账户子订单绑定商户号
  100. accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
  101. AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
  102. //收款账户商编 填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
  103. // accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
  104. accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
  105. // accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
  106. accountPayOrderExt.setServerCallbackUrl(Constant.betaSplit);
  107. accountPayOrderExt.setGoodsName("分账");
  108. if (null != splitBillRules && splitBillRules.size() > 0) {
  109. accountPayOrderExt.setSplitBillRules(splitBillRules);
  110. }
  111. String ext = JSON.toJSONString(accountPayOrderExt);
  112. logger.info("分账规则串json串:" + ext);
  113. accountPayOrder.setP6_ext(ext);
  114. // 生成签名
  115. StringBuilder builder = new StringBuilder();
  116. builder.append(Constant.SPLIT)
  117. .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
  118. .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
  119. .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
  120. .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
  121. .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
  122. .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
  123. .append(Constant.XUNI);
  124. String sign = Disguiser.disguiseMD5(builder.toString().trim());
  125. Map<String, String> bean = convertBean(accountPayOrder);
  126. logger.info("--------------------> 发送分账参数: " + bean);
  127. Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
  128. logger.info("----------------分账返回数据: " + map.toString());
  129. if (map != null) {
  130. String code = map.get("rt5_retCode");
  131. if (!"0000".equals(code)) {
  132. String msg = map.get("rt6_retMsg");
  133. logger.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
  134. } else {
  135. for (SplitAccountPo splitAccount : splitBillDetail) {
  136. splitAccount.setMbOrderId(orderRelation.getMbOrderId());
  137. splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
  138. splitAccount.setPayStatus(1);
  139. // 保存分账详情
  140. newOrderDao.insertSplitAccount(splitAccount);
  141. }
  142. redisService.remove("XSFZMDS");
  143. logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
  144. }
  145. }
  146. } catch (Exception e) {
  147. logger.error("【手动分账】>>>>>>>>>>错误信息", e);
  148. }
  149. }
  150. }
  151. }
  152. private List<SplitAccountPo> setSplitAccountDetail(ShopOrderVo shopOrder, PayParamBo payParam) {
  153. List<SplitAccountPo> list = new ArrayList<>();
  154. // 本次支付金额,单位/元
  155. double payAmount = payParam.getAllPay();
  156. // 待分账总金额
  157. double splitAmount = payAmount;
  158. // 总手续费
  159. double procedureFee;
  160. if ("UNIONPAY".equals(payParam.getPayWay())) {
  161. procedureFee = 10.00;
  162. } else if ("B2C".equals(payParam.getPayWay())) {
  163. //b2c 0.2%
  164. procedureFee = MathUtil.mul(payAmount, 0.002, 2).doubleValue();
  165. //b2c最低手续费0.1
  166. if (procedureFee < 0.1) {
  167. procedureFee = 0.1;
  168. }
  169. } else if ("WX".equals(payParam.getPayWay())) {
  170. //微信0.65%
  171. procedureFee = MathUtil.mul(payAmount, 0.0065, 2).doubleValue();
  172. } else {
  173. //手续费 其他0.25%
  174. procedureFee = MathUtil.mul(payAmount, 0.0025, 2).doubleValue();
  175. }
  176. if (MathUtil.compare(procedureFee, 0.01) <= 0) {
  177. procedureFee = 0.01;
  178. }
  179. //手续费承担方 线上支付手续费:默认1采美承担,2供应商承担
  180. Integer supportFlag = newOrderDao.findSupport(shopOrder.getShopOrderId());
  181. //减去收款手续费
  182. splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
  183. // 商品数据
  184. List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByShopOrderId(shopOrder.getShopOrderId());
  185. for (OrderProductVo orderProduct : orderProductList) {
  186. //成本价*数量
  187. double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
  188. if (2 == supportFlag) {
  189. //供应商自己承担手续费
  190. costPrice = MathUtil.sub(costPrice, procedureFee).doubleValue();
  191. }
  192. // 不含税能开发票
  193. if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
  194. //应付总税费
  195. Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
  196. //成本+税费
  197. costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
  198. }
  199. // 判断是否支付过
  200. Double paidAmount = newOrderDao.getOrderProductPaidAmount(orderProduct.getOrderProductId());
  201. // 支付过金额大于0
  202. //有已付
  203. if (null != paidAmount && MathUtil.compare(paidAmount, 0) > 0) {
  204. //已付>0,成本-已付
  205. costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
  206. }
  207. // 待分账金额>成本
  208. if (MathUtil.compare(splitAmount, costPrice) > 0) {
  209. // 待分账金额-成本
  210. splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
  211. } else {
  212. costPrice = splitAmount;
  213. splitAmount = 0.00;
  214. }
  215. if (costPrice > 0) {
  216. SplitAccountPo splitAccount = new SplitAccountPo();
  217. splitAccount.setShopOrderId(shopOrder.getShopOrderId());
  218. splitAccount.setOrderId(shopOrder.getOrderId());
  219. splitAccount.setOrderProductId(orderProduct.getOrderProductId());
  220. splitAccount.setShopId(orderProduct.getShopId());
  221. splitAccount.setSplitAccount(costPrice);
  222. splitAccount.setProductType(1);
  223. if (StringUtils.isNotBlank(orderProduct.getSplitCode())) {
  224. // 该商品设置了商户号
  225. splitAccount.setType(4);
  226. splitAccount.setSubUserNo(orderProduct.getSplitCode());
  227. }
  228. logger.info("成本分账参数------------->" + splitAccount.toString());
  229. list.add(splitAccount);
  230. }
  231. if (MathUtil.compare(splitAmount, 0) == 0) {
  232. break;
  233. }
  234. }
  235. // 还有钱就付供应商运费
  236. // 付供应商运费,是以供应商为单位的
  237. if (MathUtil.compare(splitAmount, 0) > 0) {
  238. // 运费
  239. Double shopPostFee = shopOrder.getShopPostFee();
  240. if (MathUtil.compare(shopPostFee, 0) > 0) {
  241. // 查询已支付运费
  242. Double shipping = newOrderDao.getPaidShipping(shopOrder.getOrderId(), shopOrder.getShopId());
  243. shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
  244. if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
  245. splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
  246. } else {
  247. shopPostFee = splitAmount;
  248. splitAmount = 0.00;
  249. }
  250. SplitAccountPo splitAccount = new SplitAccountPo();
  251. splitAccount.setOrderId(shopOrder.getOrderId());
  252. splitAccount.setShopId(shopOrder.getShopId());
  253. splitAccount.setSplitAccount(shopPostFee);
  254. splitAccount.setProductType(2);
  255. if (StringUtils.isNotBlank(shopOrder.getSplitCode())) {
  256. //供应商拥有子商户号
  257. splitAccount.setType(4);
  258. splitAccount.setSubUserNo(shopOrder.getSplitCode());
  259. }
  260. logger.info("付供应商运费分账参数------------->" + splitAccount);
  261. list.add(splitAccount);
  262. }
  263. }
  264. // 如果还有钱则为佣金,分到采美网络
  265. if (MathUtil.compare(splitAmount, 0) > 0) {
  266. //分账手续费0.1%采美承担,佣金扣除0.1%
  267. Double amount = Math.max(MathUtil.mul(splitAmount, 0.001, 2).doubleValue(), 0.01);
  268. splitAmount = MathUtil.sub(splitAmount, amount).doubleValue();
  269. SplitAccountPo splitAccount = new SplitAccountPo();
  270. splitAccount.setOrderId(shopOrder.getOrderId());
  271. splitAccount.setShopOrderId(shopOrder.getShopOrderId());
  272. splitAccount.setSplitAccount(splitAmount);
  273. splitAccount.setProductType(3);
  274. splitAccount.setType(5);
  275. splitAccount.setSubUserNo(Constant.CUSTOMERNUM);
  276. logger.info("佣金分账参数------------->" + splitAccount);
  277. list.add(splitAccount);
  278. }
  279. return list;
  280. }
  281. public static <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
  282. FormBody.Builder builder = new FormBody.Builder();
  283. for (Map.Entry<String, String> entry : params.entrySet()) {
  284. builder.add(entry.getKey(), entry.getValue());
  285. }
  286. builder.add("sign", sign);
  287. Request request = new Request.Builder() // okHttp post
  288. .url(url)
  289. .post(builder.build())
  290. .build();
  291. Response response = null;
  292. try {
  293. response = client.newCall(request).execute();
  294. } catch (IOException e) {
  295. throw new IllegalStateException("请求出错", e);
  296. }
  297. if (!response.isSuccessful()) {
  298. try {
  299. logger.info(response.body().string());
  300. } catch (IOException e) {
  301. e.printStackTrace();
  302. }
  303. throw new RuntimeException("请求失败了: http response code: " + response.code());
  304. }
  305. ResponseBody body = response.body();
  306. String content = null;
  307. try {
  308. content = body.string();
  309. } catch (IOException e) {
  310. throw new IllegalStateException("IO异常", e);
  311. }
  312. JSONObject res = JSON.parseObject(content);
  313. if (!res.getBooleanValue("rt4_success")) {
  314. logger.error("error: " + res.getString("rt6_retMsg"));
  315. }
  316. /** rt4_success 为 true,需验签 **/
  317. return res.toJavaObject(clazz);
  318. }
  319. public static Map<String, String> convertBean(Object bean) {
  320. Class clazz = bean.getClass();
  321. Field[] fields = clazz.getDeclaredFields();
  322. for (Field f : fields) {
  323. f.setAccessible(true);
  324. }
  325. try {
  326. Map<String, String> retMap = new LinkedHashMap<>();
  327. for (Field f : fields) {
  328. String key = f.toString().substring(f.toString().lastIndexOf(".") + 1);
  329. Object value = f.get(bean);
  330. if (value == null) {
  331. value = "";
  332. }
  333. retMap.put(key, (String) value);
  334. }
  335. return retMap;
  336. } catch (Exception e) {
  337. logger.info("分账", e);
  338. throw new IllegalStateException("分账异常", e);
  339. }
  340. }
  341. }
  342. // //正式
  343. //// public static final String callUrl = "https://core.caimei365.com/order/pay/delay/split/callback";
  344. // //测试
  345. // public static final String callUrl = "https://core-b.caimei365.com/order/pay/delay/split/callback";
  346. // @Transactional(readOnly = false)
  347. // public void SplitAccount() {
  348. // logger.info("【手动分账开始】>>>>>>>>>>手动分账");
  349. // Calendar calendar = Calendar.getInstance();
  350. // calendar.setTime(new Date());
  351. // SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  352. // String currentTime = format.format(calendar.getTime());
  353. // // 查询未分账已支付收款
  354. // List<OrderReceiptRelationPo> orderRelations = newOrderDao.getUndividedPaidReceipt(currentTime);
  355. // if (null != orderRelations && orderRelations.size() > 0) {
  356. // for (OrderReceiptRelationPo orderRelation : orderRelations) {
  357. // logger.info("【手动分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + ",进入手动分账");
  358. // // 收款对应的订单信息
  359. // OrderVo order = newOrderDao.getOrderByOrderId(orderRelation.getOrderId());
  360. // PayParamBo payParam = new PayParamBo();
  361. // payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
  362. // if (12 == orderRelation.getPayType()) {
  363. // // 网银支付
  364. // payParam.setPayWay("UNIONPAY");
  365. // }
  366. // if (20 == orderRelation.getPayType()) {
  367. // payParam.setPayWay("TRANSFER");
  368. // }
  369. // List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(order, payParam);
  370. // List<Map<String, String>> maps = new ArrayList<>();
  371. // //供应商子商户金额
  372. // for (SplitAccountPo account : splitBillDetail) {
  373. // if (null != account.getType() && 4 == account.getType()) {
  374. // //每个有供应商子商户的分账给对应供应商子商户
  375. // addMaps(maps, account.getSplitAccount(), account.getSubUserNo());
  376. // }
  377. // }
  378. // //公账-专票总金额,私账-无票总金额,公账-普票总金额
  379. // //佣金进网络
  380. // double totalAmount1 = 0.00;
  381. // double totalAmount2 = 0.00;
  382. // double totalAmount3 = 0.00;
  383. // double totalAmount4 = 0.00;
  384. // for (SplitAccountPo account : splitBillDetail) {
  385. // if (1 == account.getType()) {
  386. // totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount()).doubleValue();
  387. // } else if (2 == account.getType()) {
  388. // totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount()).doubleValue();
  389. // } else if (3 == account.getType()) {
  390. // totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount()).doubleValue();
  391. // } else if (5 == account.getType()) {
  392. // totalAmount4 = MathUtil.add(totalAmount4, account.getSplitAccount()).doubleValue();
  393. // }
  394. // }
  395. // addMaps(maps, totalAmount1, PayUtil.publicAccountNo);
  396. // addMaps(maps, totalAmount2, PayUtil.privateAccountNo);
  397. // addMaps(maps, totalAmount3, PayUtil.commonInvoiceNo);
  398. // // 网络
  399. // addMaps(maps, totalAmount4, PayUtil.brokerage);
  400. //// addMaps(maps, totalAmount4, PayUtil.publicAccountNo);
  401. // String parameters = JSON.toJSONString(maps);
  402. // logger.info("【手动分账】>>>>>>>>>>分账参数: " + parameters);
  403. //
  404. // //第三方分账接口
  405. // JSONObject result = null;
  406. // try {
  407. // // 时间戳
  408. // long time = System.currentTimeMillis() / 1000;
  409. // JSONObject json = new JSONObject();
  410. // json.put("merAccount", PayUtil.merAccount);
  411. // json.put("orderId", orderRelation.getOrderRequestNo());
  412. // json.put("requestNo", orderRelation.getOrderRequestNo());
  413. // json.put("mbOrderId", orderRelation.getMbOrderId());
  414. // json.put("time", time);
  415. // json.put("splitBillDetail", parameters);
  416. // json.put("notifyUrl", callUrl);
  417. // logger.info("回调接口>>>" + callUrl);
  418. // String sign = PayUtil.getPaySign(json, PayUtil.merKey);
  419. // json.put("sign", sign);
  420. // logger.info("发送参数json----->" + json);
  421. // String data = PayUtil.privateKeyEncrypt(json, PayUtil.merKey);
  422. // result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/splitOrder/v1", PayUtil.merAccount, data);
  423. // } catch (Exception e) {
  424. // logger.error("【手动分账】>>>>>>>>>>错误信息", e);
  425. // }
  426. // if (result != null) {
  427. // String code = result.getString("code");
  428. // if (!"000000".equals(code)) {
  429. // String msg = result.getString("msg");
  430. // logger.info("【手动分账】>>>>>>>>>>第三方延迟分账失败>>>>>>>msg:" + msg);
  431. // } else {
  432. // for (SplitAccountPo splitAccount : splitBillDetail) {
  433. // splitAccount.setMbOrderId(orderRelation.getMbOrderId());
  434. // splitAccount.setOrderRequestNo(orderRelation.getOrderRequestNo());
  435. // splitAccount.setPayStatus(1);
  436. // // 保存分账详情
  437. // newOrderDao.insertSplitAccount(splitAccount);
  438. // redisService.remove("XSFZMDS");
  439. // }
  440. // logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
  441. // }
  442. // }
  443. // }
  444. // }
  445. // }
  446. //
  447. //
  448. // /**
  449. // * 分账参数添加
  450. // */
  451. // private void addMaps(List<Map<String, String>> maps, Double shopTotalAmount, String subUserNo) {
  452. // if (MathUtil.compare(shopTotalAmount, 0) > 0) {
  453. // Map<String, String> map = new HashMap<>(3);
  454. // map.put("subUserNo", subUserNo);
  455. // map.put("splitBillType", "2");
  456. // map.put("splitBillValue", MathUtil.mul(shopTotalAmount, 100).toString());
  457. // maps.add(map);
  458. // }
  459. // }
  460. //
  461. // /**
  462. // * 分账详情
  463. // */
  464. // private List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
  465. // List<SplitAccountPo> list = new ArrayList<>();
  466. // // 本次支付金额,单位/元
  467. // double payAmount = MathUtil.div(payParam.getPayAmount(), 100).doubleValue();
  468. // // 待分账总金额
  469. // double splitAmount = payAmount;
  470. // // 总手续费
  471. // double procedureFee;
  472. // if ("UNIONPAY".equals(payParam.getPayWay())) {
  473. // procedureFee = 8.00;
  474. // } else {
  475. // //手续费
  476. // procedureFee = MathUtil.mul(payAmount, 0.0038, 2).doubleValue();
  477. // if (MathUtil.compare(procedureFee, 0) == 0) {
  478. // procedureFee = 0.01;
  479. // }
  480. // }
  481. // splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
  482. // // 商品数据
  483. // List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByOrderId(order.getOrderId());
  484. // for (OrderProductVo orderProduct : orderProductList) {
  485. // double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
  486. // // 不含税能开发票
  487. // if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
  488. // //应付总税费
  489. // Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
  490. // costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
  491. // }
  492. // // 判断是否支付过
  493. // Double paidAmount = newOrderDao.getOrderProductPaidAmount(orderProduct.getOrderProductId());
  494. // //有已付
  495. // if (null != paidAmount && MathUtil.compare(paidAmount, 0) > 0) {
  496. // //已付>0,成本-已付
  497. // costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
  498. // }
  499. // // 待分账金额>成本
  500. // if (MathUtil.compare(splitAmount, costPrice) > 0) {
  501. // // 待分账金额-成本
  502. // splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
  503. // } else {
  504. // costPrice = splitAmount;
  505. // splitAmount = 0.00;
  506. // }
  507. // if (costPrice > 0) {
  508. // SplitAccountPo splitAccount = new SplitAccountPo();
  509. // splitAccount.setOrderId(order.getOrderId());
  510. // splitAccount.setOrderProductId(orderProduct.getOrderProductId());
  511. // splitAccount.setShopId(orderProduct.getShopId());
  512. // splitAccount.setSplitAccount(costPrice);
  513. // splitAccount.setProductType(1);
  514. // if (StringUtils.isNotBlank(orderProduct.getSplitCode())) {
  515. // // 该商品设置了商户号
  516. // splitAccount.setType(4);
  517. // splitAccount.setSubUserNo(orderProduct.getSplitCode());
  518. // }
  519. // logger.info("成本分账参数------------->" + splitAccount.toString());
  520. // list.add(splitAccount);
  521. // }
  522. // if (MathUtil.compare(splitAmount, 0) == 0) {
  523. // break;
  524. // }
  525. // }
  526. // // 付供应商运费,是以供应商为单位的
  527. // if (MathUtil.compare(splitAmount, 0) > 0) {
  528. // List<ShopOrderVo> shopOrderList = newOrderDao.getShopOrderListByOrderId(order.getOrderId());
  529. // for (ShopOrderVo shopOrder : shopOrderList) {
  530. // // 运费
  531. // Double shopPostFee = shopOrder.getShopPostFee();
  532. // if (MathUtil.compare(shopPostFee, 0) > 0) {
  533. // // 查询已支付运费
  534. // Double shipping = newOrderDao.getPaidShipping(order.getOrderId(), shopOrder.getShopId());
  535. // shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
  536. // if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
  537. // splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
  538. // } else {
  539. // shopPostFee = splitAmount;
  540. // splitAmount = 0.00;
  541. // }
  542. // String commercialCode = newOrderDao.getShopCommercialCode(shopOrder.getShopId());
  543. // SplitAccountPo splitAccount = new SplitAccountPo();
  544. // splitAccount.setOrderId(order.getOrderId());
  545. // splitAccount.setShopId(shopOrder.getShopId());
  546. // splitAccount.setSplitAccount(shopPostFee);
  547. // splitAccount.setProductType(2);
  548. // if (StringUtils.isNotBlank(commercialCode)) {
  549. // //供应商拥有子商户号
  550. // splitAccount.setType(4);
  551. // splitAccount.setSubUserNo(commercialCode);
  552. // }
  553. // logger.info("付供应商运费分账参数------------->" + splitAccount);
  554. // list.add(splitAccount);
  555. // }
  556. // }
  557. // }
  558. // //佣金,公账
  559. // if (MathUtil.compare(splitAmount, 0) > 0) {
  560. // SplitAccountPo splitAccount = new SplitAccountPo();
  561. // splitAccount.setOrderId(order.getOrderId());
  562. // splitAccount.setSplitAccount(splitAmount);
  563. // splitAccount.setProductType(3);
  564. // splitAccount.setType(5);
  565. // //佣金进采美网络
  566. // splitAccount.setSubUserNo(PayUtil.brokerage);
  567. // logger.info("佣金分账参数------------->" + splitAccount);
  568. // list.add(splitAccount);
  569. // }
  570. // return list;
  571. // }