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