From 608eb7c54095846d38e7f4e773f5f8eb21016ef6 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Sun, 26 Sep 2021 17:39:20 +0800 Subject: [PATCH] Merge branch 'master' of http://120.27.238.55:7000/r/xc-mall --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 203 insertions(+), 17 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java index d1b9405..da7fa39 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java @@ -1,21 +1,29 @@ package cc.mrbird.febs.mall.service.impl; +import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; +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.common.utils.RedisUtils; 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.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.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; +import cc.mrbird.febs.mall.service.MallMemberService; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; +import cc.mrbird.febs.mall.vo.OrderRefundVo; +import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -24,12 +32,11 @@ 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; +import java.util.*; /** * @author wzy @@ -47,12 +54,20 @@ private final MallMemberMapper memberMapper; private final IApiMallMemberWalletService memberWalletService; private final MallExpressInfoMapper expressInfoMapper; + private final MallOrderRefundMapper mallOrderRefundMapper; + private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper; + private final MallShoppingCartMapper mallShoppingCartMapper; + private final IApiMallMemberService memberService; + private final RedisUtils redisUtils; + + private final AgentProducer agentProducer; @Override + @Transactional(rollbackFor = Exception.class) public Long createOrder(AddOrderDto addOrderDto) { MallMember member = LoginUserUtil.getLoginUser(); - MallAddressInfo address = mallAddressInfoMapper.selectById(addOrderDto.getAddressId()); + MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId()); if (address == null) { throw new FebsException("地址不存在"); } @@ -96,23 +111,34 @@ 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()); + sku.setSkuVolume(sku.getSkuVolume() + item.getCnt()); mallGoodsSkuMapper.updateById(sku); + + if (addOrderDto.getType() == 1) { + mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId()); + } } + orderInfo.setAmount(total); + this.baseMapper.updateById(orderInfo); + agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 15 * 60 * 1000L); 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) { + if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } @@ -126,10 +152,11 @@ } @Override - public String payOrder(PayOrderDto payOrderDto) { + @Transactional(rollbackFor = Exception.class) + public Map<String, Object> payOrder(PayOrderDto payOrderDto) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), payOrderDto.getId()); - if (orderInfo == null) { + if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } @@ -137,19 +164,38 @@ throw new FebsException("订单状态不能支付"); } + String orderNo = ""; switch (payOrderDto.getType()) { case "1": - // TODO 微信支付 + orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo()); + orderInfo.setPayImage(payOrderDto.getPayImage()); + orderInfo.setPayMethod("微信支付"); break; case "2": - // TODO 支付宝支付 + orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo()); + orderInfo.setPayImage(payOrderDto.getPayImage()); + orderInfo.setPayMethod("支付宝支付"); break; case "3": - return balancePay(orderInfo, payOrderDto.getTradePwd()); + orderNo = balancePay(orderInfo, payOrderDto.getTradePwd()); + + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("积分支付"); default: } - return ""; + + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + this.baseMapper.updateById(orderInfo); + + memberService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null); + + Map<String, Object> map = new HashMap<>(); + map.put("orderNo", orderNo); + map.put("orderId", orderInfo.getId()); + return map; } private String balancePay(MallOrderInfo orderInfo, String tradePwd) { @@ -158,19 +204,27 @@ } MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId()); - if (!mallMember.getTradePassword().equals(SecureUtil.md5(tradePwd))) { + + if (StrUtil.isBlank(mallMember.getTradePassword())) { + throw new FebsException("未设置支付密码"); + } + + if (!SecureUtil.md5(tradePwd).equals(mallMember.getTradePassword())) { throw new FebsException("支付密码错误"); } memberWalletService.reduceBalance(orderInfo.getAmount(), mallMember.getId()); + return orderInfo.getOrderNo(); } @Override public List<OrderListVo> findOrderList(OrderListDto orderListDto) { + MallMember member = LoginUserUtil.getLoginUser(); IPage<MallOrderInfo> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize()); + orderListDto.setMemberId(member.getId()); IPage<MallOrderInfo> mallOrderInfos = this.baseMapper.selectApiOrderListInPage(page, orderListDto); return MallOrderInfoConversion.INSTANCE.entitysToVos(mallOrderInfos.getRecords()); } @@ -178,7 +232,7 @@ @Override public OrderDetailVo findOrderDetailsById(Long id) { MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(id); - if (orderInfo == null) { + if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } @@ -189,6 +243,138 @@ 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); + } + + if (OrderStatusEnum.WAIT_PAY.getValue() == orderInfo.getStatus()) { + Date endTime = DateUtil.offsetMinute(orderInfo.getOrderTime(), 15); + + long remainTime = DateUtil.between(new Date(), endTime, DateUnit.SECOND, false); + orderDetailVo.setRemainTime(remainTime); + } 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); + + agentProducer.sendAutoLevelUpMsg(member.getId()); + } + + @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_SHIPPING.getValue() && orderInfo.getStatus() != OrderStatusEnum.WAIT_FINISH.getValue()) { + throw new FebsException("该订单不能退款"); + } + + Integer beforeStatus = orderInfo.getStatus(); + 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.setType(addRefundDto.getType()); + orderRefund.setRefundTime(new Date()); + orderRefund.setBeforeStatus(beforeStatus); + orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); + mallOrderRefundMapper.insert(orderRefund); + } else { + orderRefund.setDesp(addRefundDto.getDesp()); + orderRefund.setReason(addRefundDto.getReason()); + orderRefund.setType(addRefundDto.getType()); + orderRefund.setRefundTime(new Date()); + orderRefund.setBeforeStatus(beforeStatus); + 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()); + orderRefund.setStatus(OrderRefundStatusEnum.EXPRESS_SUBMIT.getValue()); + 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); + } + + @Override + public void autoCancelOrder(Long id) { + MallOrderInfo orderInfo = this.baseMapper.selectById(id); + if (orderInfo == null) { + log.error("自动取消订单参数错误:{}", id); + return; + } + if (orderInfo.getStatus() == OrderStatusEnum.WAIT_PAY.getValue()) { + log.info("自动取消订单:{},{}", orderInfo.getMemberId(), id); + orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue()); + orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY); + this.baseMapper.updateById(orderInfo); + } + } } -- Gitblit v1.9.1