OrderServiceImpl.java 53 KB

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