KKSU
2023-12-21 c9289c6477ea92fce66d191b4b2a41a9bad22b05
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java
@@ -1,22 +1,19 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
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.*;
import cc.mrbird.febs.mall.entity.MallAppMember;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.mapper.MallAppMemberMapper;
import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper;
import cc.mrbird.febs.mall.mapper.MallGoodsMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IApiMallAppService;
import cc.mrbird.febs.mall.vo.ApiMallAppMemberInfoVo;
import cc.mrbird.febs.mall.vo.ApiMallGoodsListVo;
import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo;
import cc.mrbird.febs.mall.vo.MallGoodsListVo;
import cc.mrbird.febs.mall.vo.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@@ -24,11 +21,16 @@
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.alibaba.fastjson.JSONObject;
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.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -42,7 +44,13 @@
    private final MallMemberMapper mallMemberMapper;
    private final MallGoodsCategoryMapper mallGoodsCategoryMapper;
    private final MallGoodsMapper mallGoodsMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallOrderItemMapper mallOrderItemMapper;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    public static void main(String[] args) {
        System.out.println(SecureUtil.md5("a123456"));
    }
    @Override
    public FebsResponse appToLogin(LoginDto loginDto) {
        String md5Pwd = SecureUtil.md5(loginDto.getPassword());
@@ -90,10 +98,202 @@
    }
    @Override
    @Transactional
    public FebsResponse createAppOrder(ApiAddOrderDto addOrderDto) {
        MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(addOrderDto.getMemberId());
        if (ObjectUtil.isEmpty(mallMemberWallet)) {
            throw new FebsException("用户钱包不存在。");
        }
        if (CollUtil.isEmpty(addOrderDto.getItems())) {
            throw new FebsException("商品明细不能为空。");
        }
        Integer type = addOrderDto.getType();
        String orderNo = MallUtils.getOrderNum();
        MallOrderInfo orderInfo = new MallOrderInfo();
        orderInfo.setOrderNo(orderNo);
        orderInfo.setIsApp(AppContants.IS_APP_ORDER);
        orderInfo.setOrderTime(new Date());
        orderInfo.setMemberId(addOrderDto.getMemberId());
        //会员结算
        orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
        mallOrderInfoMapper.insert(orderInfo);
        BigDecimal total = BigDecimal.ZERO;//总支付金额
        //订单子表记录
        for (ApiAddOrderItemDto item : addOrderDto.getItems()) {
            MallOrderItem orderItem = new MallOrderItem();
            MallGoods mallGoods = mallGoodsMapper.selectById(item.getId());
            //现价
            BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
            BigDecimal amount = presentPrice.multiply(item.getCnt());
            orderItem.setAmount(amount);
            orderItem.setOrderId(orderInfo.getId());
            orderItem.setPrice(presentPrice);
            orderItem.setAppCnt(item.getCnt());
            orderItem.setGoodsId(mallGoods.getId());
            orderItem.setGoodsName(mallGoods.getGoodsName());
            orderItem.setSkuImage(mallGoods.getThumb());
            orderItem.setState(1);
//        return new FebsResponse().success().data(orderId).message("创建订单成功");
        return new FebsResponse().success().message("创建订单成功");
            total = total.add(amount);
            mallOrderItemMapper.insert(orderItem);
        }
        orderInfo.setAmount(total);
        orderInfo.setMemberId(mallMemberWallet.getMemberId());
        //折扣费用
        if(AppContants.INSURE_ORDER_MEMBER.equals(type)){
            BigDecimal score = mallMemberWallet.getScore();//积分
            BigDecimal balance = mallMemberWallet.getBalance();//余额
            //这里将运费定义成折扣总金额
            /**
             * 积分 + 余额 1:1来折扣支付金额
             */
            BigDecimal totalCarriage = BigDecimal.ZERO;//总折扣金额
            BigDecimal memberAmount = score.add(balance);//用户积分加余额总数
            if(memberAmount.compareTo(BigDecimal.ZERO) > 0){
                //折扣金额
                if(total.compareTo(memberAmount) >= 0){
                    totalCarriage = memberAmount;
                }else{
                    totalCarriage = total;
                }
                //减少用户积分和余额
                BigDecimal avaAmount = totalCarriage;//剩余需要折扣的金额
                if(avaAmount.compareTo(memberAmount) >= 0){
                    //清零用户的积分和余额
                    mallMemberWallet.setBalance(BigDecimal.ZERO);
                    mallMemberWallet.setScore(BigDecimal.ZERO);
                    mallMemberWalletMapper.updateBalanceScoreWithId(mallMemberWallet);
                }else{
                    /**
                     * 先扣积分,再扣余额
                     */
                    if(avaAmount.compareTo(score) >= 0){
                        mallMemberWallet.setScore(BigDecimal.ZERO);
                        avaAmount = avaAmount.subtract(score);
                    }else{
                        mallMemberWallet.setScore(score.subtract(avaAmount));
                        avaAmount = BigDecimal.ZERO;
                    }
                    //积分不够
                    if(avaAmount.compareTo(BigDecimal.ZERO) > 0){
                        mallMemberWallet.setBalance(balance.subtract(avaAmount));
                    }else{
                        mallMemberWallet.setBalance(balance);
                    }
                    mallMemberWalletMapper.updateBalanceScoreWithId(mallMemberWallet);
                }
            }
            orderInfo.setCarriage(totalCarriage);
        }
        mallOrderInfoMapper.updateById(orderInfo);
        Map<String, Object> orderInfoMap = new HashMap<>();
        orderInfoMap.put("orderId", orderInfo.getId());
        orderInfoMap.put("totalAmount", orderInfo.getAmount());
        orderInfoMap.put("totalCarriage", orderInfo.getCarriage());
        return new FebsResponse().success().data(orderInfoMap);
    }
    @Override
    public FebsResponse registAppOrder(ApiRegistAppOrderDto addOrderDto) {
        String orderNo = MallUtils.getOrderNum();
        MallOrderInfo orderInfo = new MallOrderInfo();
        orderInfo.setOrderNo(orderNo);
        orderInfo.setIsApp(AppContants.IS_APP_ORDER);
        orderInfo.setOrderTime(new Date());
        orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
        if (CollUtil.isEmpty(addOrderDto.getItems())) {
            throw new FebsException("商品明细不能为空。");
        }
        mallOrderInfoMapper.insert(orderInfo);
        BigDecimal total = BigDecimal.ZERO;//总支付金额
        //订单子表记录
        for (ApiAddOrderItemDto item : addOrderDto.getItems()) {
            MallOrderItem orderItem = new MallOrderItem();
            MallGoods mallGoods = mallGoodsMapper.selectById(item.getId());
            //现价
            BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
            BigDecimal amount = presentPrice.multiply(item.getCnt());
            orderItem.setAmount(amount);
            orderItem.setOrderId(orderInfo.getId());
            orderItem.setPrice(presentPrice);
            orderItem.setAppCnt(item.getCnt());
            orderItem.setGoodsId(mallGoods.getId());
            orderItem.setGoodsName(mallGoods.getGoodsName());
            orderItem.setSkuImage(mallGoods.getThumb());
            orderItem.setState(1);
            mallOrderItemMapper.insert(orderItem);
            total = total.add(amount);
        }
        orderInfo.setAmount(total);
        mallOrderInfoMapper.updateById(orderInfo);
        return new FebsResponse().success().message("操作成功");
    }
    @Override
    public FebsResponse normalInsure(ApiNormalInsureDto addOrderDto) {
        String orderNo = MallUtils.getOrderNum();
        MallOrderInfo orderInfo = new MallOrderInfo();
        orderInfo.setOrderNo(orderNo);
        orderInfo.setIsApp(AppContants.IS_APP_ORDER);
        orderInfo.setOrderTime(new Date());
        orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
        if (CollUtil.isEmpty(addOrderDto.getItems())) {
            throw new FebsException("商品明细不能为空。");
        }
        mallOrderInfoMapper.insert(orderInfo);
        BigDecimal total = BigDecimal.ZERO;//总支付金额
        //订单子表记录
        for (ApiAddOrderItemDto item : addOrderDto.getItems()) {
            MallOrderItem orderItem = new MallOrderItem();
            MallGoods mallGoods = mallGoodsMapper.selectById(item.getId());
            //现价
            BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
            BigDecimal amount = presentPrice.multiply(item.getCnt());
            orderItem.setAmount(amount);
            orderItem.setOrderId(orderInfo.getId());
            orderItem.setPrice(presentPrice);
            orderItem.setAppCnt(item.getCnt());
            orderItem.setGoodsId(mallGoods.getId());
            orderItem.setGoodsName(mallGoods.getGoodsName());
            orderItem.setSkuImage(mallGoods.getThumb());
            orderItem.setState(1);
            total = total.add(amount);
            mallOrderItemMapper.insert(orderItem);
        }
        orderInfo.setCarriage(BigDecimal.ZERO);//折扣费用
        orderInfo.setAmount(total);
        mallOrderInfoMapper.updateById(orderInfo);
        Map<String, Object> orderInfoMap = new HashMap<>();
        orderInfoMap.put("orderId", orderInfo.getId());
        orderInfoMap.put("totalAmount", orderInfo.getAmount());
        orderInfoMap.put("totalCarriage", orderInfo.getCarriage());
        return new FebsResponse().success().data(orderInfoMap);
    }
    @Override
    public FebsResponse getOrderList(ApiGetOrderListDto orderListDto) {
        IPage<ApiGetOrderListVo> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize());
        orderListDto.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
        IPage<ApiGetOrderListVo> apiGetOrderListVos = mallOrderInfoMapper.getAppOrderListInPage(page, orderListDto);
        if (CollUtil.isNotEmpty(apiGetOrderListVos.getRecords())) {
            apiGetOrderListVos.getRecords().forEach(item -> {
                item.setItems(mallOrderItemMapper.getAppOrderItemByOrderId(item.getId()));
            });
        }
        return new FebsResponse().success().data(apiGetOrderListVos);
    }
    @Override
    public FebsResponse getOrder(ApiGetOrderDto apiGetOrderDto) {
        ApiGetOrderListVo apiGetOrderListVo = mallOrderInfoMapper.getAppOrderByOrderId(apiGetOrderDto.getOrderId());
        if(ObjectUtil.isNotEmpty(apiGetOrderListVo)){
            apiGetOrderListVo.setItems(mallOrderItemMapper.getAppOrderItemByOrderId(apiGetOrderListVo.getId()));
        }
        return new FebsResponse().success().data(apiGetOrderListVo);
    }
    public String generateAsaToken(String token) {