OrderUtils.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. package com.caimei.modules.order.util;
  2. import com.alibaba.fastjson.JSON;
  3. import com.caimei.modules.order.constant.Constant;
  4. import com.caimei.modules.order.dao.*;
  5. import com.caimei.modules.order.entity.*;
  6. import com.caimei.modules.order.service.CmReturnedPurchaseService;
  7. import com.caimei.modules.order.service.NewOrderService;
  8. import com.caimei.utils.*;
  9. import com.caimei.utils.payUtil.MyBeanUtils;
  10. import com.caimei.utils.payUtil.RSA;
  11. import com.caimei.utils.payUtil.SettlePostFormUtil;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import javax.annotation.Resource;
  17. import java.math.BigDecimal;
  18. import java.text.SimpleDateFormat;
  19. import java.util.*;
  20. import java.util.concurrent.CountDownLatch;
  21. import java.util.concurrent.atomic.AtomicReference;
  22. import java.util.stream.Collectors;
  23. import static sun.management.snmp.jvminstr.JvmThreadInstanceEntryImpl.ThreadStateMap.Byte1.other;
  24. /**
  25. * @author zzj
  26. */
  27. @Slf4j
  28. @Component
  29. public class OrderUtils {
  30. @Resource
  31. private OrderPayUtils orderPayUtil;
  32. @Resource
  33. private OrderUserInfoDao orderUserInfoDao;
  34. @Resource
  35. private NewOrderDao newOrderDao;
  36. @Resource
  37. private RedisService redisService;
  38. @Resource
  39. private PayShopDao payShopDao;
  40. @Resource
  41. private NewShopOrderDao shopOrderDao;
  42. @Resource
  43. private CmReturnedPurchaseDao returnDao;
  44. @Resource
  45. private NewOrderProductDao newOrderProductDao;
  46. @Resource
  47. private CmDiscernReceiptDao receiptDao;
  48. @Resource
  49. private NewOrderService newOrderService;
  50. @Resource
  51. private CmDiscernReceiptDao cmDiscernReceiptDao;
  52. /**
  53. * 计算子订单应付
  54. *
  55. * @param shopOrder
  56. */
  57. public NewShopOrder getShouldPay(NewShopOrder shopOrder) {
  58. setShopOrderStatus(shopOrder);
  59. List<NewOrderProduct> products = payShopDao.findPayOrderProducts(shopOrder.getShopOrderId());
  60. shopOrder.setShopOrderNos(payShopDao.findShopOrderNos(shopOrder.getOrderId()));
  61. AtomicReference<BigDecimal> organizeFee = new AtomicReference<>();
  62. AtomicReference<BigDecimal> shopFee = new AtomicReference<>();
  63. AtomicReference<BigDecimal> totalAmount = new AtomicReference<>();
  64. products.forEach(p -> {
  65. // 商品总价 * 供应商成本比例 - 手续费 = 应付供应商
  66. shopFee.set(MathUtil.add(MathUtil.mul(p.getTotalAmount(), MathUtil.div(p.getShopPercent(), 100), 2), shopFee.get()));
  67. // 商品总价 * 组织佣金比例 = 应付组织
  68. organizeFee.set(MathUtil.add(MathUtil.mul(p.getTotalAmount(), MathUtil.div(p.getOrganizePercent(), 100), 2), organizeFee.get()));
  69. // 商品总价
  70. totalAmount.set(MathUtil.add(p.getTotalAmount(), totalAmount.get()));
  71. /**
  72. * 确认收货信息
  73. */
  74. if (NewOrderStatus.hasReceived(shopOrder.getShopStatus())) {
  75. Integer receivedNum = newOrderProductDao.getReceivedNum(p.getOrderProductId());
  76. p.setReceivedNum(receivedNum);
  77. }
  78. });
  79. shopOrder.setNewOrderProducts(products);
  80. // 子订单总额 - 付供应商成本 - 付组织 = 应付采美
  81. Double cmFee = MathUtil.sub(totalAmount.get(), MathUtil.add(shopFee.get(), organizeFee.get())).doubleValue();
  82. List<CmReceiptOrderRelation> relations = payShopDao.findOrderRelations(shopOrder.getOrderId());
  83. // 线上手续费
  84. AtomicReference<Double> totalCharge = new AtomicReference<>();
  85. // 子订单总收款
  86. AtomicReference<Double> receiptTotal = new AtomicReference<>();
  87. // 线上标记
  88. AtomicReference<Boolean> onlineFlag = new AtomicReference<Boolean>(false);
  89. relations.forEach(r -> {
  90. double charge = 0;
  91. // 线上手续费
  92. if (1 == r.getPayWay()) {
  93. onlineFlag.set(true);
  94. if (12 == r.getPayType()) {
  95. // 企业网银
  96. charge = 10;
  97. } else if (8 == r.getPayType() || 13 == r.getPayType() || 15 == r.getPayType()) {
  98. // 微信
  99. charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.0065, 2).doubleValue(), 0.01);
  100. } else if (29 == r.getPayType()) {
  101. // 快捷支付借记卡
  102. charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.003, 2).doubleValue(), 0.1);
  103. } else if (30 == r.getPayType()) {
  104. // 快捷支付贷记卡
  105. charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.006, 2).doubleValue(), 0.1);
  106. } else if (17 == r.getPayType()) {
  107. // 个人网银
  108. charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.002, 2).doubleValue(), 0.1);
  109. } else if (14 == r.getPayType()) {
  110. // 支付宝
  111. charge = Math.max(MathUtil.mul(r.getAssociateAmount(), 0.0025, 2).doubleValue(), 0.01);
  112. }
  113. }
  114. totalCharge.set(MathUtil.add(totalCharge.get(), charge).doubleValue());
  115. receiptTotal.set(MathUtil.add(r.getAssociateAmount(), receiptTotal.get()).doubleValue());
  116. });
  117. // 应付供应商
  118. Double v = MathUtil.sub(shopFee.get(), totalCharge.get()).doubleValue();
  119. Double shopPostFee = 0d;
  120. if (!onlineFlag.get() && shopOrder.getShopPostFee() > 0) {
  121. shopPostFee = shopOrder.getShopPostFee();
  122. // 线下收付款,有供应商运费 付供应商 = 付供应商 + 供应商运费
  123. v = v + shopOrder.getShopPostFee();
  124. }
  125. // 线下已付采美
  126. Double paidCm = shopOrder.getPayCmAmount();
  127. // 线下已付供应商
  128. Double paidShop = shopOrder.getPayedShopAmount();
  129. // 线下由组织代收款,已收金额减已付采美和供应商则为已付组织
  130. Double paidOrganize = MathUtil.sub(receiptTotal.get(), (MathUtil.add(paidCm, paidShop))).doubleValue();
  131. Double waitSettleShop = 0d;
  132. Double waitSettleCm = 0d;
  133. Double waitSettleOrganize = 0d;
  134. Double settleShop = 0d;
  135. Double settleCm = 0d;
  136. Double settleOrganize = 0d;
  137. Double shouldSettleShop = 0d;
  138. Double shouldSettleCm = 0d;
  139. Double shouldSettleOrganize = 0d;
  140. if (onlineFlag.get()) {
  141. /** 减0.1%分账手续费
  142. * 最低手续费 0.01,计算金额与原金额相等时 - 0.01
  143. */
  144. Double splitCmFee = MathUtil.div(cmFee, 1.001, 2).doubleValue();
  145. if (cmFee.equals(splitCmFee)) {
  146. cmFee = cmFee - 0.01;
  147. } else {
  148. cmFee = splitCmFee;
  149. }
  150. Double splitShop = MathUtil.div(v, 1.001, 2).doubleValue();
  151. if (v.equals(splitShop)) {
  152. v = v - 0.01;
  153. } else {
  154. v = splitShop;
  155. }
  156. // 线上已付采美
  157. paidCm = payShopDao.findOnlinePayCm(shopOrder.getShopOrderId(), 3);
  158. // 线上已付供应商
  159. paidShop = payShopDao.findOnlinePayCm(shopOrder.getShopOrderId(), 1);
  160. // 线上已付组织
  161. paidOrganize = payShopDao.findOnlinePayCm(shopOrder.getShopOrderId(), 5);
  162. shopOrder.setPayCmAmount(paidCm);
  163. shopOrder.setPayedShopAmount(paidShop);
  164. // 未结供应商 = 应付 - 已结
  165. settleShop = payShopDao.findSettleSum(shopOrder.getShopOrderId(), 1);
  166. waitSettleShop = MathUtil.sub(v, settleShop).doubleValue();
  167. settleCm = payShopDao.findSettleSum(shopOrder.getShopOrderId(), 2);
  168. waitSettleCm = MathUtil.sub(cmFee, settleCm).doubleValue();
  169. settleOrganize = payShopDao.findSettleSum(shopOrder.getShopOrderId(), 3);
  170. waitSettleOrganize = MathUtil.sub(organizeFee.get(), settleOrganize).doubleValue();
  171. shouldSettleShop = v;
  172. shouldSettleCm = cmFee;
  173. shouldSettleOrganize = organizeFee.get().doubleValue();
  174. }
  175. shopOrder.setWaitSettleShop(waitSettleShop);
  176. shopOrder.setWaitSettleCm(waitSettleCm);
  177. shopOrder.setWaitSettleOrganize(waitSettleOrganize);
  178. shopOrder.setSettleShopAmount(settleShop);
  179. shopOrder.setSettleCmAmount(settleCm);
  180. shopOrder.setSettleOrganizeAmount(settleOrganize);
  181. shopOrder.setShouldSettleShop(shouldSettleShop);
  182. shopOrder.setShouldSettleOrganize(shouldSettleOrganize);
  183. shopOrder.setShouldSettleCm(shouldSettleCm);
  184. // 待付组织 = 应付 - 已付
  185. Double wait = MathUtil.sub(organizeFee.get(), paidOrganize).doubleValue();
  186. shopOrder.setWaitPayOrganize(wait);
  187. shopOrder.setShouldPayOrganize(organizeFee.get().doubleValue());
  188. shopOrder.setPaidOrganize(paidOrganize);
  189. shopOrder.setPayedShopAmount(paidShop);
  190. shopOrder.setPayCmAmount(paidCm);
  191. shopOrder.setBrokerage(organizeFee.get().doubleValue());
  192. shopOrder.setWaitPayCmAmount(MathUtil.sub(cmFee, paidCm).doubleValue());
  193. // 待付不加供应商运费
  194. shopOrder.setWaitPayShop(MathUtil.sub(v, MathUtil.add(paidShop, shopPostFee)).doubleValue());
  195. shopOrder.setShouldPayCmAmount(cmFee);
  196. shopOrder.setShouldPayShopAmount(v);
  197. shopOrder.setReceiptTotalFee(receiptTotal.get());
  198. return shopOrder;
  199. }
  200. /**
  201. * @param P2_orderId 结算合利宝订单Id
  202. * @param settleAmount 结算金额
  203. * @param P3_customerNumber 结算帐号
  204. * @param shopOrderId 子订单Id
  205. * @param settleFlag 结算类型
  206. * @throws Exception
  207. */
  208. @Transactional(readOnly = false, rollbackFor = Exception.class)
  209. public void settleOrder(String P2_orderId, Double settleAmount, String P3_customerNumber, Integer shopOrderId, Integer settleFlag) throws Exception {
  210. //子订单id,结算金额
  211. Map<String, String> sPara = new HashMap<String, String>();
  212. sPara.put("P1_bizType", "MerchantSettlement");
  213. sPara.put("P2_orderId", P2_orderId);
  214. sPara.put("P3_customerNumber", P3_customerNumber);
  215. sPara.put("P4_amount", settleAmount.toString());
  216. sPara.put("P5_summary", "订单结算");
  217. sPara.put("signType", "RSA");
  218. StringBuffer sb = new StringBuffer();
  219. sb.append(Constant.SPLIT).append("MerchantSettlement").append(Constant.SPLIT).append(P2_orderId).append(Constant.SPLIT)
  220. .append(P3_customerNumber).append(Constant.SPLIT).append(settleAmount).append(Constant.SPLIT).append("订单结算")
  221. .append(Constant.SPLIT).append("RSA");
  222. String sign = RSA.sign(sb.toString(), RSA.getPrivateKey(Constant.signKey_setttlement));
  223. sPara.put("sign", sign);
  224. log.info("发送结算参数-----------------------》" + sPara);
  225. SettleResult settleResult = SettlePostFormUtil.postForm(sPara, Constant.JS, sign, SettleResult.class);
  226. if (!"0000".equals(settleResult.getRt2_retCode())) {
  227. log.info("settleResult----------------->" + settleResult.toString());
  228. throw new Exception("结算失败!");
  229. } else {
  230. String assemblyRespOriSign = "";
  231. assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(settleResult, SettleResult.NEED_SIGN_PARAMS);
  232. assemblyRespOriSign += Constant.JIESUAN;
  233. String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
  234. if (!checkSign.equals(settleResult.getSign())) {
  235. log.info("settleResult----------------->" + settleResult.toString());
  236. throw new Exception("结算验签失败!");
  237. } else {
  238. SettleRecord settleRecord = new SettleRecord();
  239. //存结算表,改子订单结算状态
  240. if (1 == settleFlag) {
  241. //成本结算
  242. settleRecord.setSettleType(settleFlag);
  243. settleRecord.setSettleAmount(settleAmount);
  244. settleRecord.setSplitCode(P3_customerNumber);
  245. settleRecord.setShopOrderId(shopOrderId);
  246. payShopDao.insertSettleRecord(settleRecord);
  247. // 修改cm_split_account settlestatus
  248. payShopDao.updateSettleStatus(shopOrderId, 1);
  249. //计算供应商成本,结算金额,修改结算状态
  250. Double shouldPayShopAmount = payShopDao.findShouldPayShopAmount(shopOrderId);
  251. Double settleSum = payShopDao.findSettleSum(shopOrderId, 1);
  252. if (shouldPayShopAmount > settleSum) {
  253. //成本>结算金额,部分结算
  254. payShopDao.updateShopOrderSettleStatus(shopOrderId, 2);
  255. } else {
  256. //成本=结算金额 全部结算
  257. payShopDao.updateShopOrderSettleStatus(shopOrderId, 3);
  258. }
  259. } else {
  260. // 佣金结算 3采美 5 联合丽格 6冷链非
  261. Integer newFlag = 0;
  262. if (3 == settleFlag) {
  263. newFlag = 2;
  264. } else if (5 == settleFlag) {
  265. newFlag = 3;
  266. } else if (6 == settleFlag) {
  267. newFlag = 4;
  268. }
  269. settleRecord.setSettleType(newFlag);
  270. settleRecord.setSettleAmount(settleAmount);
  271. settleRecord.setSplitCode(P3_customerNumber);
  272. settleRecord.setShopOrderId(shopOrderId);
  273. payShopDao.insertSettleRecord(settleRecord);
  274. // 最后佣金结算修改cm_split_account settlestatus
  275. payShopDao.updateSettleStatus(shopOrderId, settleFlag);
  276. }
  277. }
  278. }
  279. }
  280. public NewOrder setOrderPostInfo(NewOrder order) {
  281. NewShopOrder shopOrder = shopOrderDao.findColdChain(order.getOrderId());
  282. if (null != shopOrder) {
  283. order.setPostageInfo("2".equals(shopOrder.getShopPostFlag()) ?"到付": "0".equals(shopOrder.getShopPostFlag())?"包邮":"¥" + shopOrder.getShopPostFee());
  284. } else {
  285. /**
  286. * 没有运费订单
  287. */
  288. order.setPostageInfo("¥ 0.00");
  289. }
  290. if(null!=order.getNewShopOrders()){
  291. for (NewShopOrder newShopOrder : order.getNewShopOrders()) {
  292. BigDecimal add = MathUtil.add(newShopOrder.getReceiptAmount(),cmDiscernReceiptDao.findShoOrderIDReceipt(newShopOrder.getShopOrderId()));
  293. double v = add.doubleValue();
  294. newShopOrder.setReceiptAmount(v);
  295. BigDecimal sub = MathUtil.sub(
  296. // newShopOrder.getWaitPayShop()
  297. newShopOrder.getRealPay() != null ? newShopOrder.getRealPay() : newShopOrder.getNeedPayAmount()
  298. , newShopOrder.getReceiptAmount());
  299. newShopOrder.setRestAmount(sub.doubleValue());
  300. String shopPostFlag = newShopOrder.getShopPostFlag()!=null?newShopOrder.getShopPostFlag():"2";
  301. String PostageInfo = shopPostFlag.equals("2") ? "到付" : shopPostFlag.equals("0") ? "包邮" : "¥" + newShopOrder.getShopPostFee();
  302. //支付凭证
  303. List<Voucher> vouchers = newOrderService.findVoucher(newShopOrder.getShopOrderId());
  304. newShopOrder.setPostageInfo(PostageInfo);
  305. newShopOrder.setVouchers(vouchers);
  306. if ("1".equals( newShopOrder.getShopStatus() )) {
  307. if ( "1".equals(newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())){
  308. newShopOrder.setShopStatus("11");
  309. } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) {
  310. newShopOrder.setShopStatus("12");
  311. } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) {
  312. newShopOrder.setShopStatus("13");
  313. } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) {
  314. newShopOrder.setShopStatus("21");
  315. } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) {
  316. newShopOrder.setShopStatus("22");
  317. } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) {
  318. newShopOrder.setShopStatus("23");
  319. } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) {
  320. newShopOrder.setShopStatus("31");
  321. } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) {
  322. newShopOrder.setShopStatus("32");
  323. } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) {
  324. newShopOrder.setShopStatus("33");
  325. }
  326. }
  327. }
  328. }
  329. return order;
  330. }
  331. public NewOrder setOrderValue(NewOrder order) {
  332. List<NewShopOrder> shopOrders = shopOrderDao.findListByOrderId(order.getOrderId());
  333. shopOrders.forEach(this::getShouldPay);
  334. order.setNewShopOrders(shopOrders);
  335. order.setAlreadyReceipt(shopOrders.get(0).getReceiptTotalFee());
  336. Double totalPayShop = shopOrders.stream().mapToDouble(NewShopOrder::getShouldPayShopAmount).sum();
  337. Double totalPayCm = shopOrders.stream().mapToDouble(NewShopOrder::getShouldPayCmAmount).sum();
  338. order.setPayableAmount(MathUtil.add(totalPayShop, totalPayCm).doubleValue());
  339. Double totalPaidShop = shopOrders.stream().mapToDouble(NewShopOrder::getPayedShopAmount).sum();
  340. Double totalPaidCm = shopOrders.stream().mapToDouble(NewShopOrder::getPayCmAmount).sum();
  341. order.setPaidAmount(MathUtil.add(totalPaidCm, totalPaidShop).doubleValue());
  342. setRefundVal(order);
  343. setOrderPostInfo(order);
  344. // 设置基础信息
  345. shopOrders.forEach(shopOrder -> {
  346. shopOrder.setReceiver(order.getReceiver());
  347. shopOrder.setMobile(order.getMobile());
  348. shopOrder.setAddress(order.getAddress());
  349. });
  350. return order;
  351. }
  352. public void splitAccount(List<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules, String orderRequestNo,
  353. String mbOrderId, NewShopOrder shopOrder, List<SplitAccountPo> splitBillDetail) {
  354. if (null != splitBillRules && splitBillRules.size() > 0) {
  355. //第三方分账接口
  356. try {
  357. AccountPayOrder accountPayOrder = new AccountPayOrder();
  358. accountPayOrder.setP1_bizType("AccountPaySub");
  359. accountPayOrder.setP2_signType("MD5");
  360. String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
  361. accountPayOrder.setP3_timestamp(format1);
  362. String substring = format1.substring(20);
  363. // fz+当前微秒时间+原唯一订单号
  364. accountPayOrder.setP4_orderId("FZ" + substring + orderRequestNo);
  365. //付款账户子订单绑定商户号
  366. accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
  367. AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
  368. //收款账户商编 填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
  369. //accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
  370. //accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
  371. accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
  372. // todo
  373. accountPayOrderExt.setServerCallbackUrl(Constant.prodSplit);
  374. accountPayOrderExt.setGoodsName("分账");
  375. if (null != splitBillRules && splitBillRules.size() > 0) {
  376. accountPayOrderExt.setSplitBillRules(splitBillRules);
  377. }
  378. String ext = JSON.toJSONString(accountPayOrderExt);
  379. log.info("分账规则串json串:" + ext);
  380. accountPayOrder.setP6_ext(ext);
  381. // 生成签名
  382. StringBuilder builder = new StringBuilder();
  383. builder.append(Constant.SPLIT)
  384. .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
  385. .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
  386. .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
  387. .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
  388. .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
  389. .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
  390. .append(Constant.XUNI);
  391. String sign = Disguiser.disguiseMD5(builder.toString().trim());
  392. Map<String, String> bean = orderPayUtil.convertBean(accountPayOrder);
  393. log.info("--------------------> 发送分账参数: " + bean);
  394. Map<String, String> map = orderPayUtil.postForm(bean, Constant.FZ, sign, Map.class);
  395. log.info("----------------分账返回数据: " + map.toString());
  396. if (map != null) {
  397. String code = map.get("rt5_retCode");
  398. if (!"0000".equals(code)) {
  399. String msg = map.get("rt6_retMsg");
  400. log.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
  401. } else {
  402. for (SplitAccountPo splitAccount : splitBillDetail) {
  403. splitAccount.setMbOrderId(mbOrderId);
  404. splitAccount.setOrderRequestNo(orderRequestNo);
  405. splitAccount.setPayStatus(1);
  406. // 保存分账详情
  407. newOrderDao.insertSplitAccount(splitAccount);
  408. }
  409. redisService.remove("OGFZMDS");
  410. log.info("【手动分账】>>>>>>>>>>此订单分账结束");
  411. }
  412. }
  413. } catch (Exception e) {
  414. log.error("【手动分账】>>>>>>>>>>错误信息", e);
  415. }
  416. }
  417. }
  418. /**
  419. * 设置子订单状态
  420. * shopStatus 0:待确认 1:已确认 2:交易完成 3:订单完成 4:已关闭 5:交易全退
  421. *
  422. * payStatus (付款供应商)付款状态:1待付款、2部分付款、3已付款
  423. * sendOutStatus 发货状态:1待发货、2部分发货、3已发货
  424. * receiptStatus 收款状态:1待收款、2部分收款、3已收款
  425. */
  426. public void setShopOrderStatus(NewShopOrder newShopOrder) {
  427. // 11, 待付待收待发
  428. if (("1".equals(newShopOrder.getShopStatus()) || "2".equals(newShopOrder.getShopStatus()) || "3".equals(newShopOrder.getShopStatus())) && "1".equals(newShopOrder.getOrderStatusFlag()) && "1".equals(newShopOrder.getRefundStatus())) {
  429. if ( "1".equals(newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())){
  430. newShopOrder.setShopStatus("11");
  431. } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) {
  432. newShopOrder.setShopStatus("12");
  433. } else if ( "1".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) {
  434. newShopOrder.setShopStatus("13");
  435. } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) {
  436. newShopOrder.setShopStatus("21");
  437. } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) {
  438. newShopOrder.setShopStatus("22");
  439. } else if ( "2".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) {
  440. newShopOrder.setShopStatus("23");
  441. } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "1".equals( newShopOrder.getSendOutStatus())) {
  442. newShopOrder.setShopStatus("31");
  443. } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "2".equals( newShopOrder.getSendOutStatus())) {
  444. newShopOrder.setShopStatus("32");
  445. } else if ( "3".equals( newShopOrder.getReceiptStatus()) && "3".equals( newShopOrder.getSendOutStatus())) {
  446. newShopOrder.setShopStatus("33");
  447. }
  448. }
  449. if (!"1".equals(newShopOrder.getOrderStatusFlag()) || !"1".equals(newShopOrder.getRefundStatus())) {
  450. newShopOrder.setShopStatus("5");
  451. }
  452. }
  453. /**
  454. * 设置收货人信息
  455. *
  456. * @param newOrder
  457. */
  458. public void setReceiverVal(NewOrder newOrder) {
  459. List<String> notes = newOrderDao.findNotes(newOrder.getOrderId());
  460. if (null != notes && notes.size() > 0) {
  461. newOrder.setNotes(notes);
  462. }
  463. OrderUserInfo byOrderId = orderUserInfoDao.findByOrderId(newOrder.getOrderId());
  464. String address = byOrderId.getProvince() + byOrderId.getCity() + byOrderId.getTown() + byOrderId.getAddress();
  465. newOrder.setAddress(address);
  466. newOrder.setReceiver(byOrderId.getShouHuoRen());
  467. newOrder.setMobile(byOrderId.getMobile());
  468. }
  469. /**
  470. * 设置退款金额
  471. *
  472. * @param newOrder
  473. */
  474. public void setRefundVal(NewOrder newOrder) {
  475. newOrder.setRefundFee(returnDao.findSumReturn(newOrder.getOrderId()));
  476. }
  477. /**
  478. * 设置分账记录
  479. *
  480. * @param newOrder
  481. */
  482. public List<SplitRecord> getSplitRecord(NewOrder newOrder) {
  483. return payShopDao.findSplitRecord(newOrder.getOrderId());
  484. }
  485. public List<ReceiptVo> getReceiptRecord(NewOrder newOrder) {
  486. ReceiptVo receiptVo = new ReceiptVo();
  487. receiptVo.setOrderId(newOrder.getShopOrderId().toString());
  488. receiptVo.setOrganizeId(4);
  489. return receiptDao.findReceiptList(receiptVo);
  490. }
  491. public List<OrderPayShopRecord> getPayRecords(NewOrder newOrder) {
  492. return payShopDao.findPayShopRecordsByOrder(newOrder.getShopOrderId());
  493. }
  494. public Boolean setDeliverStatus(List<NewOrderProduct> orderProducts) {
  495. AtomicReference<Boolean> flag = new AtomicReference<>(true);
  496. String orderStatus = newOrderDao.findStatus(orderProducts.get(0).getOrderProductId());
  497. if (orderStatus.length() < 2) {
  498. return false;
  499. }
  500. Map<Integer, Integer> shops = new HashMap<>();
  501. orderProducts.forEach(o -> {
  502. boolean b = shops.containsKey(o.getShopOrderId());
  503. if (b) {
  504. Integer num = shops.get(o.getShopOrderId());
  505. shops.put(o.getShopOrderId(), o.getDeliveryNum() + num);
  506. } else {
  507. shops.put(o.getShopOrderId(), o.getDeliveryNum());
  508. }
  509. });
  510. // 统计本次发货
  511. AtomicReference<Integer> totalDeliver = new AtomicReference<>(0);
  512. AtomicReference<Integer> orderId = new AtomicReference<>();
  513. shops.forEach((key, value) -> {
  514. NewShopOrder shopOrder = shopOrderDao.get(key);
  515. Integer outStoreNum = shopOrder.getOutStoreNum();
  516. int deliver = outStoreNum + value;
  517. int total = shopOrder.getItemCount() + shopOrder.getPresentNum();
  518. // 已发货+本次发货 > 子订单商品总数 + 赠品数
  519. if (deliver > total) {
  520. flag.set(false);
  521. return;
  522. }
  523. totalDeliver.set(totalDeliver.get() + value);
  524. // 2 部分发货 3全部发货
  525. int status = deliver < total ? 2 : 3;
  526. shopOrder.setOutStoreNum(outStoreNum + value);
  527. shopOrder.setSendOutStatus(Integer.toString(status));
  528. shopOrder.setOutStoreTimes(shopOrder.getOutStoreTimes() + 1);
  529. shopOrder.setPaying(0);
  530. shopOrderDao.update(shopOrder);
  531. orderId.set(shopOrder.getOrderId());
  532. });
  533. if (!flag.get()) {
  534. return flag.get();
  535. }
  536. Integer count = newOrderDao.findCountDeliver(orderId.get());
  537. Integer orderDeliverStatus = 3;
  538. if (count > totalDeliver.get()) {
  539. orderDeliverStatus = 2;
  540. }
  541. orderStatus = orderStatus.substring(0, 1) + orderDeliverStatus.toString();
  542. //同步更新主订单的发货状态
  543. newOrderDao.updateOrderStatus(orderDeliverStatus, orderStatus, orderId.get());
  544. return true;
  545. }
  546. public ResponseJson addReceiptRecord(Double amount, Integer orderId) {
  547. Double wait = newOrderDao.findWaitPay(orderId);
  548. if (amount > wait) {
  549. return ResponseJson.error("支付金额大于待付!");
  550. }
  551. ReceiptVo receiptVo = new ReceiptVo();
  552. // 31 线下凭证
  553. receiptVo.setPayType(31);
  554. receiptVo.setPayWay(2);
  555. receiptVo.setNewReceiptType(2);
  556. receiptVo.setReceiptType(1);
  557. receiptVo.setReceiptStatus(3);
  558. receiptVo.setReceiptAmount(amount.toString());
  559. receiptDao.insertOrderReceipt(receiptVo);
  560. OrderRelationRecord record = new OrderRelationRecord();
  561. record.setReceiptAmount(amount);
  562. record.setRelationType(2);
  563. record.setReceiptId(receiptVo.getId());
  564. record.setOrderId(orderId);
  565. receiptDao.insertOrderRelation(record);
  566. // 根据金额修改cm_order状态
  567. Integer status = 2;
  568. if (0 == wait - amount) {
  569. status = 3;
  570. }
  571. String orderStatus = newOrderDao.findOrderStatus(orderId);
  572. String substring = orderStatus.substring(orderStatus.length() - 1);
  573. orderStatus = status + substring;
  574. newOrderDao.updateReceiptStatus(status, orderStatus, orderId);
  575. return ResponseJson.success();
  576. }
  577. public List<SettleRecord> getSettleRecord(NewOrder newOrder) {
  578. List<SettleRecord> settleRecord = payShopDao.findSettleRecord(newOrder.getOrderId());
  579. settleRecord.forEach(s -> {
  580. double payCm = 0d;
  581. double payShop = 0d;
  582. double payOrg = 0d;
  583. payShop = 1 == s.getSettleType() ? s.getSettleAmount() : 0d;
  584. payCm = 2 == s.getSettleType() ? s.getSettleAmount() : 0d;
  585. payOrg = 3 == s.getSettleType() ? s.getSettleAmount() : 0d;
  586. s.setShouldSettleCm(payCm);
  587. s.setShouldSettleShop(payShop);
  588. s.setShouldSettleOrganize(payOrg);
  589. });
  590. return settleRecord;
  591. }
  592. public void setPayShopPostInfo(OrderPayShopDetail detail) {
  593. NewOrder order = newOrderDao.get(detail.getShopOrders().get(0).getOrderId().toString());
  594. NewShopOrder shopOrder = shopOrderDao.findColdChain(detail.getShopOrders().get(0).getOrderId());
  595. if (null != shopOrder) {
  596. order.setPostageInfo("2".equals(shopOrder.getShopPostFlag()) ?"到付": "0".equals(shopOrder.getShopPostFlag())?"包邮":"¥" + shopOrder.getShopPostFee());
  597. } else {
  598. /**
  599. * 没有运费订单
  600. */
  601. order.setPostageInfo("¥ 0.00");
  602. }
  603. }
  604. public void setShopPostInfo(NewShopOrder s) {
  605. NewOrder order = newOrderDao.get(s.getOrderId().toString());
  606. NewShopOrder shopOrder = shopOrderDao.findColdChain(s.getOrderId());
  607. if (null != shopOrder) {
  608. order.setPostageInfo("2".equals(shopOrder.getShopPostFlag()) ?"到付": "0".equals(shopOrder.getShopPostFlag())?"包邮":"¥" + shopOrder.getShopPostFee());
  609. } else {
  610. /**
  611. * 没有运费订单
  612. */
  613. order.setPostageInfo("¥ 0.00");
  614. }
  615. }
  616. public void setSettleStatus(NewOrder newOrder) {
  617. List<Integer> status = shopOrderDao.findSettleStatus(newOrder.getOrderId());
  618. if (!status.contains(3) && !status.contains(2)) {
  619. newOrder.setSettleStatus(1);
  620. }
  621. if (status.contains(2) || status.contains(3)) {
  622. newOrder.setSettleStatus(2);
  623. }
  624. if (!status.contains(1) && !status.contains(2)) {
  625. newOrder.setSettleStatus(3);
  626. }
  627. }
  628. }