From e14a6debcb17348164f703fcb2a7b9b1c3608352 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 02 二月 2024 10:19:32 +0800
Subject: [PATCH] 提交版本

---
 meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java |  186 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 180 insertions(+), 6 deletions(-)

diff --git a/meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java b/meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java
index 6c7dc94..882d75f 100644
--- a/meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java
+++ b/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()));
@@ -235,6 +270,24 @@
                                 // 销售价
                                 sellCost = skuVo.getPriceMerchant();
                             }
+
+                            // 查询套餐规格组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 +295,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 +596,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;
+    }
+
+
 }

--
Gitblit v1.7.1