SplitAccountService.java 35 KB

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