mitao
2024-04-30 ab4ea7b8f10c9b66aed9c2ea161a08b25c3851a7
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java
@@ -1,8 +1,12 @@
package com.sinata.rest.modular.mall.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.common.enums.EnumMemberGrade;
@@ -13,6 +17,7 @@
import com.sinata.common.enums.mall.EnumMallGoodsState;
import com.sinata.common.enums.mall.EnumMallOrderPrefix;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.common.model.GroupSpecGoodsSkuJsonVo;
import com.sinata.rest.common.ApiUtils;
import com.sinata.rest.core.util.DailyIncrementIdGenerator;
import com.sinata.rest.core.util.DateUtils;
@@ -25,6 +30,7 @@
import com.sinata.rest.modular.mall.dao.NoticeMapper;
import com.sinata.rest.modular.mall.model.*;
import com.sinata.rest.modular.mall.service.*;
import com.sinata.rest.modular.member.controller.common.body.BodyMallOrderDetailUse;
import com.sinata.rest.modular.member.model.MemMerchant;
import com.sinata.rest.modular.member.model.MemUser;
import com.sinata.rest.modular.member.model.MemUserBankDetail;
@@ -34,6 +40,7 @@
import com.sinata.rest.modular.system.model.AreaCity;
import com.sinata.rest.modular.system.service.ISystemSetService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -42,6 +49,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
/**
@@ -92,6 +100,15 @@
    @Resource
    private DailyIncrementIdGenerator dailyIncrementIdGenerator;
    @Resource
    private IMallOrderDetailGroupSpecService mallOrderDetailGroupSpecService;
    @Resource
    private IMallGroupSpecService mallGroupSpecService;
    @Resource
    private IMallCommissionSettlementService mallCommissionSettlementService;
    @Override
    public List<VoMallOrder> getOrderByUserIdList(Integer userId, Integer saleUserId, Integer state, Page page) {
        return this.baseMapper.getOrderByUserIdList(userId, saleUserId, state, page);
@@ -99,7 +116,13 @@
    @Override
    public VoMallOrder getOrderByOrderNo(String orderNo) {
        return this.baseMapper.getOrderByOrderNo(orderNo);
        List<VoMallOrder> voMallOrderList = this.baseMapper.getOrderListByOrderNo(orderNo);
        return voMallOrderList.stream().findFirst().orElse(null);
    }
    @Override
    public List<VoMallOrder> getOrderListByOrderNo(String orderNo) {
        return this.baseMapper.getOrderListByOrderNo(orderNo);
    }
    @Override
@@ -144,6 +167,13 @@
            MallOrder order = new MallOrder();
            order.setOrderMainNo(orderMain.getOrderNo());
            order.setSaleUserId(body.getSaleUserId());
            // 设置销售人员地区所属区域
            if (order.getSaleUserId() != null) {
                MemUser saleUser = memUserService.getById(order.getSaleUserId());
                if (saleUser != null && StrUtil.isNotBlank(saleUser.getCityCode())) {
                    order.setCityCode(saleUser.getCityCode());
                }
            }
            order.setMerchantId(body.getMerchantId());
            order.setCityCode(body.getCityCode());
            order.setUserId(userId);
@@ -153,7 +183,8 @@
            order.setNumber(body.getNumber());
            order.setState(EnumMallOrderState.WAIT_PAY.index);
            // 生成订单编号
            order.setOrderNo(dailyIncrementIdGenerator.generateId());
            String generateOrderNo = dailyIncrementIdGenerator.generateId();
            order.setOrderNo(generateOrderNo);
            String provinceCode = null;
            String cityCode = null;
@@ -186,7 +217,8 @@
                    // 套餐商品
                    skuVoList.add(o);
                    order.setOrderNo(EnumMallOrderPrefix.GOODS_GROUP_ORDER.index + order.getOrderNo());
                    // 拼接套餐订单编号
                    order.setOrderNo(EnumMallOrderPrefix.GOODS_GROUP_ORDER.index + generateOrderNo);
                }
                order.setOrderType(o.getGroupType());
            }
@@ -199,6 +231,9 @@
            for(BodyMallOrderDetail boSku : body.getSkuList()) {
                for (VoGoodsSku skuVo : skuVoList) {
                    if(skuVo.getId().intValue() == boSku.getSkuId() || skuVo.getSkuId().intValue() == boSku.getSkuId() ) {
                        // 设置订单详情编号
                        String orderDetailNoStr = EnumMallOrderPrefix.ORDER_DETAIL.index + DateUtils.format(new Date(), "yyMMddHHmmSSS") + ToolUtil.getRandomNumber(6);
                        // 判断商品状态是否正常
                        if(skuVo.getState() != EnumMallGoodsState.FOR_SALE.index) {
                            return ApiUtils.returnNG(null, "商品:" + skuVo.getGoodsName() + "," + EnumMallGoodsState.getMarkByIndex(skuVo.getState()));
@@ -218,7 +253,7 @@
                                // 美天销售价
                                sellCost = skuVo.getPriceSale();
                            } else {
                                if (user != null && user.getMemberGradeId() != EnumMemberGrade.G_1.index) {
                                if (user != null && user.getMemberGradeId() != EnumMemberGrade.G_1.index && EnumMemberGrade.G_2.index != user.getMemberGradeId()) {
                                    // 会员价
                                    sellCost = skuVo.getPriceMember();
                                } else {
@@ -228,12 +263,31 @@
                            }
                        } else {
                            // 套餐商品(优先销售价(门店价存得值),未设置为美天销售价)
                            if (skuVo.getPriceMerchant() == null || skuVo.getPriceMerchant().compareTo(BigDecimal.ZERO) <= 0) {
                           /* if (skuVo.getPriceMerchant() == null || skuVo.getPriceMerchant().compareTo(BigDecimal.ZERO) <= 0) {
                                // 美天销售价
                                sellCost = skuVo.getPriceSale();
                            } else {
                                // 销售价
                                sellCost = skuVo.getPriceMerchant();
                            }*/
                            // 美天销售价
                            sellCost = skuVo.getPriceSale();
                            // 查询套餐规格组ID
                            MallGroupSpec mallGroupSpec = mallGroupSpecService.getById(skuVo.getSpecIds());
                            List<GroupSpecGoodsSkuJsonVo> groupSpecGoodsSkuJsonVoList = JSONUtil.parseArray(mallGroupSpec.getGoodsSkuJson()).toList(GroupSpecGoodsSkuJsonVo.class);
                            for (GroupSpecGoodsSkuJsonVo groupSpecGoodsSkuJsonVo : groupSpecGoodsSkuJsonVoList) {
                                // 对套餐规格组商品添加记录
                                MallOrderDetailGroupSpec.builder()
                                        .orderNo(order.getOrderNo())
                                        .orderDetailNo(orderDetailNoStr)
                                        .goodsId(skuVo.getGoodsId())
                                        .skuId(skuVo.getId())
                                        .skuNum(boSku.getGoodsNum())
                                        .groupSpecId(mallGroupSpec.getId())
                                        .groupSpecGoodsId(groupSpecGoodsSkuJsonVo.getGoodsId())
                                        .groupSpecGoodsNum(groupSpecGoodsSkuJsonVo.getGoodsNum() * boSku.getGoodsNum())
                                        .build()
                                        .insert();
                            }
                        }
@@ -242,17 +296,17 @@
                        // 订单详细信息
                        MallOrderDetail orderDetail = new MallOrderDetail();
                        orderDetail.setOrderDetailNo(EnumMallOrderPrefix.ORDER_DETAIL.index + DateUtils.format(new Date(), "yyMMddHHmmSSS") + ToolUtil.getRandomNumber(6));
                        orderDetail.setOrderDetailNo(orderDetailNoStr);
                        orderDetail.setOrderNo(order.getOrderNo());
                        orderDetail.setTotalMoney(totalMoney);
                        orderDetail.setGoodsId(skuVo.getGoodsId());
                        orderDetail.setSkuId(skuVo.getSkuId());
                        orderDetail.setSkuId(skuVo.getId());
                        orderDetail.setGoodsSku(JSON.toJSONString(skuVo));
                        orderDetail.setSellCost(sellCost);
                        orderDetail.setGoodsNum(boSku.getGoodsNum());
                        orderDetail.setGoodsName(skuVo.getGoodsName());
                        orderDetail.setGrepName(skuVo.getGrepName());
                        orderDetail.setSpecGrep(skuVo.getSpecGrep());
                        orderDetail.setSpecGrep(skuVo.getSpecIds());
                        orderDetail.setGoodsImage(skuVo.getGoodsImage());
                        orderDetail.setProvinceCode(StrUtil.isNotBlank(provinceCode) ? provinceCode : skuVo.getProvinceCode());
                        orderDetail.setCityCode(StrUtil.isNotBlank(cityCode) ? cityCode : skuVo.getCityCode());
@@ -543,4 +597,125 @@
    public List<VoMallOrder> getNotCommissionSettlementOrderList() {
        return this.baseMapper.getNotCommissionSettlementOrderList();
    }
    @Override
    public Boolean use(BodyMallOrderDetailUse body) throws TimeoutException {
        VoMallOrder order = this.getOrderByOrderNo(body.getOrderNo());
        if (Objects.isNull(order)) {
            throw new IllegalArgumentException("错误的订单信息");
        }
        if (!order.getMerchantId().equals(ThreadPoolUtil.getUserId()) && body.getOrderDetailGroupSpecId() == null) {
            throw new IllegalArgumentException("该订单不是此门店的预约订单");
        }
        Long nowTime = System.currentTimeMillis();
        if ((Objects.nonNull(order.getStartTime()) && Objects.nonNull(order.getEndTime())
                && (nowTime.compareTo(order.getEndTime().getTime()) > 0
                || nowTime.compareTo(order.getStartTime().getTime()) < 0))) {
            throw new IllegalArgumentException("未到核销时间");
        }
        if (!order.getState().equals(EnumMallOrderState.WAIT_CHECK.index)
                && !order.getState().equals(EnumMallOrderState.USE.index)) {
            throw new IllegalArgumentException("订单状态无法被核销");
        }
        LambdaQueryWrapper<MallOrderDetail> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(MallOrderDetail::getOrderDetailNo, body.getOrderDetailNo());
        MallOrderDetail orderDetail = orderDetailService.getOne(queryWrapper2);
        Integer useNumber = 0;
        // 是否保存核销记录
        Boolean isSaveUse = false;
        if (body.getOrderDetailGroupSpecId() != null) {
            MallOrderDetailGroupSpec orderDetailGroupSpec = mallOrderDetailGroupSpecService.getById(body.getOrderDetailGroupSpecId());
            if (orderDetailGroupSpec == null) {
                throw new TimeoutException("套餐规格组商品信息无效!");
            }
            // 套餐规格组商品核销数
            Integer groupSpecUse = orderDetailGroupSpec.getGroupSpecUse() + body.getUseNum();
            orderDetailGroupSpec.setGroupSpecUse(groupSpecUse);
            if (groupSpecUse.equals(orderDetailGroupSpec.getGroupSpecGoodsNum())) {
                orderDetailGroupSpec.setIsUse(1);
            }
            orderDetailGroupSpec.setUseDateTime(new Date());
            orderDetailGroupSpec.setUseMerchantId(order.getMerchantId());
            // 更新信息
            orderDetailGroupSpec.updateById();
            // 核销记录
            MallOrderDetailGroupSpecLog mallOrderDetailGroupSpecLog = BeanUtil.copyProperties(orderDetailGroupSpec, MallOrderDetailGroupSpecLog.class);
            mallOrderDetailGroupSpecLog.setId(null);
            mallOrderDetailGroupSpecLog.setGroupSpecUse(body.getUseNum());
            mallOrderDetailGroupSpecLog.setIsUse(1);
            mallOrderDetailGroupSpecLog.insert();
            int notUseCount = mallOrderDetailGroupSpecService.count(
                    Wrappers.<MallOrderDetailGroupSpec>query().lambda()
                            .eq(MallOrderDetailGroupSpec::getOrderDetailNo, body.getOrderDetailNo())
                            .eq(MallOrderDetailGroupSpec::getSkuId, orderDetailGroupSpec.getSkuId())
                            .eq(MallOrderDetailGroupSpec::getIsUse, 0)
            );
            if (notUseCount == 0) {
                // 已全部核销,可以保存核销记录
                isSaveUse = true;
                // 重新定义核销数量
                body.setUseNum(orderDetailGroupSpec.getSkuNum());
                useNumber = body.getUseNum();
            }
        } else {
            // 普通商品直接保存记录
            isSaveUse = true;
            useNumber = orderDetail.getUseNum() + body.getUseNum();
            if (useNumber > orderDetail.getGoodsNum()) {
                throw new IllegalArgumentException("核销信息错误请检查");
            }
        }
        if (isSaveUse) {
            // 添加核销记录
            MallOrderDetailUse detailUse = new MallOrderDetailUse();
            BeanUtils.copyProperties(orderDetail, detailUse);
            detailUse.setId(null);
            detailUse.setUseNum(body.getUseNum());
            detailUse.setUseTime(new Date());
            mallOrderDetailUseService.save(detailUse);
        }
        //添加核销时间
        MallOrderDetail updateOrder = new MallOrderDetail();
        updateOrder.setUseNum(useNumber);
        updateOrder.setUseTime(new Date());
        UpdateWrapper<MallOrderDetail> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("order_detail_no", orderDetail.getOrderDetailNo());
        orderDetailService.update(updateOrder, updateWrapper);
        LambdaQueryWrapper<MallOrderDetail> orderWrapper = new LambdaQueryWrapper<>();
        orderWrapper.eq(MallOrderDetail::getOrderNo, body.getOrderNo());
        orderWrapper.last("and use_num <> goods_num");
        List<MallOrderDetail> detailList = orderDetailService.list(orderWrapper);
        if (detailList.size() == 0) {
            //修改订单状态
            MallOrder mallOrder = new MallOrder();
            mallOrder.setState(EnumMallOrderState.SUCCESS.index);
            mallOrder.setOrderNo(orderDetail.getOrderNo());
            this.updateById(mallOrder);
            // 核销订单-分佣
            mallCommissionSettlementService.commissionSettlement(mallOrder.getOrderNo());
        } else {
            //修改订单状态
            MallOrder mallOrder = new MallOrder();
            mallOrder.setState(EnumMallOrderState.USE.index);
            mallOrder.setOrderNo(orderDetail.getOrderNo());
            this.updateById(mallOrder);
        }
        //插入预约通知
        if(Objects.nonNull(order.getMerchantId())){
            noticeMapper.addMerchantNotice(order.getMerchantId(),2,"您有新的核销订单");
        }
        return Boolean.TRUE;
    }
}