package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.OrderRefundStatusEnum; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion; import cc.mrbird.febs.mall.conversion.MallOrderRefundConversion; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; import cc.mrbird.febs.mall.vo.OrderRefundVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Random; /** * @author wzy * @date 2021-09-18 **/ @Slf4j @Service @RequiredArgsConstructor public class ApiMallOrderInfoServiceImpl extends ServiceImpl implements IApiMallOrderInfoService { private final MallGoodsMapper mallGoodsMapper; private final MallGoodsSkuMapper mallGoodsSkuMapper; private final MallAddressInfoMapper mallAddressInfoMapper; private final MallOrderItemMapper mallOrderItemMapper; private final MallMemberMapper memberMapper; private final IApiMallMemberWalletService memberWalletService; private final MallExpressInfoMapper expressInfoMapper; private final MallOrderRefundMapper mallOrderRefundMapper; private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper; private final MallShoppingCartMapper mallShoppingCartMapper; @Override @Transactional(rollbackFor = Exception.class) public Long createOrder(AddOrderDto addOrderDto) { MallMember member = LoginUserUtil.getLoginUser(); MallAddressInfo address = mallAddressInfoMapper.selectById(addOrderDto.getAddressId()); if (address == null) { throw new FebsException("地址不存在"); } String orderNo = MallUtils.getOrderNum(); MallOrderInfo orderInfo = new MallOrderInfo(); orderInfo.setOrderNo(orderNo); orderInfo.setOrderTime(new Date()); orderInfo.setMemberId(member.getId()); orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue()); orderInfo.setName(address.getName()); orderInfo.setAddress(address.getArea() + address.getAddress()); orderInfo.setPhone(address.getPhone()); orderInfo.setLatitude(address.getLatitude()); orderInfo.setLongitude(address.getLongitude()); orderInfo.setRemark(addOrderDto.getRemark()); if (CollUtil.isEmpty(addOrderDto.getItems())) { throw new FebsException("参数错误"); } this.baseMapper.insert(orderInfo); BigDecimal total = BigDecimal.ZERO; for (AddOrderItemDto item : addOrderDto.getItems()) { MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); if (sku == null) { throw new FebsException("购买商品或sku不存在"); } if (sku.getStock() < item.getCnt()) { throw new FebsException("库存不足"); } MallOrderItem orderItem = new MallOrderItem(); BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())); orderItem.setAmount(amount); orderItem.setCnt(item.getCnt()); orderItem.setOrderId(orderInfo.getId()); orderItem.setPrice(sku.getPresentPrice()); orderItem.setGoodsId(sku.getGoodsId()); orderItem.setGoodsName(sku.getGoodsName()); orderItem.setSkuId(sku.getId()); orderItem.setStyleName(sku.getStyleName()); orderItem.setSkuName(sku.getSkuName()); orderItem.setSkuImage(sku.getSkuImage()); total = total.add(amount); mallOrderItemMapper.insert(orderItem); sku.setStock(sku.getStock() - item.getCnt()); mallGoodsSkuMapper.updateById(sku); if (addOrderDto.getType() == 1) { mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId()); } } orderInfo.setAmount(total); this.baseMapper.updateById(orderInfo); return orderInfo.getId(); } @Override @Transactional(rollbackFor = Exception.class) public void cancelOrder(Long id) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) { throw new FebsException("订单不是待付款, 无法取消"); } orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue()); orderInfo.setCancelType(MallOrderInfo.CANCEL_BY_SELF); this.baseMapper.updateById(orderInfo); } @Override @Transactional(rollbackFor = Exception.class) public String payOrder(PayOrderDto payOrderDto) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), payOrderDto.getId()); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) { throw new FebsException("订单状态不能支付"); } switch (payOrderDto.getType()) { case "1": // TODO 微信支付 break; case "2": // TODO 支付宝支付 break; case "3": return balancePay(orderInfo, payOrderDto.getTradePwd()); default: } return ""; } private String balancePay(MallOrderInfo orderInfo, String tradePwd) { if (StrUtil.isBlank(tradePwd)) { throw new FebsException("支付密码错误"); } MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId()); if (!mallMember.getTradePassword().equals(SecureUtil.md5(tradePwd))) { throw new FebsException("支付密码错误"); } memberWalletService.reduceBalance(orderInfo.getAmount(), mallMember.getId()); return orderInfo.getOrderNo(); } @Override public List findOrderList(OrderListDto orderListDto) { IPage page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize()); IPage mallOrderInfos = this.baseMapper.selectApiOrderListInPage(page, orderListDto); return MallOrderInfoConversion.INSTANCE.entitysToVos(mallOrderInfos.getRecords()); } @Override public OrderDetailVo findOrderDetailsById(Long id) { MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(id); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } OrderDetailVo orderDetailVo = MallOrderInfoConversion.INSTANCE.entityToDetailVo(orderInfo); if (orderInfo.getStatus() == OrderStatusEnum.WAIT_FINISH.getValue()) { MallExpressInfo expressInfo = expressInfoMapper.selectByOrderId(orderInfo.getId()); orderDetailVo.setExpressNo(expressInfo.getExpressNo()); orderDetailVo.setExpressCom(expressInfo.getExpressCom()); } if (orderInfo.getStatus() == OrderStatusEnum.REFUNDING.getValue() || orderInfo.getStatus() == OrderStatusEnum.REFUNDED.getValue()) { MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(orderInfo.getId()); OrderRefundVo orderRefundVo = MallOrderRefundConversion.INSTANCE.entityToVo(orderRefund); orderDetailVo.setOrderRefund(orderRefundVo); } return orderDetailVo; } @Override @Transactional(rollbackFor = Exception.class) public void confirmOrder(Long id) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } if (orderInfo.getStatus() != OrderStatusEnum.WAIT_FINISH.getValue()) { throw new FebsException("该状态不能确认收货"); } orderInfo.setStatus(OrderStatusEnum.FINISH.getValue()); orderInfo.setReceivingTime(new Date()); this.baseMapper.updateById(orderInfo); } @Override public void delOrder(Long id) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } orderInfo.setDelFlag(AppContants.DEL_FLAG_Y); this.baseMapper.updateById(orderInfo); } @Override @Transactional(rollbackFor = Exception.class) public void applyRefund(AddRefundDto addRefundDto) { MallOrderInfo orderInfo = this.baseMapper.selectById(addRefundDto.getId()); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } if (orderInfo.getStatus() == OrderStatusEnum.REFUNDING.getValue()) { throw new FebsException("已提交退款, 请勿重复提交"); } if (orderInfo.getStatus() == OrderStatusEnum.WAIT_PAY.getValue()) { throw new FebsException("该订单不能退款"); } MallMember member = LoginUserUtil.getLoginUser(); orderInfo.setStatus(OrderStatusEnum.REFUNDING.getValue()); this.baseMapper.updateById(orderInfo); MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(orderInfo.getId()); if (orderRefund == null) { orderRefund = new MallOrderRefund(); orderRefund.setOrderId(orderInfo.getId()); orderRefund.setMemberId(member.getId()); orderRefund.setDesp(addRefundDto.getDesp()); orderRefund.setReason(addRefundDto.getReason()); orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); mallOrderRefundMapper.insert(orderRefund); } else { orderRefund.setDesp(addRefundDto.getDesp()); orderRefund.setReason(addRefundDto.getReason()); orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); mallOrderRefundMapper.updateById(orderRefund); } MallOrderRefundOperation operation = new MallOrderRefundOperation(); operation.setOrderId(orderInfo.getId()); operation.setRefundId(orderRefund.getId()); operation.setContent(StrUtil.format("用户:{}提交退款申请", member.getName())); mallOrderRefundOperationMapper.insert(operation); } @Override public void refundExpress(RefundExpressDto refundExpressDto) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(refundExpressDto.getId()); if (!OrderRefundStatusEnum.AGREE.getValue().equals(orderRefund.getStatus())) { throw new FebsException("暂不能提交物流信息"); } orderRefund.setExpressNo(refundExpressDto.getExpressNo()); orderRefund.setExpressCom(refundExpressDto.getExpressCom()); mallOrderRefundMapper.updateById(orderRefund); MallOrderRefundOperation operation = new MallOrderRefundOperation(); operation.setOrderId(refundExpressDto.getId()); operation.setRefundId(orderRefund.getId()); operation.setContent(StrUtil.format("用户:{}提交物流信息,快递公司:{},单号:{}", member.getName(), refundExpressDto.getExpressCom(), refundExpressDto.getExpressNo())); mallOrderRefundOperationMapper.insert(operation); } }