From 722f17e0fc6a1fbe709bd02bbb7c75b8da435e07 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Tue, 10 May 2022 15:20:50 +0800 Subject: [PATCH] add score goods-list and goods-add --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 259 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 239 insertions(+), 20 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..972451a 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,28 @@ package cc.mrbird.febs.mall.service.impl; -import cc.mrbird.febs.common.enumerates.OrderStatusEnum; +import cc.mrbird.febs.common.enumerates.*; 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.pay.service.IPayService; +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 +31,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 +53,21 @@ 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; + private final IPayService payService; @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("地址不存在"); } @@ -83,7 +98,12 @@ } if (sku.getStock() < item.getCnt()) { - throw new FebsException("库存不足"); + throw new FebsException(sku.getSkuName() + "库存不足"); + } + + MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId()); + if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) { + throw new FebsException(mallGoods.getGoodsName() + "已下架"); } MallOrderItem orderItem = new MallOrderItem(); @@ -96,23 +116,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 +157,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 +169,68 @@ throw new FebsException("订单状态不能支付"); } + String payResultStr = ""; switch (payOrderDto.getType()) { case "1": - // TODO 微信支付 +// orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo()); +// orderInfo.setPayImage(payOrderDto.getPayImage()); + orderInfo.setPayMethod("微信支付"); break; case "2": - // TODO 支付宝支付 + if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { + payResultStr = orderInfo.getPayOrderNo(); + } else { + payResultStr = payService.aliPay(orderInfo); + } + + orderInfo.setPayOrderNo(payResultStr); + orderInfo.setPayMethod("支付宝支付"); break; case "3": - return balancePay(orderInfo, payOrderDto.getTradePwd()); + payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd()); + + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("余额支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + +// MallMember mallMember = memberMapper.selectById(member.getId()); +// if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { +// mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); +// memberMapper.updateById(mallMember); +// } + + // 静态倍数 + List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId()); + if (CollUtil.isNotEmpty(orderItems)) { + for (MallOrderItem orderItem : orderItems) { + MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); + + MallGoodsSku sku = mallGoodsSkuMapper.selectById(orderItem.getSkuId()); + BigDecimal score = sku.getOriginalPrice().multiply(mallGoods.getStaticMulti()); + + memberWalletService.add(score, member.getId(), "score"); + memberService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), null, null, null, null, FlowTypeEnum.SCORE.getValue()); + } + } + + memberService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null, FlowTypeEnum.BALANCE.getValue()); +// agentProducer.sendAutoLevelUpMsg(member.getId()); +// agentProducer.sendReturnMoneyMsg(orderInfo.getId()); + default: } - return ""; + + this.baseMapper.updateById(orderInfo); + + Map<String, Object> map = new HashMap<>(); + map.put("orderInfo", payResultStr); + map.put("orderNo", orderInfo.getOrderNo()); + map.put("orderId", orderInfo.getId()); + + return map; } private String balancePay(MallOrderInfo orderInfo, String tradePwd) { @@ -158,19 +239,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()); + memberWalletService.reduce(orderInfo.getAmount(), mallMember.getId(), "balance"); + 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 +267,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 +278,136 @@ 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); + } + + @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