OrderServiceImpl.java 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. package com.caimei.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.caimei.mapper.OrderMapper;
  4. import com.caimei.mapper.OrganizeMapper;
  5. import com.caimei.mapper.ProductMapper;
  6. import com.caimei.model.ResponseJson;
  7. import com.caimei.model.enumerate.ReceivablesType;
  8. import com.caimei.model.po.*;
  9. import com.caimei.model.vo.*;
  10. import com.caimei.service.OrderService;
  11. import com.caimei.utils.*;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  18. import org.springframework.util.CollectionUtils;
  19. import javax.annotation.Resource;
  20. import java.math.BigDecimal;
  21. import java.text.DecimalFormat;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. /**
  25. * @author Aslee
  26. */
  27. @Slf4j
  28. @Service
  29. public class OrderServiceImpl implements OrderService {
  30. @Resource
  31. private OrderMapper orderMapper;
  32. @Resource
  33. private OrganizeMapper organizeMapper;
  34. @Resource
  35. private ProductMapper productMapper;
  36. @Value("${caimei.oldapi}")
  37. private String domain;
  38. @Transactional
  39. @Override
  40. public ResponseJson orderSubmit(String cmAccount, String data) {
  41. // 获取组织信息
  42. CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
  43. if (null == organizePo) {
  44. return ResponseJson.error("参数异常,用户不存在");
  45. }
  46. // 获得用户Id
  47. Integer userId = organizePo.getUserId();
  48. JSONObject orderInfo = null;
  49. try {
  50. // 使用组织对应的公钥解密,获得订单数据
  51. orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
  52. // 私钥验签
  53. String preSign = orderInfo.getString("sign");
  54. orderInfo.remove("sign");
  55. String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
  56. if (!preSign.equals(sufSign)) {
  57. return ResponseJson.error("验签失败");
  58. }
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. return ResponseJson.error("解密失败");
  62. }
  63. String apiOrganizeOrderId;
  64. Map<String, Object> addressInfo;
  65. Map<String, Object> productInfo;
  66. BigDecimal orderShouldPayFee;
  67. Map<String, Object> invoiceInfo;
  68. String notifyUrl;
  69. try {
  70. addressInfo = orderInfo.getJSONObject("addressInfo");
  71. if (null == addressInfo) {
  72. return ResponseJson.error("地址数据异常");
  73. }
  74. // 组织订单Id,由组织自行生成,必须唯一
  75. apiOrganizeOrderId = orderInfo.getString("orderId");
  76. // 验证组织订单Id是否唯一
  77. Integer countByOrderId = orderMapper.getCountByOrderId(userId, apiOrganizeOrderId);
  78. if (null != countByOrderId && countByOrderId > 0) {
  79. return ResponseJson.error("订单Id已存在,请勿重复提交");
  80. }
  81. productInfo = orderInfo.getJSONObject("productInfo");
  82. if (null == productInfo) {
  83. return ResponseJson.error("订单商品数据异常");
  84. }
  85. orderShouldPayFee = orderInfo.getBigDecimal("orderShouldPayFee");
  86. if (null == orderShouldPayFee) {
  87. return ResponseJson.error("订单金额数据异常");
  88. }
  89. invoiceInfo = orderInfo.getJSONObject("invoiceInfo");
  90. if (null == invoiceInfo) {
  91. return ResponseJson.error("订单发票数据异常");
  92. }
  93. notifyUrl = orderInfo.getString("notifyUrl");
  94. if (StringUtils.isNotEmpty(notifyUrl) && !notifyUrl.equals(organizePo.getNotifyUrl())) {
  95. //更新回调地址
  96. orderMapper.updateNotifyUrl(organizePo.getOrganizeId(), notifyUrl);
  97. }
  98. } catch (Exception e) {
  99. return ResponseJson.error("数据异常");
  100. }
  101. log.info("******************** 提交订单逻辑处理 start *******************");
  102. //机构用户
  103. UserPo user = orderMapper.getUserByUserId(userId);
  104. if (null == user) {
  105. return ResponseJson.error("用户信息异常");
  106. }
  107. // 商品总数量
  108. Integer productCount = 0;
  109. // 赠品数量
  110. Integer presentCount = 0;
  111. //促销赠品数量
  112. Integer promotionalGiftsCount = 0;
  113. // 商品总金额 (商品单价乘以数量,再加上税费[默认0])
  114. BigDecimal productTotalFee = BigDecimal.ZERO;
  115. // 小计金额(商品折后单价乘以数量,再加上税费[默认0])
  116. BigDecimal orderTotalFee = BigDecimal.ZERO;
  117. // 订单总额(小计金额减去经理折扣后,再加上运费[默认0])
  118. BigDecimal payTotalFee = BigDecimal.ZERO;
  119. // 真实支付金额(订单总额减去抵扣的账户余额)
  120. BigDecimal payableAmount = BigDecimal.ZERO;
  121. /*
  122. * 发票信息获取
  123. */
  124. boolean invoiceFlag = false;
  125. BpOrderInvoicePo invoice = new BpOrderInvoicePo();
  126. Integer invoiceType = (Integer) invoiceInfo.get("type");
  127. if (null == invoiceType) {
  128. return ResponseJson.error("发票类型不能为空");
  129. } else {
  130. invoice.setType(invoiceType.longValue());
  131. if (0 != invoiceType) {
  132. // 发票类型 0不开发票 1普通发票 2增值税发票
  133. invoiceFlag = true;
  134. if (setInvoiceParam(invoiceInfo, invoice, invoiceType)) {
  135. return ResponseJson.error("发票信息不完整");
  136. }
  137. }
  138. }
  139. // 获取地址信息
  140. String provinceName = (String) addressInfo.get("provinceName");
  141. String cityName = (String) addressInfo.get("cityName");
  142. String townName = (String) addressInfo.get("townName");
  143. String receiveMan = (String) addressInfo.get("receiveMan");
  144. String mobile = (String) addressInfo.get("mobile");
  145. String addressDetail = (String) addressInfo.get("addressDetail");
  146. if (StringUtils.isEmpty(provinceName) || StringUtils.isEmpty(cityName) || StringUtils.isEmpty(townName) || StringUtils.isEmpty(receiveMan) || StringUtils.isEmpty(mobile)) {
  147. return ResponseJson.error("地址信息不完整");
  148. }
  149. Integer provinceId = orderMapper.getProvinceId(provinceName);
  150. Integer cityId = orderMapper.getCityId(cityName);
  151. Integer townId = orderMapper.getTownId(townName);
  152. if (null == provinceId || null == cityId || null == townId) {
  153. return ResponseJson.error("地址信息异常");
  154. }
  155. /*
  156. * 初始化主订单参数
  157. */
  158. CmOrderPo order = new CmOrderPo();
  159. String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
  160. // 订单号
  161. String orderNo = OrderNoUtils.getOrderNo("D");
  162. order.setOrderNo(orderNo);
  163. order.setApiOrganizeOrderId(apiOrganizeOrderId);
  164. // 运营人员下单
  165. order.setBuyUserID(user.getUserID());
  166. order.setOrderType(1);
  167. order.setOrderSubmitType(2);
  168. order.setConfirmFlag("2");
  169. order.setUserID(user.getUserID().longValue());
  170. // 机构ID
  171. order.setClubID(user.getClubID().longValue());
  172. // 订单来源
  173. order.setOrderSource("7");
  174. order.setOrganizeID(0);
  175. order.setUpdateDate(curDateStr);
  176. order.setPayFlag("0");
  177. order.setCooFreeFlag("0");
  178. order.setCooFreeAmount(BigDecimal.ZERO);
  179. order.setCooFreeRate(0);
  180. order.setOnlinePayFlag("0");
  181. order.setPreferential(BigDecimal.ZERO);
  182. order.setDiscountFee(BigDecimal.ZERO);
  183. // 订单提交时间
  184. order.setOrderTime(curDateStr);
  185. // 默认订单可以拆分
  186. order.setSplitFlag("1");
  187. // 发票类型
  188. order.setInvoiceFlag(invoiceType.toString());
  189. order.setReceiptStatus("1");
  190. order.setPayStatus("1");
  191. order.setZeroCostFlag(0);
  192. order.setSendOutStatus("1");
  193. order.setRefundType("0");
  194. // 是否包含活动商品(受订单未支付自动关闭时间影响) 0 否 1 是
  195. order.setHasActProduct("0");
  196. // 订单状态 0 有效 其它无效
  197. order.setDelFlag("0");
  198. // 是否确认付款供应商
  199. order.setAffirmPaymentFlag("0");
  200. /*
  201. 订单商品
  202. */
  203. List<CmOrderProductPo> orderProductList = new ArrayList<>();
  204. // 收集供应商ID列表
  205. List<Integer> shopIdList = new ArrayList<>();
  206. for (Map.Entry<String, Object> product : productInfo.entrySet()) {
  207. String productId = product.getKey();
  208. Integer productNum = (Integer)product.getValue();
  209. // 统计商品数量
  210. productCount += productNum;
  211. // 获取商品信息
  212. CmApiOrganizeProductPo organizeProduct = productMapper.getProductByProductId(productId);
  213. if (productNum < organizeProduct.getMinBuyNumber()) {
  214. return ResponseJson.error("商品购买数量不能少于最小起订量");
  215. }
  216. if (null == organizeProduct) {
  217. return ResponseJson.error("订单商品数据异常");
  218. }
  219. if (null == productNum || productNum == 0) {
  220. return ResponseJson.error("商品购买数量异常");
  221. }
  222. // 获取商品购买价格(活动价格>>>阶梯价格>>>复购价格库>>>商品原始价)
  223. BigDecimal productPrice = organizeProduct.getPrice();
  224. // 成本价
  225. BigDecimal costPrice = BigDecimal.ZERO;
  226. // 机构税费(单)
  227. BigDecimal addedValueTax = new BigDecimal(0);
  228. int priceType = 0;
  229. // 活动状态
  230. organizeProduct.setActStatus(0);
  231. if (1 == organizeProduct.getLadderPriceFlag()) {
  232. // 启用了阶梯价格
  233. List<LadderPriceVo> ladderPriceList = productMapper.getLadderPriceByProductId(organizeProduct.getId());
  234. // 判断阶梯价格的购买数量校验
  235. long minBuyNumber = null != ladderPriceList.get(0) ? ladderPriceList.get(0).getBuyNum() : 0L;
  236. if (productNum < minBuyNumber) {
  237. return ResponseJson.error("商品购买量低于最小起订量");
  238. }
  239. //根据商品购买数量获取商品对应阶梯价格
  240. for (LadderPriceVo ladderPrice : ladderPriceList) {
  241. if (productNum >= ladderPrice.getBuyNum()) {
  242. productPrice = ladderPrice.getBuyPrice();
  243. }
  244. }
  245. organizeProduct.setActStatus(2);
  246. priceType = 2;
  247. }
  248. //不含税可开票商品计算税费
  249. boolean addTaxFlag = 0 == organizeProduct.getIncludedTax() && (1 == organizeProduct.getInvoiceType() || 2 == organizeProduct.getInvoiceType());
  250. if (addTaxFlag) {
  251. addedValueTax = MathUtil.div(MathUtil.mul(productPrice, organizeProduct.getClubTaxPoint()), BigDecimal.valueOf(100));
  252. productPrice = MathUtil.add(productPrice, addedValueTax);
  253. }
  254. if (MathUtil.compare(productPrice, BigDecimal.ZERO) == 0) {
  255. return ResponseJson.error("商品购买价格不能为0");
  256. }
  257. // 单个商品的金额
  258. BigDecimal productFee = MathUtil.mul(productPrice, productNum);
  259. // 统计商品总金额
  260. productTotalFee = MathUtil.add(productTotalFee, productFee);
  261. // 判断是否选中固定成本价
  262. if (MathUtil.compare(organizeProduct.getCostPrice(), 0) > 0 && 1 == organizeProduct.getCostType()) {
  263. costPrice = organizeProduct.getCostPrice();
  264. }
  265. // 判断是否选中比例成本价
  266. if (MathUtil.compare(organizeProduct.getCostProportional(), 0) > 0 && 2 == organizeProduct.getCostType()) {
  267. // 通过售价*比例得到成本价
  268. costPrice = BigDecimal.valueOf(MathUtil.div(MathUtil.mul(productPrice, organizeProduct.getCostProportional()), 100).floatValue());
  269. }
  270. organizeProduct.setCostPrice(costPrice);
  271. /*
  272. * 整理订单商品数据
  273. */
  274. CmOrderProductPo orderProduct = setOrderProduct(productNum, organizeProduct, productPrice, priceType, 0, addedValueTax);
  275. // 加入订单商品列表
  276. orderProductList.add(orderProduct);
  277. // 保存供应商id
  278. if (!shopIdList.contains(orderProduct.getShopID().intValue())) {
  279. shopIdList.add(orderProduct.getShopID().intValue());
  280. }
  281. }
  282. // 设置是否是二手订单
  283. order.setSecondHandOrderFlag("0");
  284. order.setPromotionFullReduction(BigDecimal.ZERO);
  285. // 商品总数量
  286. order.setProductCount(productCount);
  287. // 赠品数量
  288. order.setPresentCount(0);
  289. //促销赠品数量
  290. order.setPromotionalGiftsCount(0);
  291. // 0包邮 -1到付 1 有运费
  292. order.setFreePostFlag("-1");
  293. order.setFreight(BigDecimal.ZERO);
  294. // 商品总额
  295. order.setProductTotalFee(productTotalFee);
  296. // 订单总额(商品金额+运费)
  297. payTotalFee = productTotalFee;
  298. orderTotalFee = productTotalFee;
  299. order.setOrderTotalFee(orderTotalFee);
  300. order.setPayTotalFee(payTotalFee);
  301. payableAmount = payTotalFee;
  302. // 订单状态
  303. order.setStatus("11");
  304. order.setConfirmTime(curDateStr);
  305. // 余额支付金额
  306. order.setBalancePayFee(BigDecimal.ZERO);
  307. // 实际支付金额(商品金额+运费-余额抵扣)
  308. order.setPayableAmount(payableAmount);
  309. // 售后条款
  310. order.setClauseID(1L);
  311. order.setClauseName("无条款");
  312. // 是否返佣订单
  313. order.setRebateFlag("0");
  314. // 判断前端传入orderShouldPayFee订单应付金额,和后台计算应付金额对比
  315. double v = MathUtil.sub(payableAmount, orderShouldPayFee).doubleValue();
  316. log.info(">>>>>payableAmount:" + payableAmount + " ,orderShouldPayFee:" + orderShouldPayFee);
  317. // 考虑前端计算不精确
  318. if (v < -0.1d || v > 0.1d) {
  319. // 设置手动回滚事务
  320. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  321. return ResponseJson.error("订单付款金额异常");
  322. }
  323. /*
  324. * 保存主订单数据
  325. */
  326. orderMapper.insertOrder(order);
  327. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增主订单(insert[cm_order])orderId:" + order.getOrderID());
  328. /*
  329. * 设置订单商品订单号
  330. */
  331. for (CmOrderProductPo orderProduct : orderProductList) {
  332. orderProduct.setOrderID(order.getOrderID());
  333. orderProduct.setOrderNo(order.getOrderNo());
  334. }
  335. /*
  336. * 整理 子订单信息
  337. */
  338. // 收集子订单供应商ID字符串
  339. String shopOrderIds = "";
  340. for (Integer shopId : shopIdList) {
  341. // 初始化子订单信息
  342. CmShopOrderPo shopOrder = saveShopOrder(order, orderProductList, shopId, "");
  343. // 保存子订单号
  344. shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + shopOrder.getShopOrderID());
  345. // 设置订单商品子订单号
  346. for (CmOrderProductPo orderProduct : orderProductList) {
  347. if (shopId.longValue() == orderProduct.getShopID()) {
  348. orderProduct.setShopOrderID(shopOrder.getShopOrderID());
  349. orderProduct.setShopOrderNo(shopOrder.getShopOrderNo());
  350. }
  351. }
  352. }
  353. /*
  354. * 保存订单商品
  355. */
  356. List<OrderProductLadderPricePo> orderProductLadderPriceList = new ArrayList<>();
  357. for (CmOrderProductPo orderProduct : orderProductList) {
  358. // 保存订单商品数据
  359. orderMapper.insertOrderProduct(orderProduct);
  360. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单商品(insert[cm_order_product])OrderProductID:" + orderProduct.getOrderProductID());
  361. if ("1".equals(orderProduct.getLadderPriceFlag())) {
  362. //使用阶梯价格的订单商品保存下单时的阶梯价格列表
  363. List<LadderPriceVo> ladderPriceList = productMapper.findLadderPriceByProductId(orderProduct.getProductID());
  364. ladderPriceList.forEach(ladderPriceVo -> {
  365. OrderProductLadderPricePo orderProductLadderPrice = new OrderProductLadderPricePo();
  366. orderProductLadderPrice.setOrderProductId(orderProduct.getOrderProductID());
  367. orderProductLadderPrice.setBuyNum(ladderPriceVo.getBuyNum());
  368. orderProductLadderPrice.setBuyPrice(ladderPriceVo.getBuyPrice());
  369. orderProductLadderPrice.setCreateDate(new Date());
  370. orderProductLadderPrice.setLadderNum(ladderPriceVo.getLadderNum());
  371. orderProductLadderPriceList.add(orderProductLadderPrice);
  372. });
  373. }
  374. }
  375. if (!CollectionUtils.isEmpty(orderProductLadderPriceList)) {
  376. orderProductLadderPriceList.forEach(ladderPrice -> {
  377. orderMapper.insertOrderProductLadderPrice(ladderPrice);
  378. });
  379. }
  380. /*
  381. * 设置邮费子订单
  382. */
  383. if ("1".equals(order.getFreePostFlag())) {
  384. shopOrderIds = setPostFeeShopOrder(order, shopOrderIds, orderInfo.size());
  385. }
  386. // 更新主订单信息, 子订单ID:1000,1002
  387. order.setShopOrderIDs(shopOrderIds);
  388. orderMapper.updateOrder(order);
  389. /*
  390. * 保存 订单用户地址
  391. */
  392. //保存地址信息
  393. BpOrderUserInfoPo userInfo = new BpOrderUserInfoPo();
  394. userInfo.setOrderId(order.getOrderID());
  395. userInfo.setClubId(user.getClubID().longValue());
  396. userInfo.setUserId(user.getUserID().longValue());
  397. userInfo.setName(user.getName() == null ? user.getUserName() : user.getName());
  398. userInfo.setShouHuoRen(receiveMan);
  399. userInfo.setMobile(mobile);
  400. userInfo.setPostalCode(null);
  401. userInfo.setPostalCode(null);
  402. userInfo.setTownId(townId);
  403. userInfo.setProvince(provinceName);
  404. userInfo.setCity(cityName);
  405. userInfo.setTown(townName);
  406. userInfo.setAddress(addressDetail);
  407. orderMapper.insertUserInfo(userInfo);
  408. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单用户地址(insert[bp_order_userinfo])orderId:" + order.getOrderID());
  409. /*
  410. * 保存 订单发票信息
  411. */
  412. if (invoiceFlag) {
  413. // 开发票才保存
  414. invoice.setOrderId(order.getOrderID());
  415. // 查询是否存在老的增值税信息
  416. BpOrderInvoicePo userInvoice = orderMapper.getOrderInvoice(order.getOrderID());
  417. if (null != userInvoice) {
  418. // 更新 发票信息
  419. orderMapper.updateOrderInvoice(invoice);
  420. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>更新发票信息(update[bp_order_invoice])orderId:" + order.getOrderID());
  421. } else {
  422. // 保存 发票信息
  423. orderMapper.insertOrderInvoice(invoice);
  424. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增发票信息(insert[bp_order_invoice])orderId:" + order.getOrderID());
  425. }
  426. }
  427. log.info("******************** 提交订单逻辑处理 end *******************");
  428. /*
  429. * 构造返回参数
  430. */
  431. Map<String, String> info = new HashMap<>(5);
  432. //组织订单id
  433. info.put("orderId", apiOrganizeOrderId);
  434. //真实需要付款金额
  435. info.put("payableAmount", String.valueOf(order.getPayableAmount()));
  436. return ResponseJson.success(info);
  437. }
  438. @Override
  439. public ResponseJson<Map<String,Object>> orderDetail(String cmAccount, String data) {
  440. // 获取组织信息
  441. CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
  442. if (null == organizePo) {
  443. return ResponseJson.error("参数异常,用户不存在", null);
  444. }
  445. // 获取用户id
  446. Integer userId = organizePo.getUserId();
  447. JSONObject orderInfo = null;
  448. try {
  449. // 使用组织对应的公钥解密,获得订单数据
  450. orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
  451. // 私钥验签
  452. String preSign = orderInfo.getString("sign");
  453. orderInfo.remove("sign");
  454. String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
  455. if (!preSign.equals(sufSign)) {
  456. return ResponseJson.error("验签失败", null);
  457. }
  458. } catch (Exception e) {
  459. e.printStackTrace();
  460. return ResponseJson.error("解密失败", null);
  461. }
  462. String apiOrganizeOrderId = (String) orderInfo.get("orderId");
  463. if (StringUtils.isEmpty(apiOrganizeOrderId)) {
  464. return ResponseJson.error("参数异常,订单Id不能为空",null);
  465. }
  466. // 订单信息,运费
  467. OrderVo order = orderMapper.getOrderInfo(userId, apiOrganizeOrderId);
  468. if (null == order) {
  469. return ResponseJson.error("该订单不存在", null);
  470. }
  471. // 收货地址
  472. AddressInfoVo addressInfo = orderMapper.getAddressInfo(order.getOrderID().intValue());
  473. // 收款列表
  474. getDiscernReceipt(order);
  475. CmOrderVo cmOrderVo = new CmOrderVo();
  476. // 应付金额
  477. cmOrderVo.setPayableAmount(order.getPayableAmount());
  478. // 待付金额
  479. cmOrderVo.setPendingPayments(order.getPendingPayments());
  480. // 收发状态
  481. cmOrderVo.setStatus(order.getStatus());
  482. // 退款状态
  483. cmOrderVo.setRefundType(order.getRefundType());
  484. // 退款记录
  485. List<CmReturnedPurchasePo> returnedPurchaseList = orderMapper.findReturnedPurchase(order.getOrderID());
  486. if (returnedPurchaseList != null && returnedPurchaseList.size() > 0) {
  487. BigDecimal returnedPurchaseFee = new BigDecimal(0);
  488. for (CmReturnedPurchasePo returnedPurchase : returnedPurchaseList) {
  489. returnedPurchaseFee = returnedPurchaseFee.add(returnedPurchase.getRefundFee());
  490. }
  491. //退款总金额
  492. cmOrderVo.setReturnedPurchaseFee(returnedPurchaseFee);
  493. }
  494. // 发票信息
  495. BpOrderInvoiceVo invoiceInfo = orderMapper.getOrderInvoiceVo(order.getOrderID());
  496. // 商品信息
  497. List<OrderProductVo> dbProductList = productMapper.getOrderProduct(order.getOrderID());
  498. List<DisplayOrderProductVo> orderProductList = new ArrayList<>();
  499. DecimalFormat decimalFormat = new DecimalFormat("0000");
  500. for (OrderProductVo orderProduct : dbProductList) {
  501. DisplayOrderProductVo product = new DisplayOrderProductVo();
  502. product.setProductId(decimalFormat.format(orderProduct.getApiOrganizeProductId()));
  503. product.setImage(ImageUtils.getImageURL("product", orderProduct.getProductImage(), 0, domain));
  504. product.setProductName(orderProduct.getName());
  505. product.setShopName(orderProduct.getShopName());
  506. product.setUnit(orderProduct.getProductUnit());
  507. product.setPrice(orderProduct.getDiscountPrice());
  508. product.setProductNum(orderProduct.getNum());
  509. product.setTaxRate(orderProduct.getTaxRate());
  510. //是否包含充值商品
  511. /*if (OrderNoUtils.getRechargeProduct(orderProduct.getProductID())) {
  512. order.setRechargeGoods(true);
  513. }*/
  514. //已发货数量
  515. product.setShipmentsNum(orderProduct.getNum() + orderProduct.getPresentNum() - orderProduct.getNotOutStore());
  516. //已退货数量
  517. Integer returnedNum = orderMapper.returnedPurchase(orderProduct.getShopOrderID(), orderProduct.getProductID());
  518. returnedNum = null != returnedNum ? returnedNum : 0;
  519. product.setReturnedNum(returnedNum);
  520. //已取消发货数量
  521. Integer actualCancelNum = orderMapper.actualCancelNum(orderProduct.getShopOrderID(), orderProduct.getProductID());
  522. actualCancelNum = null != actualCancelNum ? actualCancelNum : 0;
  523. product.setActualCancelNum(actualCancelNum);
  524. //判断商品价格是否含税
  525. if ("1".equals(orderProduct.getIncludedTax()) || ("0".equals(orderProduct.getIncludedTax()) && ("1".equals(orderProduct.getInvoiceType()) || "2".equals(orderProduct.getInvoiceType())))) {
  526. product.setIncludedTaxFlag("2");
  527. } else if (orderProduct.getIncludedTax() != null && "0".equals(orderProduct.getIncludedTax()) && "3".equals(orderProduct.getInvoiceType())) {
  528. product.setIncludedTaxFlag("1");
  529. } else {
  530. product.setIncludedTaxFlag("3");
  531. }
  532. //不含税可开票商品,单价/折后单价在原基础上加上税费
  533. if ("0".equals(orderProduct.getIncludedTax()) && ("1".equals(orderProduct.getInvoiceType()) || "2".equals(orderProduct.getInvoiceType()))) {
  534. product.setPrice(MathUtil.add(product.getPrice(), orderProduct.getAddedValueTax()));
  535. }
  536. orderProductList.add(product);
  537. }
  538. HashMap<String, Object> orderDetail = new HashMap<>();
  539. orderDetail.put("orderId", apiOrganizeOrderId);
  540. orderDetail.put("addressInfo", addressInfo);
  541. orderDetail.put("orderInfo", cmOrderVo);
  542. orderDetail.put("productInfo", orderProductList);
  543. orderDetail.put("invoiceInfo", invoiceInfo);
  544. return ResponseJson.success(orderDetail);
  545. }
  546. @Override
  547. public ResponseJson orderCancel(String cmAccount, String data) {
  548. // 获取组织信息
  549. CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
  550. if (null == organizePo) {
  551. return ResponseJson.error("参数异常,用户不存在", null);
  552. }
  553. // 获取用户id
  554. Integer userId = organizePo.getUserId();
  555. JSONObject orderInfo = null;
  556. try {
  557. // 使用组织对应的公钥解密,获得订单数据
  558. orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
  559. // 私钥验签
  560. String preSign = orderInfo.getString("sign");
  561. orderInfo.remove("sign");
  562. String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
  563. if (!preSign.equals(sufSign)) {
  564. return ResponseJson.error("验签失败", null);
  565. }
  566. } catch (Exception e) {
  567. e.printStackTrace();
  568. return ResponseJson.error("解密失败", null);
  569. }
  570. String apiOrganizeOrderId = (String) orderInfo.get("orderId");
  571. if (StringUtils.isEmpty(apiOrganizeOrderId)) {
  572. return ResponseJson.error("参数异常,订单Id不能为空",null);
  573. }
  574. CmOrderPo order = orderMapper.getOrder(userId, apiOrganizeOrderId);
  575. if (null == order) {
  576. return ResponseJson.error("该订单不存在");
  577. }
  578. if (!("11".equals(order.getStatus()) || "0".equals(order.getStatus()))) {
  579. return ResponseJson.error("只有未收款未发货的订单才能取消");
  580. }
  581. order.setStatus("6");
  582. order.setCloseReason("协销或用户主动取消订单");
  583. order.setCloseTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  584. orderMapper.updateOrder(order);
  585. return ResponseJson.success();
  586. }
  587. @Override
  588. public ResponseJson payCallBack(String cmAccount, String data) {
  589. // 获取组织信息
  590. CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
  591. if (null == organizePo) {
  592. return ResponseJson.error("参数异常,用户不存在", null);
  593. }
  594. // 获取用户id
  595. Integer userId = organizePo.getUserId();
  596. JSONObject orderInfo = null;
  597. try {
  598. // 使用组织对应的公钥解密,获得订单数据
  599. orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
  600. // 私钥验签
  601. String preSign = orderInfo.getString("sign");
  602. orderInfo.remove("sign");
  603. String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
  604. if (!preSign.equals(sufSign)) {
  605. return ResponseJson.error("验签失败", null);
  606. }
  607. } catch (Exception e) {
  608. e.printStackTrace();
  609. return ResponseJson.error("解密失败", null);
  610. }
  611. String orderId = (String) orderInfo.get("orderId");
  612. String result = (String) orderInfo.get("result");
  613. Double amount = orderInfo.getDouble("amount");
  614. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>订单支付完成通知回调:orderId:" + orderId + ",amount:" + amount + ",result:" + result);
  615. return ResponseJson.success("SUCCESS");
  616. }
  617. /**
  618. * 设置订单发票
  619. *
  620. * @param orderInvoice
  621. * @param invoice
  622. * @param invoiceType
  623. * @return
  624. */
  625. private boolean setInvoiceParam(Map<String, Object> orderInvoice, BpOrderInvoicePo invoice, Integer invoiceType) {
  626. String invoiceTitle = (String) (null != orderInvoice.get("invoiceTitle") ? orderInvoice.get("invoiceTitle") : "");
  627. invoice.setInvoiceTitle(invoiceTitle);
  628. if (1 == invoiceType) {
  629. // 普通发票:发票类型、发票内容(商品明细)、抬头(公司名称)、纳税人识别号[普通发票的公司]
  630. String invoiceContent = (String) (null != orderInvoice.get("invoiceContent") ? orderInvoice.get("invoiceContent") : "");
  631. String invoiceTitleType = (null != orderInvoice.get("invoiceTitleType") ? orderInvoice.get("invoiceTitleType") : "").toString();
  632. if ("".equals(invoiceTitle) || "".equals(invoiceContent) || "".equals(invoiceTitleType)) {
  633. return true;
  634. }
  635. if ("1".equals(invoiceTitleType)) {
  636. // 企业
  637. String corporationTaxNum = (String) (null != orderInvoice.get("corporationTaxNum") ? orderInvoice.get("corporationTaxNum") : "");
  638. if ("".equals(corporationTaxNum)) {
  639. return true;
  640. }
  641. invoice.setCorporationTaxNum(corporationTaxNum);
  642. }
  643. invoice.setInvoiceContent(invoiceContent);
  644. } else if (2 == invoiceType) {
  645. // 增值税发票:发票类型、发票、抬头(公司名称)、纳税人识别号、注册地址、注册电话、开户银行、开户银行账户
  646. String corporationTaxNum = (String) (null != orderInvoice.get("corporationTaxNum") ? orderInvoice.get("corporationTaxNum") : "");
  647. String registeredAddress = (String) (null != orderInvoice.get("registeredAddress") ? orderInvoice.get("registeredAddress") : "");
  648. String registeredPhone = (String) (null != orderInvoice.get("registeredPhone") ? orderInvoice.get("registeredPhone") : "");
  649. String openBank = (String) (null != orderInvoice.get("openBank") ? orderInvoice.get("openBank") : "");
  650. String bankAccountNo = (String) (null != orderInvoice.get("bankAccountNo") ? orderInvoice.get("bankAccountNo") : "");
  651. boolean flag = "".equals(invoiceTitle) || "".equals(corporationTaxNum) || "".equals(registeredAddress) || "".equals(registeredPhone) || "".equals(openBank) || "".equals(bankAccountNo);
  652. if (flag) {
  653. return true;
  654. }
  655. invoice.setCorporationTaxNum(corporationTaxNum);
  656. invoice.setRegisteredAddress(registeredAddress);
  657. invoice.setRegisteredPhone(registeredPhone);
  658. invoice.setOpenBank(openBank);
  659. invoice.setBankAccountNo(bankAccountNo);
  660. }
  661. return false;
  662. }
  663. /**
  664. * 整理订单商品数据
  665. *
  666. * @param productNum
  667. * @param product
  668. * @param productPrice
  669. * @param priceType 0正常商品 1促销商品 2阶梯价 3复购价
  670. * @param productType
  671. * @return
  672. */
  673. private CmOrderProductPo setOrderProduct(Integer productNum, CmApiOrganizeProductPo product, BigDecimal productPrice, Integer priceType, Integer productType, BigDecimal addedValueTax) {
  674. CmOrderProductPo orderProduct = new CmOrderProductPo();
  675. orderProduct.setShopID(product.getShopId().longValue());
  676. orderProduct.setProductID(product.getProductId());
  677. // orderProduct.setOrganizeProductID(product.getId());
  678. // 预留在保存保存子订单的时候添加
  679. orderProduct.setProductNo(null);
  680. orderProduct.setNum(productNum);
  681. orderProduct.setPresentNum(0);
  682. orderProduct.setProductUnit(product.getUnit());
  683. if (MathUtil.compare(product.getNormalPrice(), 0) > 0) {
  684. orderProduct.setNormalPrice(product.getNormalPrice());
  685. } else {
  686. orderProduct.setNormalPrice(BigDecimal.ZERO);
  687. }
  688. orderProduct.setCostPrice(product.getCostPrice());
  689. orderProduct.setPrice0(product.getPrice());
  690. orderProduct.setPrice1(product.getPrice());
  691. orderProduct.setTotalAmount(MathUtil.mul(product.getPrice(), productNum));
  692. orderProduct.setDiscount(new BigDecimal(100));
  693. // 经理折扣(优惠金额)
  694. orderProduct.setDiscountFee(new BigDecimal(0));
  695. //机构税率
  696. orderProduct.setTaxRate(product.getClubTaxPoint() == null ? new BigDecimal(0) : product.getClubTaxPoint());
  697. //供应商税率
  698. orderProduct.setSupplierTaxRate(BigDecimal.valueOf(0));
  699. orderProduct.setIncludedTax(product.getIncludedTax().toString());
  700. orderProduct.setInvoiceType(product.getInvoiceType().toString());
  701. BigDecimal singleShouldPayTotalTax = new BigDecimal(0);
  702. if (productType == 2) {
  703. //促销赠品置机构税率和供应商税率为0
  704. orderProduct.setTaxRate(BigDecimal.ZERO);
  705. orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
  706. } else {
  707. //不含税可开发票商品设置税费
  708. if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
  709. //供应商税费(单)=成本价 * 供应商税率
  710. if (product.getShopTaxPoint() == null) {
  711. orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
  712. } else {
  713. orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
  714. }
  715. singleShouldPayTotalTax = MathUtil.div(MathUtil.mul(product.getCostPrice(), orderProduct.getSupplierTaxRate()), BigDecimal.valueOf(100));
  716. } else if (1 == product.getIncludedTax()) {
  717. //含税商品设置供应商税率
  718. if (product.getShopTaxPoint() == null) {
  719. orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
  720. } else {
  721. orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
  722. }
  723. } else if ((0 == product.getIncludedTax() && 3 == product.getInvoiceType()) || 2 == product.getIncludedTax()) {
  724. //不含税不可开票商品和未知商品,税率置为0
  725. orderProduct.setTaxRate(BigDecimal.ZERO);
  726. orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
  727. }
  728. }
  729. orderProduct.setAddedValueTax(addedValueTax);
  730. //机构税费(总)=机构税费(单) * 商品数量
  731. orderProduct.setTotalAddedValueTax(MathUtil.mul(addedValueTax, productNum));
  732. orderProduct.setSingleShouldPayTotalTax(singleShouldPayTotalTax);
  733. //供应商税费(总)=供应商税费(单) * 商品数量
  734. orderProduct.setShouldPayTotalTax(MathUtil.mul(singleShouldPayTotalTax, productNum));
  735. orderProduct.setTotalFee(MathUtil.mul(productPrice, productNum));
  736. orderProduct.setShouldPayFee(MathUtil.mul(productPrice, productNum));
  737. // 商品费=成本价快照*(购买数量 + 赠品数量)
  738. orderProduct.setShopProductAmount(MathUtil.mul(product.getCostPrice(), BigDecimal.valueOf(productNum)));
  739. //不含税可开票商品,单价/折后单价=售价-税费
  740. if (priceType == 0 || priceType == 1) {
  741. //正常价格和促销价格
  742. orderProduct.setPrice(product.getPrice());
  743. orderProduct.setDiscountPrice(product.getPrice());
  744. } else if (priceType == 2) {
  745. //阶梯价
  746. BigDecimal price1 = productPrice;
  747. //不含税可开票商品,单价/折后单价=售价-税费
  748. if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
  749. price1 = MathUtil.sub(productPrice, orderProduct.getAddedValueTax());
  750. }
  751. orderProduct.setPrice(price1);
  752. orderProduct.setDiscountPrice(price1);
  753. }
  754. //应付供应商(单)=成本价+供应商税费(单)
  755. BigDecimal singleShopFee = MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax);
  756. orderProduct.setSingleShopFee(singleShopFee);
  757. // 应付供应商(总)=应付供应商(单) * 商品数量
  758. orderProduct.setShopFee(MathUtil.mul(singleShopFee, BigDecimal.valueOf(productNum)));
  759. orderProduct.setOtherFee(new BigDecimal(0));
  760. orderProduct.setSingleOtherFee(new BigDecimal(0));
  761. //应付采美(单)=单价+机构税费(单)-(成本(单)+供应商税费(单))
  762. BigDecimal singleCmFee = MathUtil.sub(MathUtil.add(product.getPrice(), orderProduct.getAddedValueTax()), MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax));
  763. orderProduct.setSingleCmFee(singleCmFee);
  764. // 应付采美(总)=应付采美(单)*商品数量
  765. BigDecimal cmFee = MathUtil.mul(singleCmFee, BigDecimal.valueOf(productNum));
  766. orderProduct.setCmFee(cmFee);
  767. orderProduct.setTotalBeans(new BigDecimal(0));
  768. orderProduct.setUseBalanceAmount(0d);
  769. // 优惠金额
  770. orderProduct.setPreferential(new BigDecimal(0));
  771. orderProduct.setUseBalanceAmount(0d);
  772. // 订单商品供应商确认标志 0否 1是
  773. orderProduct.setConfirmProductFlag("0");
  774. orderProduct.setShopName(product.getShopName());
  775. orderProduct.setName(product.getName());
  776. orderProduct.setPayStatus("0");
  777. orderProduct.setBuyAgainFlag("0");
  778. // 未出库数量
  779. orderProduct.setNotOutStore(productNum);
  780. // 是否已评论 1 是 0 未评论
  781. orderProduct.setCommentFlag("0");
  782. orderProduct.setActPreferential(new BigDecimal(0));
  783. orderProduct.setActType(null);
  784. orderProduct.setIsActProduct(product.getActStatus().toString());
  785. orderProduct.setLadderPriceFlag(product.getActStatus() == 2 ? "1" : "0");
  786. orderProduct.setProductImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
  787. orderProduct.setProductType(productType.toString());
  788. //促销赠品
  789. if (productType == 2) {
  790. orderProduct.setPrice0(BigDecimal.ZERO);
  791. orderProduct.setPrice1(BigDecimal.ZERO);
  792. orderProduct.setTotalAmount(BigDecimal.ZERO);
  793. orderProduct.setTotalFee(BigDecimal.ZERO);
  794. orderProduct.setDiscountPrice(BigDecimal.ZERO);
  795. orderProduct.setTotalAddedValueTax(BigDecimal.ZERO);
  796. orderProduct.setShouldPayTotalTax(BigDecimal.ZERO);
  797. }
  798. return orderProduct;
  799. }
  800. /**
  801. * 计算总运费
  802. *
  803. * @param provinceId
  804. * @param cityId
  805. * @return totalPostageFee
  806. */
  807. public Double computedPostageFee(Integer provinceId, Integer cityId) {
  808. if (202 == cityId) {
  809. // 深圳市内运费10元
  810. return 10d;
  811. } else if (19 == provinceId) {
  812. // 广东省内深圳市外运费15元
  813. return 15d;
  814. } else {
  815. return -1d;
  816. }
  817. }
  818. /**
  819. * 保存子订单,并返回子订单ids
  820. *
  821. * @param order
  822. * @param orderProductList
  823. * @param shopId
  824. * @param shopNote
  825. * @return
  826. */
  827. private CmShopOrderPo saveShopOrder(CmOrderPo order, List<CmOrderProductPo> orderProductList, Integer shopId, String shopNote) {
  828. /*
  829. * 初始化子订单信息
  830. */
  831. CmShopOrderPo shopOrder = new CmShopOrderPo();
  832. // 子订单编号
  833. String shopOrderNo = "";
  834. String maxShopOrderNo = orderMapper.findMaxShopOrderNo(order.getOrderID());
  835. if (StringUtils.isNotBlank(maxShopOrderNo)) {
  836. shopOrderNo = maxShopOrderNo;
  837. shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), Integer.parseInt(shopOrderNo.substring(shopOrderNo.length() - 2, shopOrderNo.length())) + 1));
  838. } else {
  839. shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), 1));
  840. }
  841. shopOrder.setShopID(shopId);
  842. shopOrder.setClubID(order.getClubID().intValue());
  843. shopOrder.setOrderID(order.getOrderID());
  844. shopOrder.setOrderNo(order.getOrderNo());
  845. shopOrder.setUserID(order.getUserID().intValue());
  846. shopOrder.setOrganizeID(order.getOrganizeID());
  847. /*
  848. * 统计子订单金额信息
  849. */
  850. // 订单总金额
  851. BigDecimal totalAmount = new BigDecimal(0);
  852. // 商品总金额
  853. BigDecimal productAmount = new BigDecimal(0);
  854. // 需要支付金额
  855. BigDecimal needPayAmount = new BigDecimal(0);
  856. // 优惠金额
  857. BigDecimal preferential = new BigDecimal(0);
  858. // 佣金
  859. BigDecimal brokerage = new BigDecimal(0);
  860. // 商品费
  861. BigDecimal shopProductAmount = new BigDecimal(0);
  862. // 供应商税费
  863. BigDecimal shopTaxFee = new BigDecimal(0);
  864. // 总购买数
  865. Integer buyNum = 0;
  866. // 计算子订单信息
  867. for (CmOrderProductPo orderProduct : orderProductList) {
  868. if (shopId.longValue() == orderProduct.getShopID()) {
  869. // 商品总金额
  870. productAmount = MathUtil.add(productAmount, orderProduct.getTotalAmount());
  871. // 订单总金额 包括税费
  872. totalAmount = MathUtil.add(totalAmount, orderProduct.getTotalFee());
  873. // 应付金额
  874. needPayAmount = MathUtil.add(needPayAmount, orderProduct.getShouldPayFee());
  875. // 总购买数
  876. buyNum += orderProduct.getNum();
  877. preferential = MathUtil.add(preferential, orderProduct.getPreferential());
  878. brokerage = MathUtil.add(brokerage, orderProduct.getCmFee());
  879. if (null != orderProduct.getShopProductAmount()) {
  880. shopProductAmount = MathUtil.add(shopProductAmount, orderProduct.getShopProductAmount());
  881. }
  882. if (null != orderProduct.getShouldPayTotalTax()) {
  883. shopTaxFee = MathUtil.add(shopTaxFee, orderProduct.getShouldPayTotalTax());
  884. }
  885. }
  886. }
  887. shopOrder.setPromotionFullReduction(BigDecimal.ZERO);
  888. // freePostFlag: 0包邮 -1到付 1 有运费
  889. // fee: 运费:-1到付,0包邮,其他为具体运费(v5.0版本已废弃,运费已使用商品形式存储)
  890. if ("1".equals(order.getFreePostFlag())) {
  891. shopOrder.setFee(0d);
  892. } else {
  893. shopOrder.setFee(Double.parseDouble(order.getFreePostFlag()));
  894. }
  895. shopOrder.setNote(shopNote);
  896. shopOrder.setOrderTime(order.getOrderTime());
  897. shopOrder.setDiscountFee(BigDecimal.ZERO);
  898. shopOrder.setCanRefundFlag(1);
  899. shopOrder.setCanRefundAmount(needPayAmount.doubleValue());
  900. shopOrder.setAccountAmount(BigDecimal.ZERO);
  901. // 佣金 采美应收
  902. shopOrder.setBrokerage(brokerage);
  903. shopOrder.setBuyStatus("1");
  904. shopOrder.setPresentNum(0);
  905. shopOrder.setUseBeanFlag(0);
  906. shopOrder.setUseBeanAmount(0);
  907. shopOrder.setUseBalanceFlag(0);
  908. shopOrder.setRefundStatus(0);
  909. shopOrder.setRefundsAmount(BigDecimal.ZERO);
  910. shopOrder.setPayStatus("1");
  911. shopOrder.setZeroCostFlag(0);
  912. shopOrder.setSendOutStatus("1");
  913. shopOrder.setPayFlag("0");
  914. // 订单状态标识,1:非退货退款订单、2:退货退款中、3退货退款完成
  915. shopOrder.setOrderStatusFlag("1");
  916. shopOrder.setDelFlag("0");
  917. shopOrder.setOrderBeanAmount(0);
  918. // 购买商品数
  919. shopOrder.setItemCount(buyNum);
  920. // 普通订单 1 协销订单0 与cm_order一样
  921. shopOrder.setOrderType(0);
  922. shopOrder.setStatus(1);
  923. shopOrder.setOrderSubmitType(order.getOrderSubmitType());
  924. shopOrder.setTotalAmount(totalAmount);
  925. shopOrder.setProductAmount(productAmount);
  926. shopOrder.setNeedPayAmount(needPayAmount);
  927. shopOrder.setPreferential(preferential);
  928. shopOrder.setShopProductAmount(shopProductAmount);
  929. // 付给供应商运费
  930. shopOrder.setShopPostFee(BigDecimal.ZERO);
  931. // 付给供应商税费
  932. shopOrder.setShopTaxFee(shopTaxFee);
  933. // 已付款金额
  934. shopOrder.setPayedShopAmount(BigDecimal.ZERO);
  935. // 付第三方
  936. shopOrder.setShopOtherFee(BigDecimal.ZERO);
  937. // 付供应商 = 商品费 + 运费 + 税费
  938. shopOrder.setShouldPayShopAmount(MathUtil.add(shopProductAmount, shopTaxFee));
  939. // 订单能否拆分 1 为可拆分, 0为不可拆分
  940. if (buyNum > 1) {
  941. shopOrder.setSplitFlag("1");
  942. } else {
  943. shopOrder.setSplitFlag("0");
  944. }
  945. /*
  946. * 保存子订单信息到数据库
  947. */
  948. orderMapper.insertShopOrder(shopOrder);
  949. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(insert[cm_shop_order])shopOrderId:" + shopOrder.getShopOrderID());
  950. return shopOrder;
  951. }
  952. /**
  953. * 保存运费子订单,并返回子订单ids
  954. *
  955. * @param order
  956. * @param num
  957. * @return
  958. */
  959. private String setPostFeeShopOrder(CmOrderPo order, String shopOrderIds, int num) {
  960. ProductPo product = productMapper.findPostFeeProduct();
  961. CmShopOrderPo newShopOrder = new CmShopOrderPo();
  962. String shopOrderNo = OrderNoUtils.getShopOrderNo(order.getOrderNo(), num + 1);
  963. newShopOrder.setShopOrderNo(shopOrderNo);
  964. newShopOrder.setOrderNo(order.getOrderNo());
  965. newShopOrder.setOrderID(order.getOrderID());
  966. newShopOrder.setUserID(order.getUserID().intValue());
  967. newShopOrder.setOrderType(order.getOrderType());
  968. newShopOrder.setOrderSubmitType(order.getOrderSubmitType());
  969. newShopOrder.setPresentNum(0);
  970. newShopOrder.setItemCount(1);
  971. //运费商品供应商ID默认998
  972. newShopOrder.setShopID(product.getShopID());
  973. newShopOrder.setFee(order.getFreight().doubleValue());
  974. newShopOrder.setProductAmount(order.getFreight());
  975. newShopOrder.setTotalAmount(order.getFreight());
  976. newShopOrder.setNeedPayAmount(order.getFreight());
  977. newShopOrder.setDiscountAmount(BigDecimal.ZERO);
  978. newShopOrder.setPayFlag("0");
  979. newShopOrder.setOrderTime(order.getOrderTime());
  980. newShopOrder.setPayStatus("3");
  981. newShopOrder.setSendOutStatus("3");
  982. newShopOrder.setTotalAddedValueTax(BigDecimal.ZERO);
  983. newShopOrder.setCanRefundAmount(0D);
  984. newShopOrder.setRefundAmount(0D);
  985. newShopOrder.setRefundStatus(0);
  986. newShopOrder.setClubID(order.getClubID().intValue());
  987. if (null != order.getSpID()) {
  988. newShopOrder.setSpID(order.getSpID().intValue());
  989. }
  990. if (null != order.getMainSpID()) {
  991. newShopOrder.setMainSpID(order.getMainSpID().intValue());
  992. }
  993. newShopOrder.setAutoOverTimeMills(0L);
  994. newShopOrder.setAutoReceiveTimeMills(0L);
  995. newShopOrder.setOrderBeanAmount(0);
  996. newShopOrder.setUseBeanFlag(0);
  997. newShopOrder.setUseBeanAmount(0);
  998. newShopOrder.setAccountAmount(BigDecimal.ZERO);
  999. newShopOrder.setCanRefundFlag(1);
  1000. newShopOrder.setBuyStatus("1");
  1001. newShopOrder.setOutStoreNum(0);
  1002. newShopOrder.setDelFlag("0");
  1003. newShopOrder.setPayFlag("0");
  1004. // 订单默认可拆分
  1005. newShopOrder.setSplitFlag("1");
  1006. /*
  1007. * 保存子订单信息到数据库
  1008. */
  1009. orderMapper.insertShopOrder(newShopOrder);
  1010. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(运费商品)(insert[cm_shop_order])shopOrderId:" + newShopOrder.getShopOrderID());
  1011. /*
  1012. * 插入订单 运费商品
  1013. */
  1014. CmOrderProductPo feeOrderProduct = new CmOrderProductPo();
  1015. feeOrderProduct.setProductType("0");
  1016. feeOrderProduct.setOrderNo(order.getOrderNo());
  1017. feeOrderProduct.setOrderID(order.getOrderID());
  1018. feeOrderProduct.setShopOrderID(newShopOrder.getShopOrderID());
  1019. feeOrderProduct.setShopOrderNo(newShopOrder.getShopOrderNo());
  1020. feeOrderProduct.setShopID(product.getShopID().longValue());
  1021. feeOrderProduct.setProductID(999);
  1022. feeOrderProduct.setNum(1);
  1023. feeOrderProduct.setPresentNum(0);
  1024. feeOrderProduct.setOutStoreType("0");
  1025. feeOrderProduct.setProps(product.getProps());
  1026. feeOrderProduct.setProductNo(product.getProductCode());
  1027. feeOrderProduct.setPrice(order.getFreight());
  1028. feeOrderProduct.setNormalPrice(order.getFreight());
  1029. feeOrderProduct.setPrice0(order.getFreight());
  1030. feeOrderProduct.setPrice1(order.getFreight());
  1031. feeOrderProduct.setTotalAmount(order.getFreight());
  1032. feeOrderProduct.setTotalFee(order.getFreight());
  1033. feeOrderProduct.setShouldPayFee(order.getFreight());
  1034. feeOrderProduct.setDiscount(new BigDecimal(100));
  1035. feeOrderProduct.setDiscountPrice(order.getFreight());
  1036. feeOrderProduct.setTaxRate(new BigDecimal(100));
  1037. feeOrderProduct.setAddedValueTax(BigDecimal.ZERO);
  1038. feeOrderProduct.setTotalAddedValueTax(BigDecimal.ZERO);
  1039. feeOrderProduct.setShopFee(BigDecimal.ZERO);
  1040. feeOrderProduct.setOtherFee(BigDecimal.ZERO);
  1041. feeOrderProduct.setCmFee(order.getFreight());
  1042. feeOrderProduct.setSingleShopFee(BigDecimal.ZERO);
  1043. feeOrderProduct.setSingleOtherFee(BigDecimal.ZERO);
  1044. feeOrderProduct.setSingleCmFee(order.getFreight());
  1045. feeOrderProduct.setTotalBeans(BigDecimal.ZERO);
  1046. feeOrderProduct.setUseBalanceAmount(0D);
  1047. feeOrderProduct.setUseBeanAmount(0);
  1048. feeOrderProduct.setNotOutStore(0);
  1049. feeOrderProduct.setCmbeanPrice(0);
  1050. feeOrderProduct.setBuyAgainFlag("0");
  1051. feeOrderProduct.setShopName(product.getShopName());
  1052. feeOrderProduct.setName(product.getName());
  1053. feeOrderProduct.setIncludedTax(product.getIncludedTax());
  1054. feeOrderProduct.setInvoiceType(product.getInvoiceType());
  1055. // 保存订单商品数据
  1056. orderMapper.insertOrderProduct(feeOrderProduct);
  1057. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单运费商品(insert[cm_order_product])orderId:" + feeOrderProduct.getOrderProductID());
  1058. shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + newShopOrder.getShopOrderID());
  1059. return shopOrderIds;
  1060. }
  1061. private List<DiscernReceiptVo> getDiscernReceipt(OrderVo order) {
  1062. //支付记录
  1063. List<DiscernReceiptVo> discernReceiptList = orderMapper.findDiscernReceipt(order.getOrderID().intValue());
  1064. BigDecimal receiptAmount = BigDecimal.ZERO;
  1065. //订单款
  1066. if (discernReceiptList != null && discernReceiptList.size() > 0) {
  1067. for (DiscernReceiptVo discernReceipt : discernReceiptList) {
  1068. receiptAmount = receiptAmount.add(discernReceipt.getAssociateAmount());
  1069. if (discernReceipt.getPayType() != null) {
  1070. discernReceipt.setPayType(ReceivablesType.getReceivablesType(Integer.parseInt(discernReceipt.getPayType())));
  1071. }
  1072. }
  1073. }
  1074. order.setPendingPayments(MathUtil.sub(order.getPayableAmount(), receiptAmount));
  1075. //支付总金额
  1076. order.setReceiptAmount(receiptAmount);
  1077. return discernReceiptList;
  1078. }
  1079. }