OrderUtils.java 27 KB

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