SplitAccountService.java 36 KB

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