package com.fdkankan.ucenter.service.impl; import com.amazonaws.services.codecommit.model.OrderEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fdkankan.common.constant.TbStatus; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.ucenter.common.PageInfo; import com.fdkankan.common.util.FileUtils; import com.fdkankan.common.util.NumberUtils; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.ucenter.common.RedisKeyUtil; import com.fdkankan.ucenter.constant.*; import com.fdkankan.ucenter.entity.*; import com.fdkankan.ucenter.mapper.IOrderMapper; import com.fdkankan.ucenter.pay.alipay.sdk.AlipayService; import com.fdkankan.ucenter.pay.wx.WXPay; import com.fdkankan.ucenter.pay.wx.WXPayConstants; import com.fdkankan.ucenter.pay.wx.WXPayDefaultConfig; import com.fdkankan.ucenter.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.ucenter.util.DateUserUtil; import com.fdkankan.ucenter.vo.request.CartParam; import com.fdkankan.ucenter.vo.request.DownNumParam; import com.fdkankan.ucenter.vo.request.OrderParam; import com.fdkankan.ucenter.vo.request.PlaceOrderParam; import com.fdkankan.ucenter.vo.response.GoodsSkuVo; import com.fdkankan.ucenter.vo.response.OrderVo; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** *

* 订单表 服务实现类 *

* * @author * @since 2022-07-13 */ @Service public class OrderServiceImpl extends ServiceImpl implements IOrderService { @Autowired IUserService userService; @Autowired IOrderItemService orderItemService; @Autowired IInvoiceService invoiceService; @Autowired IIncrementOrderService incrementOrderService; @Autowired ICartService cartService; @Autowired IGoodsService goodsService; @Autowired IGoodsSkuService goodsSkuService; @Autowired RedisUtil redisUtil; @Autowired AlipayService alipayService; @Autowired IDownloadOrderService downloadOrderService; @Autowired IIncrementTypeService incrementTypeService; @Override public PageInfo pageList(OrderParam param) { User user = userService.getByUserName(param.getUserName()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Order::getUserId,user.getId()); wrapper.eq(Order::getPaymentStatus,"paid"); wrapper.orderByDesc(Order::getOrderTime); Page page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper); List orderVos = new ArrayList<>(); for (Order record : page.getRecords()) { OrderVo orderVo = new OrderVo(); BeanUtils.copyProperties(record,orderVo); Invoice invoice = invoiceService.getByOrderId(record.getId()); orderVo.setInvoice(invoice); List itemList = orderItemService.getByOrderId(record.getId()); orderVo.setOrderItems(itemList); orderVos.add(orderVo); } Page pageVo = new Page<>(param.getPageNum(),param.getPageSize()); pageVo.setRecords(orderVos); pageVo.setTotal(page.getTotal()); return PageInfo.PageInfo(pageVo); } @Override public GoodsSkuVo getIncrementOrDownloadPrice(OrderParam param) { return incrementOrderService.getDownloadPrice(param); } @Override public void cancel(Long orderId) { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.set(Order::getOrderStatus, OrderStatus.invalid) .eq(Order::getId,orderId); this.update(wrapper); } @Override public void receipt(Long orderId) { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.set(Order::getOrderStatus, OrderStatus.completed) .set(Order::getShippingStatus, ShippingStatus.received) .eq(Order::getId,orderId); this.update(wrapper); } @Override public Order placeOrder(PlaceOrderParam param) { List id = param.getGoods().parallelStream().map(CartParam::getId).collect(Collectors.toList()); List ids = new ArrayList<>(); for (Long aLong : id) { ids.add(String.valueOf(aLong)); } User user = userService.getByUserName(param.getUserName()); cartService.deleteIds(ids); // 下单 List orderItemEntities = new ArrayList<>(); OrderItem orderItemEntity = null; int goodsTotalCount = 0; BigDecimal goodsAmount = new BigDecimal(0); for(CartParam requestCart : param.getGoods()){ goodsTotalCount += requestCart.getGoodsCount(); Goods responseGoods = goodsService.getById(requestCart.getGoodsId()); if (responseGoods == null){ continue; } GoodsSku sku = goodsSkuService.getBySku(requestCart.getSkuSn()); if (sku == null){ throw new BusinessException(500,LoginConstant.ERROR_MSG); } orderItemEntity = new OrderItem(); orderItemEntity.setExpressNum(null); orderItemEntity.setGoodsPrice(param.getAbroad().intValue() == 0 ? sku.getPrice() : sku.getDollarPrice()); orderItemEntity.setGoodsId(requestCart.getGoodsId()); orderItemEntity.setShippingStatus(ShippingStatus.unshipped.name()); orderItemEntity.setExpressName("顺丰速运"); orderItemEntity.setGoodsCount(requestCart.getGoodsCount()); orderItemEntity.setGoodsName(responseGoods.getName()); orderItemEntity.setGoodsSn(responseGoods.getGoodsSn()); orderItemEntity.setRecStatus("A"); orderItemEntity.setCreateTime(DateUserUtil.getDate(new Date())); orderItemEntity.setUpdateTime(DateUserUtil.getDate(new Date())); if (StringUtils.isNotEmpty(requestCart.getSkuSn())){ orderItemEntity.setSkuSn(requestCart.getSkuSn()); } orderItemEntities.add(orderItemEntity); goodsAmount = goodsAmount.add(orderItemEntity.getGoodsPrice().multiply(new BigDecimal(orderItemEntity.getGoodsCount()))); } Order orderEntity = new Order(); orderEntity.setOrderSn(NumberUtils.getOrderSn()); orderEntity.setOrderTime(new Date()); orderEntity.setOrderStatus(OrderStatus.unprocessed.name()); orderEntity.setPaymentStatus(PaymentStatus.unpaid.name()); orderEntity.setShippingStatus(ShippingStatus.unshipped.name()); orderEntity.setPaymentTypeName(param.getPayType()); orderEntity.setUserId(user.getId()); orderEntity.setGoodsTotalCount(goodsTotalCount); orderEntity.setGoodsAmount(goodsAmount); orderEntity.setTotalAmount(goodsAmount); orderEntity.setPaidAmount(BigDecimal.ZERO); orderEntity.setExpressAmount(BigDecimal.ZERO); orderEntity.setDeliveryTypeName("快递运输"); orderEntity.setRecStatus("A"); orderEntity.setCreateTime(DateUserUtil.getDate(new Date())); orderEntity.setUpdateTime(DateUserUtil.getDate(new Date())); if (param.getReceiver() != null){ orderEntity.setShipAddress(param.getReceiver().getShipAddress()); orderEntity.setShipAreaPath(param.getReceiver().getShipAreaPath()); orderEntity.setShipMobile(param.getReceiver().getShipMobile()); orderEntity.setShipName(param.getReceiver().getShipName()); } orderEntity.setAbroad(param.getAbroad()); this.save(orderEntity); for (OrderItem entity : orderItemEntities){ entity.setOrderId(orderEntity.getId()); } orderItemService.saveBatch(orderItemEntities); if(param.getInvoice()!=null && StringUtils.isNotBlank(param.getInvoice().getInvoiceType())){ param.setOrderId(orderEntity.getId()); param.getInvoice().setAmount(orderEntity.getTotalAmount().toString()); invoiceService.saveByOrder(user.getId(),param); } return orderEntity; } @Override public boolean queryOrderStatus(OrderParam param) throws Exception { boolean success = false; String orderSn = param.getOrderSn(); switch (param.getOrderType()){ case 0: orderSn += "_entity"; break; case 1: orderSn += "_recharge"; break; case 2: orderSn += "_expansion"; break; case 3: orderSn += "_commerce"; break; case 4: orderSn += "_increment"; break; case 5: orderSn += "_download"; break; } if(!redisUtil.hasKey(RedisKeyUtil.QRCODE + orderSn)){ String wxPngPath = QrCodeFilePath.WEIXIN_QRCODE_FOLDER + orderSn + ".png"; String aliPngPath = QrCodeFilePath.ALI_QRCODE_FOLDER + orderSn + ".png"; FileUtils.deleteFile(wxPngPath); FileUtils.deleteFile(aliPngPath); throw new BusinessException(LoginConstant.FAILURE_CODE_3035,LoginConstant.FAILURE_MSG_3035); } switch (param.getPayType()){ // 微信 case 0: String orderSnE = redisUtil.get(orderSn); log.warn("out_trade_no:" + orderSnE); if (StringUtils.isNotEmpty(orderSnE)){ Map data = new HashMap(); data.put("out_trade_no", orderSnE); WXPayDefaultConfig config = new WXPayDefaultConfig(); WXPay wxPay = new WXPay(config); Map resp = wxPay.orderQuery(data); if (resp.get("trade_state") != null && resp.get("trade_state").equals(WXPayConstants.SUCCESS)) { redisUtil.del(orderSnE); success = true; } } break; // 支付宝 case 1: log.warn("alipay out_trade_no:" + orderSn); String type = alipayService.tradeQuery(orderSn); log.warn("alipay type:" + type); if ("SUCCESS".equals(type)){ success = true; } break; // paypal case 2: orderSn = orderSn.split("_")[0]; log.warn("paypal out_trade_no:" + orderSn); Order orderEntity = this.getByOrderSn(orderSn); if (PaymentStatus.paid.name().equals(orderEntity.getPaymentStatus())){ success = true; } break; } return success; } @Override public Order getByOrderSn(String orderSn) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Order::getOrderSn,orderSn); return this.getOne(wrapper); } @Override public DownloadOrder downloadOrder(DownNumParam param) { //支付美金,只能paypal支付 if(param.getAbroad() == 1 && param.getPayType() != 2){ throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); } IncrementType incrementType = incrementTypeService.getById(param.getSkuSn()); if(incrementType == null){ throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); } // GoodsSku goodsSku = goodsSkuService.getBySku(param.getSkuSn()); // if(goodsSku == null){ // throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); // } User user = userService.getByUserName(param.getUserName()); if(user == null){ throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); } return downloadOrderService.insertDownloadOrder(user.getId(),param,incrementType.getDownloadPrice()); } @Override public IncrementOrder incrementOrder(DownNumParam param) { //支付美金,只能paypal支付 if(param.getAbroad() == 1 && param.getPayType() != 2){ throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); } User user = userService.getByUserName(param.getUserName()); if(user == null){ throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); } IncrementType incrementType = incrementTypeService.getById(param.getIncrementType()); if(incrementType == null){ throw new BusinessException(OrderConstant.FAILURE_CODE_8004, OrderConstant.FAILURE_MSG_8004); } return incrementOrderService.insertIncrementOrder(user.getId(), param,incrementType); } @Override public boolean paySuccessEntityOrder(String orderSn, String tradeNo, int paymentTypeName) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(Order::getPaymentTypeName,paymentTypeName) .set(Order::getTradeNum,tradeNo) .set(Order::getPaymentStatus, PaymentStatus.paid.name()) .eq(Order::getOrderSn,orderSn); return this.update(updateWrapper); } @Override public OrderVo getOrderDetail(Long orderId) { Order order = this.getById(orderId); OrderVo responseOrder = new OrderVo(); if(order == null ){ return responseOrder; } BeanUtils.copyProperties(order,responseOrder); List responseOrderItems =orderItemService.getByOrderId(orderId); responseOrder.setOrderItems(responseOrderItems); Invoice invoice = invoiceService.getByOrderId(orderId); if(invoice != null){ responseOrder.setInvoice(invoice); } return responseOrder; } @Override public void autoUpdateOrderStatus() { this.getBaseMapper().autoUpdateOrderStatus(); } }