OrderSubmitServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. package com.caimei.service.impl;
  2. import com.caimei.mapper.OrderSubmitMapper;
  3. import com.caimei.mapper.ProductMapper;
  4. import com.caimei.model.ResponseJson;
  5. import com.caimei.model.po.*;
  6. import com.caimei.model.vo.ActivityLadderVo;
  7. import com.caimei.model.vo.AddressVo;
  8. import com.caimei.model.vo.CartProductVo;
  9. import com.caimei.model.vo.ShopVo;
  10. import com.caimei.service.OrderSubmitService;
  11. import com.caimei.service.ShoppingCartService;
  12. import com.caimei.util.MathUtil;
  13. import com.caimei.util.OrderNoUtils;
  14. import com.caimei.util.ProductUtils;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  21. import org.springframework.util.CollectionUtils;
  22. import javax.annotation.Resource;
  23. import java.math.BigDecimal;
  24. import java.text.SimpleDateFormat;
  25. import java.util.*;
  26. import java.util.concurrent.atomic.AtomicReference;
  27. /**
  28. * Description
  29. *
  30. * @author : plf
  31. * @date : 2021/4/25
  32. */
  33. @Slf4j
  34. @Service
  35. public class OrderSubmitServiceImpl implements OrderSubmitService {
  36. @Resource
  37. private OrderSubmitMapper orderSubmitMapper;
  38. @Resource
  39. private ShoppingCartService shoppingCartService;
  40. @Resource
  41. private ProductMapper productMapper;
  42. @Value("${caimei.oldapi}")
  43. private String domain;
  44. @Override
  45. public ResponseJson<Map<String, Object>> orderConfirm(String cartIds, Integer productId, Integer productCount, Integer heUserId) {
  46. Map<String, Object> confirmData = new HashMap<>(5);
  47. log.info("<<<<< 结算订单 >>>>>");
  48. //商品总金额
  49. AtomicReference<BigDecimal> totalPrice = new AtomicReference<BigDecimal>(BigDecimal.ZERO);
  50. List<ShopVo> shopList = new ArrayList<>();
  51. if (productId != null && productId > 0) {
  52. //立即购买
  53. shopList.add(orderSubmitMapper.findShopByProductId(productId));
  54. } else {
  55. String[] cartId = cartIds.split(",");
  56. shopList = orderSubmitMapper.findShopByCartIds(cartId);
  57. }
  58. shopList.forEach(shop -> {
  59. shop.setLogo(ProductUtils.getImageURL("shopLogo", shop.getLogo(), 0, domain));
  60. List<CartProductVo> products = new ArrayList<>();
  61. if (productId != null && productId > 0) {
  62. CartProductVo cartProduct = orderSubmitMapper.findProductById(productId);
  63. cartProduct.setProductCount(productCount);
  64. cartProduct.setHeUserId(heUserId);
  65. products.add(cartProduct);
  66. } else {
  67. String[] cartId = cartIds.split(",");
  68. products = orderSubmitMapper.findByShopCartProduct(shop.getShopId(), cartId);
  69. }
  70. BigDecimal shopTotalPrice = BigDecimal.ZERO;
  71. for (CartProductVo product : products) {
  72. shoppingCartService.setPrice(product);
  73. shopTotalPrice = MathUtil.add(shopTotalPrice, MathUtil.mul(product.getProductCount(), product.getPrice()));
  74. }
  75. shop.setShopTotalPrice(shopTotalPrice);
  76. shop.setProductList(products);
  77. totalPrice.set(MathUtil.add(totalPrice.get(), shopTotalPrice));
  78. });
  79. confirmData.put("totalPrice", totalPrice);
  80. confirmData.put("shopList", shopList);
  81. return ResponseJson.success(confirmData);
  82. }
  83. @Override
  84. @Transactional(rollbackFor = Exception.class)
  85. public ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo) {
  86. /*
  87. * 逻辑处理 start
  88. */
  89. log.info("******************** 提交订单逻辑处理 start *******************");
  90. //机构用户
  91. UserPo user = orderSubmitMapper.findUser(userId);
  92. if (null == user) {
  93. return ResponseJson.error("用户信息异常", null);
  94. }
  95. // 商品总数量
  96. Integer productCount = 0;
  97. // 商品总金额 (商品单价乘以数量,再加上税费[默认0])
  98. BigDecimal productTotalFee = BigDecimal.ZERO;
  99. // 小计金额(商品折后单价乘以数量,再加上税费[默认0])
  100. BigDecimal orderTotalFee = BigDecimal.ZERO;
  101. // 订单总额(小计金额减去经理折扣后,再加上运费[默认0])
  102. BigDecimal payTotalFee = BigDecimal.ZERO;
  103. // 真实支付金额(订单总额减去抵扣的账户余额)
  104. BigDecimal payableAmount = BigDecimal.ZERO;
  105. /*
  106. * 初始化主订单参数
  107. */
  108. CmOrderPo order = new CmOrderPo();
  109. String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
  110. // 订单号
  111. String orderNo = null;
  112. orderNo = OrderNoUtils.getOrderNo("H");
  113. order.setOrderNo(orderNo);
  114. // 运营人员下单
  115. order.setBuyUserID(user.getUserID());
  116. order.setOrderType(2);
  117. order.setOrderSubmitType(0);
  118. order.setConfirmFlag("2");
  119. order.setUserID(user.getUserID().longValue());
  120. // 订单来源
  121. order.setOrderSource("6");
  122. order.setOrganizeID(0);
  123. order.setUpdateDate(curDateStr);
  124. order.setPayFlag("0");
  125. order.setCooFreeFlag("0");
  126. order.setCooFreeAmount(BigDecimal.ZERO);
  127. order.setCooFreeRate(0);
  128. order.setOnlinePayFlag("0");
  129. order.setPreferential(BigDecimal.ZERO);
  130. order.setDiscountFee(BigDecimal.ZERO);
  131. // 订单提交时间
  132. order.setOrderTime(curDateStr);
  133. // 默认订单可以拆分
  134. order.setSplitFlag("1");
  135. // 发票类型
  136. order.setInvoiceFlag("0");
  137. order.setReceiptStatus("1");
  138. order.setPayStatus("1");
  139. order.setZeroCostFlag(0);
  140. order.setSendOutStatus("1");
  141. order.setRefundType("0");
  142. // 是否包含活动商品(受订单未支付自动关闭时间影响) 0 否 1 是
  143. order.setHasActProduct("0");
  144. // 订单状态 0 有效 其它无效
  145. order.setDelFlag("0");
  146. // 是否确认付款供应商
  147. order.setAffirmPaymentFlag("0");
  148. /*
  149. * 订单商品
  150. */
  151. List<CmOrderProductPo> orderProductList = new ArrayList<>();
  152. for (Map<String, Object> shopOrderInfo : orderInfo) {
  153. Integer shopId = (Integer) shopOrderInfo.get("shopId");
  154. if (null == shopId) {
  155. return ResponseJson.error("供应商数据异常", null);
  156. }
  157. // 一个子订单对应的商品信息
  158. List<Map<String, Integer>> productInfoList = (List<Map<String, Integer>>) shopOrderInfo.get("productInfo");
  159. if (null == productInfoList) {
  160. return ResponseJson.error(-1, "订单商品数据异常", null);
  161. }
  162. /*
  163. * 整理订单商品信息
  164. */
  165. if (!CollectionUtils.isEmpty(productInfoList)) {
  166. // 遍历所有商品
  167. for (Map<String, Integer> productTemp : productInfoList) {
  168. Integer productId = productTemp.get("productId");
  169. Integer productNum = productTemp.get("productNum");
  170. Integer heUserId = productTemp.get("heUserId");
  171. heUserId = heUserId == null ? 0 : heUserId;
  172. // 统计商品总数量
  173. productCount += productNum;
  174. // 获取商品信息
  175. CmHeHeProductPo product = orderSubmitMapper.getProduct(productId);
  176. if (null == product) {
  177. return ResponseJson.error("订单商品数据异常", null);
  178. }
  179. if (null == productNum || productNum == 0) {
  180. return ResponseJson.error("商品购买数量异常", null);
  181. }
  182. // 获取商品购买价格(活动阶梯价格)
  183. BigDecimal productPrice = product.getPrice();
  184. // 成本价
  185. BigDecimal costPrice = BigDecimal.ZERO;
  186. // 机构税费(单)
  187. BigDecimal addedValueTax = new BigDecimal(0);
  188. int priceType = 0;
  189. //不含税可开票商品计算税费
  190. Integer activityId = productMapper.findActivityByProductId(product.getProductId());
  191. if (activityId != null && activityId > 0) {
  192. //活动阶梯
  193. List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
  194. if (ladderList != null && ladderList.size() > 0) {
  195. priceType = 1;
  196. for (ActivityLadderVo ladder : ladderList) {
  197. if (productNum >= ladder.getBuyNum()) {
  198. productPrice = ladder.getBuyPrice();
  199. }
  200. }
  201. }
  202. }
  203. //税费
  204. boolean addTaxFlag = (0 == product.getIncludedTax()) && (1 == product.getInvoiceType() || 2 == product.getInvoiceType());
  205. if (addTaxFlag) {
  206. addedValueTax = MathUtil.div(MathUtil.mul(productPrice, product.getClubTaxPoint()), BigDecimal.valueOf(100));
  207. productPrice = MathUtil.add(productPrice, addedValueTax);
  208. product.setPrice(productPrice);
  209. }
  210. if (MathUtil.compare(productPrice, BigDecimal.ZERO) == 0) {
  211. return ResponseJson.error("商品购买价格不能为0", null);
  212. }
  213. // 单个商品的金额
  214. BigDecimal productFee = MathUtil.mul(productPrice, productNum);
  215. // 统计商品总金额
  216. productTotalFee = MathUtil.add(productTotalFee, productFee);
  217. // 判断是否选中固定成本价
  218. if (MathUtil.compare(product.getCostPrice(), 0) > 0 && 1 == product.getCostType()) {
  219. costPrice = product.getCostPrice();
  220. }
  221. // 判断是否选中比例成本价
  222. if (MathUtil.compare(product.getCostProportional(), 0) > 0 && 2 == product.getCostType()) {
  223. // 通过售价*比例得到成本价
  224. costPrice = BigDecimal.valueOf(MathUtil.div(MathUtil.mul(productPrice, product.getCostProportional()), 100).floatValue());
  225. }
  226. product.setCostPrice(costPrice);
  227. /*
  228. * 整理订单商品数据
  229. */
  230. CmOrderProductPo orderProduct = setOrderProduct(productNum, product, priceType, productPrice, addedValueTax);
  231. orderProduct.setHeUserId(heUserId);
  232. // 加入订单商品列表
  233. orderProductList.add(orderProduct);
  234. if (cartType == 1) {
  235. orderSubmitMapper.deleteCartByProductId(user.getUserID(), product.getProductId(), heUserId);
  236. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>删除用户购物车数据productId:" + product.getProductId());
  237. }
  238. }
  239. }
  240. }
  241. // 设置是否是二手订单
  242. order.setSecondHandOrderFlag("0");
  243. order.setPromotionFullReduction(BigDecimal.ZERO);
  244. // 商品总数量
  245. order.setProductCount(productCount);
  246. // 赠品数量
  247. order.setPresentCount(0);
  248. //促销赠品数量
  249. order.setPromotionalGiftsCount(0);
  250. // 0包邮 -1到付 1 有运费
  251. order.setFreePostFlag("0");
  252. order.setFreight(BigDecimal.ZERO);
  253. // 商品总额
  254. order.setProductTotalFee(productTotalFee);
  255. // 订单总额(商品金额+运费)
  256. payTotalFee = productTotalFee;
  257. orderTotalFee = productTotalFee;
  258. order.setOrderTotalFee(orderTotalFee);
  259. order.setPayTotalFee(payTotalFee);
  260. payableAmount = payTotalFee;
  261. // 订单状态
  262. order.setStatus("11");
  263. order.setConfirmTime(curDateStr);
  264. // 余额支付金额
  265. order.setBalancePayFee(BigDecimal.ZERO);
  266. // 实际支付金额(商品金额+运费-余额抵扣)
  267. order.setPayableAmount(payableAmount);
  268. // 售后条款
  269. order.setClauseID(1L);
  270. order.setClauseName("无条款");
  271. // 是否返佣订单
  272. order.setRebateFlag("0");
  273. // 判断前端传入orderShouldPayFee订单应付金额,和后台计算应付金额对比
  274. BigDecimal orderShouldPayFee = new BigDecimal(payInfo.get("orderShouldPayFee").toString());
  275. double v = MathUtil.sub(payableAmount, orderShouldPayFee).doubleValue();
  276. log.info(">>>>>payableAmount:" + payableAmount + " ,orderShouldPayFee:" + orderShouldPayFee);
  277. // 考虑前端计算不精确
  278. if (v < -0.1d || v > 0.1d) {
  279. // 设置手动回滚事务
  280. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  281. return ResponseJson.error("订单付款金额异常", null);
  282. }
  283. /**
  284. * 保存主订单数据
  285. */
  286. orderSubmitMapper.insertOrder(order);
  287. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增主订单(insert[cm_order])orderId:" + order.getOrderID());
  288. /**
  289. * 设置订单商品订单号
  290. */
  291. for (CmOrderProductPo orderProduct : orderProductList) {
  292. orderProduct.setOrderID(order.getOrderID());
  293. orderProduct.setOrderNo(order.getOrderNo());
  294. orderProduct.setOrganizeID(order.getOrganizeID());
  295. }
  296. /**
  297. * 整理 子订单信息
  298. */
  299. // 收集子订单供应商ID字符串
  300. String shopOrderIds = "";
  301. for (Map<String, Object> shopOrderInfo : orderInfo) {
  302. Integer shopId = (Integer) shopOrderInfo.get("shopId");
  303. String shopNote = (String) shopOrderInfo.get("note");
  304. // 初始化子订单信息
  305. CmShopOrderPo shopOrder = saveShopOrder(order, orderProductList, shopId, shopNote);
  306. // 保存子订单号
  307. shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + shopOrder.getShopOrderID());
  308. // 设置订单商品子订单号
  309. for (CmOrderProductPo orderProduct : orderProductList) {
  310. if (shopId.longValue() == orderProduct.getShopID()) {
  311. orderProduct.setShopOrderID(shopOrder.getShopOrderID());
  312. orderProduct.setShopOrderNo(shopOrder.getShopOrderNo());
  313. }
  314. }
  315. }
  316. /**
  317. * 保存订单商品
  318. */
  319. List<OrderProductLadderPricePo> orderProductLadderPriceList = new ArrayList<>();
  320. for (CmOrderProductPo orderProduct : orderProductList) {
  321. // 保存订单商品数据
  322. orderSubmitMapper.insertOrderProduct(orderProduct);
  323. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单商品(insert[cm_order_product])OrderProductID:" + orderProduct.getOrderProductID());
  324. if ("1".equals(orderProduct.getLadderPriceFlag())) {
  325. //使用阶梯价格的订单商品保存下单时的阶梯价格列表
  326. Integer activityId = productMapper.findActivityByProductId(orderProduct.getProductID());
  327. if (activityId != null && activityId > 0) {
  328. List<ActivityLadderVo> ladderPriceList = productMapper.findActivityLadder(activityId, orderProduct.getProductID());
  329. int ladderNum = 0;
  330. for (ActivityLadderVo ladder : ladderPriceList) {
  331. ladderNum++;
  332. OrderProductLadderPricePo orderProductLadderPrice = new OrderProductLadderPricePo();
  333. orderProductLadderPrice.setOrderProductId(orderProduct.getOrderProductID());
  334. orderProductLadderPrice.setBuyNum(ladder.getBuyNum());
  335. orderProductLadderPrice.setBuyPrice(ladder.getBuyPrice());
  336. orderProductLadderPrice.setCreateDate(new Date());
  337. orderProductLadderPrice.setLadderNum(ladderNum);
  338. orderProductLadderPriceList.add(orderProductLadderPrice);
  339. }
  340. }
  341. }
  342. }
  343. if (!CollectionUtils.isEmpty(orderProductLadderPriceList)) {
  344. orderProductLadderPriceList.forEach(ladderPrice -> {
  345. orderSubmitMapper.insertOrderProductLadderPrice(ladderPrice);
  346. });
  347. }
  348. // 更新主订单信息, 子订单ID:1000,1002
  349. order.setShopOrderIDs(shopOrderIds);
  350. orderSubmitMapper.updateOrder(order);
  351. /**
  352. * 保存 订单用户地址
  353. */
  354. // 获取地址信息
  355. AddressVo address = orderSubmitMapper.findByAddressId(addressId);
  356. if (null != address) {
  357. //保存地址信息
  358. BpOrderUserInfoPo userInfo = new BpOrderUserInfoPo();
  359. userInfo.setOrderId(order.getOrderID());
  360. userInfo.setUserId(user.getUserID().longValue());
  361. userInfo.setName(user.getName() == null ? user.getUserName() : user.getName());
  362. userInfo.setShouHuoRen(address.getShouHuoRen());
  363. userInfo.setMobile(address.getMobile());
  364. userInfo.setPostalCode(address.getPhone());
  365. userInfo.setPostalCode(address.getPostalCode());
  366. userInfo.setTownId(address.getTownId());
  367. userInfo.setProvince(address.getProvinceName());
  368. userInfo.setCity(address.getCityName());
  369. userInfo.setTown(address.getTownName());
  370. userInfo.setAddress(address.getAddress());
  371. orderSubmitMapper.insertUserInfo(userInfo);
  372. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单用户地址(insert[bp_order_userinfo])orderId:" + order.getOrderID());
  373. } else {
  374. //设置手动回滚事务
  375. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  376. return ResponseJson.error("订单地址异常", null);
  377. }
  378. log.info("******************** 提交订单逻辑处理 end *******************");
  379. /*
  380. * 构造返回参数
  381. */
  382. Map<String, String> info = new HashMap<>(5);
  383. info.put("orderId", String.valueOf(order.getOrderID()));
  384. info.put("orderNo", String.valueOf(order.getOrderNo()));
  385. info.put("orderMark", "#" + order.getOrderID() + "#");
  386. //应付订单金额
  387. info.put("payTotalFee", String.valueOf(order.getPayTotalFee()));
  388. //真实需要付款金额
  389. info.put("payableAmount", String.valueOf(order.getPayableAmount()));
  390. return ResponseJson.success(info);
  391. }
  392. /**
  393. * 整理订单商品数据
  394. *
  395. * @param productNum
  396. * @param product
  397. * @param priceType 0机构价,1活动阶梯价
  398. * @param productPrice
  399. * @return
  400. */
  401. private CmOrderProductPo setOrderProduct(Integer productNum, CmHeHeProductPo product, int priceType, BigDecimal productPrice, BigDecimal addedValueTax) {
  402. CmOrderProductPo orderProduct = new CmOrderProductPo();
  403. orderProduct.setShopID(product.getShopId().longValue());
  404. orderProduct.setProductID(product.getProductId());
  405. orderProduct.setOrganizeProductID(product.getId());
  406. // 预留在保存保存子订单的时候添加
  407. orderProduct.setProductNo(null);
  408. orderProduct.setNum(productNum);
  409. orderProduct.setPresentNum(0);
  410. orderProduct.setProductUnit(product.getUnit());
  411. if (MathUtil.compare(product.getNormalPrice(), 0) > 0) {
  412. orderProduct.setNormalPrice(product.getNormalPrice());
  413. } else {
  414. orderProduct.setNormalPrice(BigDecimal.ZERO);
  415. }
  416. orderProduct.setCostPrice(product.getCostPrice());
  417. orderProduct.setPrice0(product.getPrice());
  418. orderProduct.setPrice1(product.getPrice());
  419. orderProduct.setTotalAmount(MathUtil.mul(product.getPrice(), productNum));
  420. orderProduct.setDiscount(new BigDecimal(100));
  421. // 经理折扣(优惠金额)
  422. orderProduct.setDiscountFee(new BigDecimal(0));
  423. //机构税率
  424. orderProduct.setTaxRate(product.getClubTaxPoint() == null ? new BigDecimal(0) : product.getClubTaxPoint());
  425. //供应商税率
  426. orderProduct.setSupplierTaxRate(BigDecimal.valueOf(0));
  427. orderProduct.setIncludedTax(product.getIncludedTax().toString());
  428. orderProduct.setInvoiceType(product.getInvoiceType().toString());
  429. BigDecimal singleShouldPayTotalTax = new BigDecimal(0);
  430. //不含税可开发票商品设置税费
  431. if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
  432. //供应商税费(单)=成本价 * 供应商税率
  433. if (product.getShopTaxPoint() == null) {
  434. orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
  435. } else {
  436. orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
  437. }
  438. singleShouldPayTotalTax = MathUtil.div(MathUtil.mul(product.getCostPrice(), orderProduct.getSupplierTaxRate()), BigDecimal.valueOf(100));
  439. } else if (1 == product.getIncludedTax()) {
  440. //含税商品设置供应商税率
  441. if (product.getShopTaxPoint() == null) {
  442. orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
  443. } else {
  444. orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
  445. }
  446. } else if ((0 == product.getIncludedTax() && 3 == product.getInvoiceType()) || 2 == product.getIncludedTax()) {
  447. //不含税不可开票商品和未知商品,税率置为0
  448. orderProduct.setTaxRate(BigDecimal.ZERO);
  449. orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
  450. }
  451. orderProduct.setAddedValueTax(addedValueTax);
  452. //机构税费(总)=机构税费(单) * 商品数量
  453. orderProduct.setTotalAddedValueTax(MathUtil.mul(addedValueTax, productNum));
  454. orderProduct.setSingleShouldPayTotalTax(singleShouldPayTotalTax);
  455. //供应商税费(总)=供应商税费(单) * 商品数量
  456. orderProduct.setShouldPayTotalTax(MathUtil.mul(singleShouldPayTotalTax, productNum));
  457. orderProduct.setTotalFee(MathUtil.mul(productPrice, productNum));
  458. orderProduct.setShouldPayFee(MathUtil.mul(productPrice, productNum));
  459. // 商品费=成本价快照*(购买数量 + 赠品数量)
  460. orderProduct.setShopProductAmount(MathUtil.mul(product.getCostPrice(), BigDecimal.valueOf(productNum)));
  461. //不含税可开票商品,单价/折后单价=售价-税费
  462. //阶梯价
  463. BigDecimal price1 = productPrice;
  464. //不含税可开票商品,单价/折后单价=售价-税费
  465. if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
  466. price1 = MathUtil.sub(productPrice, orderProduct.getAddedValueTax());
  467. }
  468. orderProduct.setPrice(price1);
  469. orderProduct.setDiscountPrice(price1);
  470. //应付供应商(单)=成本价+供应商税费(单)
  471. BigDecimal singleShopFee = MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax);
  472. orderProduct.setSingleShopFee(singleShopFee);
  473. // 应付供应商(总)=应付供应商(单) * 商品数量
  474. orderProduct.setShopFee(MathUtil.mul(singleShopFee, BigDecimal.valueOf(productNum)));
  475. orderProduct.setOtherFee(new BigDecimal(0));
  476. orderProduct.setSingleOtherFee(new BigDecimal(0));
  477. //应付采美(单)=单价+机构税费(单)-(成本(单)+供应商税费(单))
  478. BigDecimal singleCmFee = MathUtil.sub(MathUtil.add(product.getPrice(), orderProduct.getAddedValueTax()), MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax));
  479. orderProduct.setSingleCmFee(singleCmFee);
  480. // 应付采美(总)=应付采美(单)*商品数量
  481. BigDecimal cmFee = MathUtil.mul(singleCmFee, BigDecimal.valueOf(productNum));
  482. orderProduct.setCmFee(cmFee);
  483. orderProduct.setTotalBeans(new BigDecimal(0));
  484. orderProduct.setUseBalanceAmount(0d);
  485. // 优惠金额
  486. orderProduct.setPreferential(new BigDecimal(0));
  487. orderProduct.setUseBalanceAmount(0d);
  488. // 订单商品供应商确认标志 0否 1是
  489. orderProduct.setConfirmProductFlag("0");
  490. orderProduct.setShopName(product.getShopName());
  491. orderProduct.setName(product.getName());
  492. orderProduct.setPayStatus("0");
  493. orderProduct.setBuyAgainFlag("0");
  494. // 未出库数量
  495. orderProduct.setNotOutStore(productNum);
  496. // 是否已评论 1 是 0 未评论
  497. orderProduct.setCommentFlag("0");
  498. orderProduct.setActPreferential(new BigDecimal(0));
  499. orderProduct.setActType(null);
  500. if (priceType == 1) {
  501. orderProduct.setIsActProduct("1");
  502. orderProduct.setLadderPriceFlag("1");
  503. } else {
  504. orderProduct.setIsActProduct("1");
  505. orderProduct.setLadderPriceFlag("0");
  506. }
  507. orderProduct.setProductImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
  508. orderProduct.setProductType("0");
  509. return orderProduct;
  510. }
  511. /**
  512. * 保存子订单,并返回子订单ids
  513. *
  514. * @param order
  515. * @param orderProductList
  516. * @param shopId
  517. * @param shopNote
  518. * @return
  519. */
  520. private CmShopOrderPo saveShopOrder(CmOrderPo order, List<CmOrderProductPo> orderProductList, Integer shopId, String shopNote) {
  521. /*
  522. * 初始化子订单信息
  523. */
  524. CmShopOrderPo shopOrder = new CmShopOrderPo();
  525. // 子订单编号
  526. String shopOrderNo = "";
  527. String maxShopOrderNo = orderSubmitMapper.findMaxShopOrderNo(order.getOrderID());
  528. if (StringUtils.isNotBlank(maxShopOrderNo)) {
  529. shopOrderNo = maxShopOrderNo;
  530. shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), Integer.parseInt(shopOrderNo.substring(shopOrderNo.length() - 2, shopOrderNo.length())) + 1));
  531. } else {
  532. shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), 1));
  533. }
  534. shopOrder.setShopID(shopId);
  535. shopOrder.setOrderID(order.getOrderID());
  536. shopOrder.setOrderNo(order.getOrderNo());
  537. shopOrder.setUserID(order.getUserID().intValue());
  538. shopOrder.setOrganizeID(order.getOrganizeID());
  539. /*
  540. * 统计子订单金额信息
  541. */
  542. // 订单总金额
  543. BigDecimal totalAmount = new BigDecimal(0);
  544. // 商品总金额
  545. BigDecimal productAmount = new BigDecimal(0);
  546. // 需要支付金额
  547. BigDecimal needPayAmount = new BigDecimal(0);
  548. // 优惠金额
  549. BigDecimal preferential = new BigDecimal(0);
  550. // 佣金
  551. BigDecimal brokerage = new BigDecimal(0);
  552. // 商品费
  553. BigDecimal shopProductAmount = new BigDecimal(0);
  554. // 供应商税费
  555. BigDecimal shopTaxFee = new BigDecimal(0);
  556. // 总购买数
  557. Integer buyNum = 0;
  558. // 计算子订单信息
  559. for (CmOrderProductPo orderProduct : orderProductList) {
  560. if (shopId.longValue() == orderProduct.getShopID()) {
  561. // 商品总金额
  562. productAmount = MathUtil.add(productAmount, orderProduct.getTotalAmount());
  563. // 订单总金额 包括税费
  564. totalAmount = MathUtil.add(totalAmount, orderProduct.getTotalFee());
  565. // 应付金额
  566. needPayAmount = MathUtil.add(needPayAmount, orderProduct.getShouldPayFee());
  567. // 总购买数
  568. buyNum += orderProduct.getNum();
  569. preferential = MathUtil.add(preferential, orderProduct.getPreferential());
  570. brokerage = MathUtil.add(brokerage, orderProduct.getCmFee());
  571. if (null != orderProduct.getShopProductAmount()) {
  572. shopProductAmount = MathUtil.add(shopProductAmount, orderProduct.getShopProductAmount());
  573. }
  574. if (null != orderProduct.getShouldPayTotalTax()) {
  575. shopTaxFee = MathUtil.add(shopTaxFee, orderProduct.getShouldPayTotalTax());
  576. }
  577. }
  578. }
  579. shopOrder.setPromotionFullReduction(BigDecimal.ZERO);
  580. if (MathUtil.compare(shopOrder.getPromotionFullReduction(), 0) > 0) {
  581. totalAmount = MathUtil.sub(totalAmount, shopOrder.getPromotionFullReduction());
  582. productAmount = MathUtil.sub(productAmount, shopOrder.getPromotionFullReduction());
  583. needPayAmount = MathUtil.sub(needPayAmount, shopOrder.getPromotionFullReduction());
  584. }
  585. // freePostFlag: 0包邮 -1到付 1 有运费
  586. // fee: 运费:-1到付,0包邮,其他为具体运费(v5.0版本已废弃,运费已使用商品形式存储)
  587. if ("1".equals(order.getFreePostFlag())) {
  588. shopOrder.setFee(0d);
  589. } else {
  590. shopOrder.setFee(Double.parseDouble(order.getFreePostFlag()));
  591. }
  592. shopOrder.setNote(shopNote);
  593. shopOrder.setOrderTime(order.getOrderTime());
  594. shopOrder.setDiscountFee(BigDecimal.ZERO);
  595. shopOrder.setCanRefundFlag(1);
  596. shopOrder.setCanRefundAmount(needPayAmount.doubleValue());
  597. shopOrder.setAccountAmount(BigDecimal.ZERO);
  598. // 佣金 采美应收
  599. shopOrder.setBrokerage(brokerage);
  600. shopOrder.setBuyStatus("1");
  601. shopOrder.setPresentNum(0);
  602. shopOrder.setUseBeanFlag(0);
  603. shopOrder.setUseBeanAmount(0);
  604. shopOrder.setUseBalanceFlag(0);
  605. shopOrder.setRefundStatus(0);
  606. shopOrder.setRefundsAmount(BigDecimal.ZERO);
  607. shopOrder.setPayStatus("1");
  608. shopOrder.setZeroCostFlag(0);
  609. shopOrder.setSendOutStatus("1");
  610. shopOrder.setPayFlag("0");
  611. // 订单状态标识,1:非退货退款订单、2:退货退款中、3退货退款完成
  612. shopOrder.setOrderStatusFlag("1");
  613. shopOrder.setDelFlag("0");
  614. shopOrder.setOrderBeanAmount(0);
  615. // 购买商品数
  616. shopOrder.setItemCount(buyNum);
  617. // 普通订单 1 协销订单0 与cm_order一样
  618. shopOrder.setOrderType(0);
  619. shopOrder.setStatus(1);
  620. shopOrder.setOrderSubmitType(order.getOrderSubmitType());
  621. shopOrder.setTotalAmount(totalAmount);
  622. shopOrder.setProductAmount(productAmount);
  623. shopOrder.setNeedPayAmount(needPayAmount);
  624. shopOrder.setPreferential(preferential);
  625. shopOrder.setShopProductAmount(shopProductAmount);
  626. // 付给供应商运费
  627. shopOrder.setShopPostFee(BigDecimal.ZERO);
  628. // 付给供应商税费
  629. shopOrder.setShopTaxFee(shopTaxFee);
  630. // 已付款金额
  631. shopOrder.setPayedShopAmount(BigDecimal.ZERO);
  632. // 付第三方
  633. shopOrder.setShopOtherFee(BigDecimal.ZERO);
  634. // 付供应商 = 商品费 + 运费 + 税费
  635. shopOrder.setShouldPayShopAmount(MathUtil.add(shopProductAmount, shopTaxFee));
  636. // 订单能否拆分 1 为可拆分, 0为不可拆分
  637. if (buyNum > 1) {
  638. shopOrder.setSplitFlag("1");
  639. } else {
  640. shopOrder.setSplitFlag("0");
  641. }
  642. /*
  643. * 保存子订单信息到数据库
  644. */
  645. orderSubmitMapper.insertShopOrder(shopOrder);
  646. log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(insert[cm_shop_order])shopOrderId:" + shopOrder.getShopOrderID());
  647. return shopOrder;
  648. }
  649. }