package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
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.dto.AddOrderDto;
|
import cc.mrbird.febs.mall.dto.AddOrderItemDto;
|
import cc.mrbird.febs.mall.dto.OrderListDto;
|
import cc.mrbird.febs.mall.dto.PayOrderDto;
|
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 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 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<MallOrderInfoMapper, MallOrderInfo> 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;
|
|
@Override
|
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());
|
|
total = total.add(amount);
|
mallOrderItemMapper.insert(orderItem);
|
|
sku.setStock(sku.getStock() - item.getCnt());
|
mallGoodsSkuMapper.updateById(sku);
|
}
|
|
|
return orderInfo.getId();
|
}
|
|
@Override
|
public void cancelOrder(Long id) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
|
if (orderInfo == null) {
|
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
|
public String payOrder(PayOrderDto payOrderDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), payOrderDto.getId());
|
if (orderInfo == null) {
|
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<OrderListVo> findOrderList(OrderListDto orderListDto) {
|
IPage<MallOrderInfo> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize());
|
|
IPage<MallOrderInfo> mallOrderInfos = this.baseMapper.selectOrderListInPage(page, orderListDto);
|
return MallOrderInfoConversion.INSTANCE.entitysToVos(mallOrderInfos.getRecords());
|
}
|
|
@Override
|
public OrderDetailVo findOrderDetailsById(Long id) {
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(id);
|
if (orderInfo == null) {
|
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());
|
}
|
return orderDetailVo;
|
}
|
}
|