OrderServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package com.fdkankan.ucenter.service.impl;
  2. import com.amazonaws.services.codecommit.model.OrderEnum;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.fdkankan.common.constant.TbStatus;
  7. import com.fdkankan.common.exception.BusinessException;
  8. import com.fdkankan.ucenter.common.PageInfo;
  9. import com.fdkankan.common.util.FileUtils;
  10. import com.fdkankan.common.util.NumberUtils;
  11. import com.fdkankan.redis.util.RedisUtil;
  12. import com.fdkankan.ucenter.common.RedisKeyUtil;
  13. import com.fdkankan.ucenter.constant.*;
  14. import com.fdkankan.ucenter.entity.*;
  15. import com.fdkankan.ucenter.mapper.IOrderMapper;
  16. import com.fdkankan.ucenter.pay.alipay.sdk.AlipayService;
  17. import com.fdkankan.ucenter.pay.wx.WXPay;
  18. import com.fdkankan.ucenter.pay.wx.WXPayConstants;
  19. import com.fdkankan.ucenter.pay.wx.WXPayDefaultConfig;
  20. import com.fdkankan.ucenter.service.*;
  21. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  22. import com.fdkankan.ucenter.util.DateUserUtil;
  23. import com.fdkankan.ucenter.vo.request.CartParam;
  24. import com.fdkankan.ucenter.vo.request.DownNumParam;
  25. import com.fdkankan.ucenter.vo.request.OrderParam;
  26. import com.fdkankan.ucenter.vo.request.PlaceOrderParam;
  27. import com.fdkankan.ucenter.vo.response.GoodsSkuVo;
  28. import com.fdkankan.ucenter.vo.response.OrderVo;
  29. import org.apache.commons.lang3.StringUtils;
  30. import org.springframework.beans.BeanUtils;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.beans.factory.annotation.Value;
  33. import org.springframework.stereotype.Service;
  34. import java.math.BigDecimal;
  35. import java.util.*;
  36. import java.util.stream.Collectors;
  37. /**
  38. * <p>
  39. * 订单表 服务实现类
  40. * </p>
  41. *
  42. * @author
  43. * @since 2022-07-13
  44. */
  45. @Service
  46. public class OrderServiceImpl extends ServiceImpl<IOrderMapper, Order> implements IOrderService {
  47. @Autowired
  48. IUserService userService;
  49. @Autowired
  50. IOrderItemService orderItemService;
  51. @Autowired
  52. IInvoiceService invoiceService;
  53. @Autowired
  54. IIncrementOrderService incrementOrderService;
  55. @Autowired
  56. ICartService cartService;
  57. @Autowired
  58. IGoodsService goodsService;
  59. @Autowired
  60. IGoodsSkuService goodsSkuService;
  61. @Autowired
  62. RedisUtil redisUtil;
  63. @Autowired
  64. AlipayService alipayService;
  65. @Autowired
  66. IDownloadOrderService downloadOrderService;
  67. @Autowired
  68. IIncrementTypeService incrementTypeService;
  69. @Override
  70. public PageInfo pageList(OrderParam param) {
  71. User user = userService.getByUserName(param.getUserName());
  72. LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
  73. wrapper.eq(Order::getUserId,user.getId());
  74. wrapper.eq(Order::getPaymentStatus,"paid");
  75. wrapper.orderByDesc(Order::getOrderTime);
  76. Page<Order> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
  77. List<OrderVo> orderVos = new ArrayList<>();
  78. for (Order record : page.getRecords()) {
  79. OrderVo orderVo = new OrderVo();
  80. BeanUtils.copyProperties(record,orderVo);
  81. Invoice invoice = invoiceService.getByOrderId(record.getId());
  82. orderVo.setInvoice(invoice);
  83. List<OrderItem> itemList = orderItemService.getByOrderId(record.getId());
  84. orderVo.setOrderItems(itemList);
  85. orderVos.add(orderVo);
  86. }
  87. Page<OrderVo> pageVo = new Page<>(param.getPageNum(),param.getPageSize());
  88. pageVo.setRecords(orderVos);
  89. pageVo.setTotal(page.getTotal());
  90. return PageInfo.PageInfo(pageVo);
  91. }
  92. @Override
  93. public GoodsSkuVo getIncrementOrDownloadPrice(OrderParam param) {
  94. return incrementOrderService.getDownloadPrice(param);
  95. }
  96. @Override
  97. public void cancel(Long orderId) {
  98. LambdaUpdateWrapper<Order> wrapper = new LambdaUpdateWrapper<>();
  99. wrapper.set(Order::getOrderStatus, OrderStatus.invalid)
  100. .eq(Order::getId,orderId);
  101. this.update(wrapper);
  102. }
  103. @Override
  104. public void receipt(Long orderId) {
  105. LambdaUpdateWrapper<Order> wrapper = new LambdaUpdateWrapper<>();
  106. wrapper.set(Order::getOrderStatus, OrderStatus.completed)
  107. .set(Order::getShippingStatus, ShippingStatus.received)
  108. .eq(Order::getId,orderId);
  109. this.update(wrapper);
  110. }
  111. @Override
  112. public Order placeOrder(PlaceOrderParam param) {
  113. List<Long> id = param.getGoods().parallelStream().map(CartParam::getId).collect(Collectors.toList());
  114. List<String> ids = new ArrayList<>();
  115. for (Long aLong : id) {
  116. ids.add(String.valueOf(aLong));
  117. }
  118. User user = userService.getByUserName(param.getUserName());
  119. cartService.deleteIds(ids);
  120. // 下单
  121. List<OrderItem> orderItemEntities = new ArrayList<>();
  122. OrderItem orderItemEntity = null;
  123. int goodsTotalCount = 0;
  124. BigDecimal goodsAmount = new BigDecimal(0);
  125. for(CartParam requestCart : param.getGoods()){
  126. goodsTotalCount += requestCart.getGoodsCount();
  127. Goods responseGoods = goodsService.getById(requestCart.getGoodsId());
  128. if (responseGoods == null){
  129. continue;
  130. }
  131. GoodsSku sku = goodsSkuService.getBySku(requestCart.getSkuSn());
  132. if (sku == null){
  133. throw new BusinessException(500,LoginConstant.ERROR_MSG);
  134. }
  135. orderItemEntity = new OrderItem();
  136. orderItemEntity.setExpressNum(null);
  137. orderItemEntity.setGoodsPrice(param.getAbroad().intValue() == 0 ? sku.getPrice() : sku.getDollarPrice());
  138. orderItemEntity.setGoodsId(requestCart.getGoodsId());
  139. orderItemEntity.setShippingStatus(ShippingStatus.unshipped.name());
  140. orderItemEntity.setExpressName("顺丰速运");
  141. orderItemEntity.setGoodsCount(requestCart.getGoodsCount());
  142. orderItemEntity.setGoodsName(responseGoods.getName());
  143. orderItemEntity.setGoodsSn(responseGoods.getGoodsSn());
  144. orderItemEntity.setRecStatus("A");
  145. orderItemEntity.setCreateTime(DateUserUtil.getDate(new Date()));
  146. orderItemEntity.setUpdateTime(DateUserUtil.getDate(new Date()));
  147. if (StringUtils.isNotEmpty(requestCart.getSkuSn())){
  148. orderItemEntity.setSkuSn(requestCart.getSkuSn());
  149. }
  150. orderItemEntities.add(orderItemEntity);
  151. goodsAmount = goodsAmount.add(orderItemEntity.getGoodsPrice().multiply(new BigDecimal(orderItemEntity.getGoodsCount())));
  152. }
  153. Order orderEntity = new Order();
  154. orderEntity.setOrderSn(NumberUtils.getOrderSn());
  155. orderEntity.setOrderTime(new Date());
  156. orderEntity.setOrderStatus(OrderStatus.unprocessed.name());
  157. orderEntity.setPaymentStatus(PaymentStatus.unpaid.name());
  158. orderEntity.setShippingStatus(ShippingStatus.unshipped.name());
  159. orderEntity.setPaymentTypeName(param.getPayType());
  160. orderEntity.setUserId(user.getId());
  161. orderEntity.setGoodsTotalCount(goodsTotalCount);
  162. orderEntity.setGoodsAmount(goodsAmount);
  163. orderEntity.setTotalAmount(goodsAmount);
  164. orderEntity.setPaidAmount(BigDecimal.ZERO);
  165. orderEntity.setExpressAmount(BigDecimal.ZERO);
  166. orderEntity.setDeliveryTypeName("快递运输");
  167. orderEntity.setRecStatus("A");
  168. orderEntity.setCreateTime(DateUserUtil.getDate(new Date()));
  169. orderEntity.setUpdateTime(DateUserUtil.getDate(new Date()));
  170. if (param.getReceiver() != null){
  171. orderEntity.setShipAddress(param.getReceiver().getShipAddress());
  172. orderEntity.setShipAreaPath(param.getReceiver().getShipAreaPath());
  173. orderEntity.setShipMobile(param.getReceiver().getShipMobile());
  174. orderEntity.setShipName(param.getReceiver().getShipName());
  175. }
  176. orderEntity.setAbroad(param.getAbroad());
  177. this.save(orderEntity);
  178. for (OrderItem entity : orderItemEntities){
  179. entity.setOrderId(orderEntity.getId());
  180. }
  181. orderItemService.saveBatch(orderItemEntities);
  182. if(param.getInvoice()!=null && StringUtils.isNotBlank(param.getInvoice().getInvoiceType())){
  183. param.setOrderId(orderEntity.getId());
  184. param.getInvoice().setAmount(orderEntity.getTotalAmount().toString());
  185. invoiceService.saveByOrder(user.getId(),param);
  186. }
  187. return orderEntity;
  188. }
  189. @Override
  190. public boolean queryOrderStatus(OrderParam param) throws Exception {
  191. boolean success = false;
  192. String orderSn = param.getOrderSn();
  193. switch (param.getOrderType()){
  194. case 0:
  195. orderSn += "_entity";
  196. break;
  197. case 1:
  198. orderSn += "_recharge";
  199. break;
  200. case 2:
  201. orderSn += "_expansion";
  202. break;
  203. case 3:
  204. orderSn += "_commerce";
  205. break;
  206. case 4:
  207. orderSn += "_increment";
  208. break;
  209. case 5:
  210. orderSn += "_download";
  211. break;
  212. }
  213. if(!redisUtil.hasKey(RedisKeyUtil.QRCODE + orderSn)){
  214. String wxPngPath = QrCodeFilePath.WEIXIN_QRCODE_FOLDER + orderSn + ".png";
  215. String aliPngPath = QrCodeFilePath.ALI_QRCODE_FOLDER + orderSn + ".png";
  216. FileUtils.deleteFile(wxPngPath);
  217. FileUtils.deleteFile(aliPngPath);
  218. throw new BusinessException(LoginConstant.FAILURE_CODE_3035,LoginConstant.FAILURE_MSG_3035);
  219. }
  220. switch (param.getPayType()){
  221. // 微信
  222. case 0:
  223. String orderSnE = redisUtil.get(orderSn);
  224. log.warn("out_trade_no:" + orderSnE);
  225. if (StringUtils.isNotEmpty(orderSnE)){
  226. Map<String, String> data = new HashMap<String, String>();
  227. data.put("out_trade_no", orderSnE);
  228. WXPayDefaultConfig config = new WXPayDefaultConfig();
  229. WXPay wxPay = new WXPay(config);
  230. Map<String, String> resp = wxPay.orderQuery(data);
  231. if (resp.get("trade_state") != null && resp.get("trade_state").equals(WXPayConstants.SUCCESS)) {
  232. redisUtil.del(orderSnE);
  233. success = true;
  234. }
  235. }
  236. break;
  237. // 支付宝
  238. case 1:
  239. log.warn("alipay out_trade_no:" + orderSn);
  240. String type = alipayService.tradeQuery(orderSn);
  241. log.warn("alipay type:" + type);
  242. if ("SUCCESS".equals(type)){
  243. success = true;
  244. }
  245. break;
  246. // paypal
  247. case 2:
  248. orderSn = orderSn.split("_")[0];
  249. log.warn("paypal out_trade_no:" + orderSn);
  250. Order orderEntity = this.getByOrderSn(orderSn);
  251. if (PaymentStatus.paid.name().equals(orderEntity.getPaymentStatus())){
  252. success = true;
  253. }
  254. break;
  255. }
  256. return success;
  257. }
  258. @Override
  259. public Order getByOrderSn(String orderSn) {
  260. LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
  261. wrapper.eq(Order::getOrderSn,orderSn);
  262. return this.getOne(wrapper);
  263. }
  264. @Override
  265. public DownloadOrder downloadOrder(DownNumParam param) {
  266. //支付美金,只能paypal支付
  267. if(param.getAbroad() == 1 && param.getPayType() != 2){
  268. throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  269. }
  270. IncrementType incrementType = incrementTypeService.getById(param.getSkuSn());
  271. if(incrementType == null){
  272. throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  273. }
  274. // GoodsSku goodsSku = goodsSkuService.getBySku(param.getSkuSn());
  275. // if(goodsSku == null){
  276. // throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  277. // }
  278. User user = userService.getByUserName(param.getUserName());
  279. if(user == null){
  280. throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  281. }
  282. return downloadOrderService.insertDownloadOrder(user.getId(),param,incrementType.getDownloadPrice());
  283. }
  284. @Override
  285. public IncrementOrder incrementOrder(DownNumParam param) {
  286. //支付美金,只能paypal支付
  287. if(param.getAbroad() == 1 && param.getPayType() != 2){
  288. throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  289. }
  290. User user = userService.getByUserName(param.getUserName());
  291. if(user == null){
  292. throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  293. }
  294. IncrementType incrementType = incrementTypeService.getById(param.getIncrementType());
  295. if(incrementType == null){
  296. throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004);
  297. }
  298. return incrementOrderService.insertIncrementOrder(user.getId(), param,incrementType);
  299. }
  300. @Override
  301. public boolean paySuccessEntityOrder(String orderSn, String tradeNo, int paymentTypeName) {
  302. LambdaUpdateWrapper<Order> updateWrapper = new LambdaUpdateWrapper<>();
  303. updateWrapper.set(Order::getPaymentTypeName,paymentTypeName)
  304. .set(Order::getTradeNum,tradeNo)
  305. .set(Order::getPaymentStatus, PaymentStatus.paid.name())
  306. .eq(Order::getOrderSn,orderSn);
  307. return this.update(updateWrapper);
  308. }
  309. @Override
  310. public OrderVo getOrderDetail(Long orderId) {
  311. Order order = this.getById(orderId);
  312. OrderVo responseOrder = new OrderVo();
  313. if(order == null ){
  314. return responseOrder;
  315. }
  316. BeanUtils.copyProperties(order,responseOrder);
  317. List<OrderItem> responseOrderItems =orderItemService.getByOrderId(orderId);
  318. responseOrder.setOrderItems(responseOrderItems);
  319. Invoice invoice = invoiceService.getByOrderId(orderId);
  320. if(invoice != null){
  321. responseOrder.setInvoice(invoice);
  322. }
  323. return responseOrder;
  324. }
  325. @Override
  326. public void autoUpdateOrderStatus() {
  327. this.getBaseMapper().autoUpdateOrderStatus();
  328. }
  329. }