From c23f48c5ec15476299edadd91fa18f908d710a4f Mon Sep 17 00:00:00 2001
From: rentaiming <806181062@qq.com>
Date: 星期四, 18 七月 2024 08:58:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/PaylogServiceImpl.java                     |   44 +++--
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java                      |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java            |   17 ++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsInfoTitleController.java  |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeriesController.java     |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java         |  114 ++++++++------
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java                |    4 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java                         |    2 
 ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java                                            |   10 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsBrandController.java      |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java                   |   65 ++-----
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java              |   17 ++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java               |   70 +++++++-
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java                     |    1 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsCategoryController.java   |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsSkuMapper.java                              |    4 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java                 |   16 ++
 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java                                         |    2 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java                     |    1 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java             |   20 ++
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/StartStatusEnum.java                   |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java                    |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsFlavorTypeController.java |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java                |   17 ++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java                        |    2 
 25 files changed, 287 insertions(+), 135 deletions(-)

diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
index 0147965..ccdde28 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -177,7 +177,7 @@
         //校验手机号码
         SysUser sysUser = userClient.queryUserByUserName(username).getData();
         if (StringUtils.isNull(sysUser)) {
-            return R.fail("用户不存在");
+            return R.fail("账号不存在");
         }
         String code = RandomUtil.randomNumbers(6);
         try {
diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
index 840ba2b..2e9f4b3 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -16,14 +16,12 @@
 import com.ruoyi.system.api.domain.AppMiniLoginVO;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO;
-import com.ruoyi.system.api.domain.dto.AppMiniRegisterDTO;
 import com.ruoyi.system.api.feignClient.AuctionClient;
 import com.ruoyi.system.api.feignClient.MemberClient;
 import com.ruoyi.system.api.model.LoginUser;
+import javax.annotation.Resource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
 
 /**
  * 登录校验方法
@@ -234,11 +232,17 @@
         if (!verificationCodeCache.equals(verificationCode)) {
             throw new ServiceException("验证码错误,请重新输入!");
         }
+        // 校验密码,6位数数字
+        if (!password.matches("^\\d{6}$")) {
+            throw new ServiceException("密码必须为6位数字!");
+        }
         R<LoginUser> userInfo = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
         if (R.FAIL == userInfo.getCode()) {
             throw new ServiceException(userInfo.getMsg());
         }
         remoteUserService.changePassword(username, SecurityUtils.encryptPassword(password),
                 SecurityConstants.INNER);
+        redisService.deleteObject(
+                CacheConstants.CHANGE_PASSWORD_CAPTCHA_CODE_KEY + username);
     }
 }
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/StartStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/StartStatusEnum.java
index 788f6b8..56415ce 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/StartStatusEnum.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/StartStatusEnum.java
@@ -14,7 +14,7 @@
 
     NOT_STARTED(0, "未开始"),
     STARTED(1, "已开始"),
-    ENDED(1, "已结束");
+    ENDED(2, "已结束");
     @EnumValue
     private final int code;
     @JsonValue
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsBrandController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsBrandController.java
index 7d52068..601d9b0 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsBrandController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsBrandController.java
@@ -75,7 +75,7 @@
     public R<Void> deleteGoodsBrand(
             @ApiParam(name = "id", value = "品牌id", required = true) @PathVariable("id") Long id) {
         // 通过ID删除商品品牌
-        goodsBrandService.removeById(id);
+        goodsBrandService.delete(id);
         return R.ok();
     }
     
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsCategoryController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsCategoryController.java
index 9fe54a6..4c2c335 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsCategoryController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsCategoryController.java
@@ -73,7 +73,7 @@
     @DeleteMapping("/{id}")
     public R<Void> deleteGoodsCategory(
             @ApiParam(name = "id", value = "商品分类id", required = true) @Validated @PathVariable("id") Long id) {
-        goodsCategoryService.removeById(id);
+        goodsCategoryService.delete(id);
         return R.ok();
     }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsFlavorTypeController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsFlavorTypeController.java
index d6f667a..d3eaa5e 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsFlavorTypeController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsFlavorTypeController.java
@@ -73,7 +73,7 @@
     @DeleteMapping("/{id}")
     public R<Void> deleteGoodsFlavorType(
             @ApiParam(name = "id", value = "商品香型id", required = true) @PathVariable("id") Long id) {
-        goodsFlavorTypeService.removeById(id);
+        goodsFlavorTypeService.delete(id);
         return R.ok();
     }
 
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsInfoTitleController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsInfoTitleController.java
index ebbb155..9f4b6f9 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsInfoTitleController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsInfoTitleController.java
@@ -73,7 +73,7 @@
     @DeleteMapping("/{id}")
     public R<Void> deleteGoodsInfoTitle(
             @ApiParam(name = "id", value = "商品信息标题id", required = true) @PathVariable("id") Long id) {
-        goodsInfoTitleService.removeById(id);
+        goodsInfoTitleService.delete(id);
         return R.ok();
     }
 
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeriesController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeriesController.java
index f7eb03a..5c95846 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeriesController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeriesController.java
@@ -73,7 +73,7 @@
     @DeleteMapping("/{id}")
     public R<Void> deleteGoodsSeries(
             @ApiParam(name = "id", value = "商品香型id", required = true) @PathVariable("id") Long id) {
-        goodsSeriesService.removeById(id);
+        goodsSeriesService.delete(id);
         return R.ok();
     }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsSkuMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsSkuMapper.java
index ec1dfbd..7434363 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsSkuMapper.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsSkuMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.system.api.domain.GoodsSku;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -14,4 +15,7 @@
 public interface GoodsSkuMapper extends BaseMapper<GoodsSku> {
 
 
+    void addGoodsStock(@Param("id") Long id, @Param("auctionStock") Integer auctionStock);
+
+    void subGoodsStock(@Param("id") Long id, @Param("auctionStock") Integer auctionStock);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java
index bc1784a..3fbcd1c 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java
@@ -42,4 +42,6 @@
      *            如果id不为空,则认为是更新已有品牌,调用updateById方法更新。
      */
     void saveGoodsBrand(GoodsBrandDTO dto);
+
+    void delete(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java
index cdeffcb..799e6dd 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java
@@ -40,4 +40,6 @@
      * @param dto 商品类别数据传输对象,包含商品类别的信息。 如果dto中的id为空,则认为是新纪录,执行保存操作; 如果id不为空,则认为是更新现有纪录。
      */
     void saveGoodsCategory(GoodsCategoryDTO dto);
+
+    void delete(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java
index 7f97010..c345494 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java
@@ -41,4 +41,6 @@
      * @param dto 商品口味类型数据传输对象,包含要保存或更新的信息。 如果dto中的id为空,则认为是新纪录,执行保存操作; 如果id不为空,则认为是更新现有纪录。
      */
     void saveGoodsFlavorType(GoodsFlavorTypeDTO dto);
+
+    void delete(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java
index 493f2f3..b05d1bc 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java
@@ -32,4 +32,5 @@
      */
     void saveGoodsInfoTitle(GoodsInfoTitleDTO dto);
 
+    void delete(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java
index e46b556..373510f 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java
@@ -42,4 +42,6 @@
      * @param dto 商品系列数据传输对象,包含商品系列的详细信息。 如果商品系列ID为空,则视为新记录,进行保存; 如果商品系列ID不为空,则视为更新记录,进行更新。
      */
     void saveGoodsSeries(GoodsSeriesDTO dto);
+
+    void delete(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
index 2dd1b72..2b6135e 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
@@ -1,7 +1,9 @@
 package com.ruoyi.goods.service.impl;
 
+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.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
@@ -9,9 +11,12 @@
 import com.ruoyi.goods.controller.management.dto.GoodsBrandQuery;
 import com.ruoyi.goods.controller.management.vo.GoodsBrandVO;
 import com.ruoyi.goods.mapper.GoodsBrandMapper;
+import com.ruoyi.goods.mapper.GoodsSkuMapper;
 import com.ruoyi.goods.service.IGoodsBrandService;
 import com.ruoyi.system.api.domain.GoodsBrand;
+import com.ruoyi.system.api.domain.GoodsSku;
 import java.util.List;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -23,8 +28,10 @@
  * @since 2024-05-16
  */
 @Service
+@RequiredArgsConstructor
 public class GoodsBrandServiceImpl extends ServiceImpl<GoodsBrandMapper, GoodsBrand> implements IGoodsBrandService {
 
+    private final GoodsSkuMapper goodsSkuMapper;
     /**
      * 获取商品品牌列表。
      * <p>此方法通过调用{@code list()}方法获取原始列表,并使用BeanUtils的{@code copyList}方法将其复制为{@code
@@ -77,4 +84,13 @@
         }
     }
 
+    @Override
+    public void delete(Long id) {
+        Long count = goodsSkuMapper.selectCount(
+                Wrappers.lambdaQuery(GoodsSku.class).eq(GoodsSku::getBrandId, id));
+        if (count > 0) {
+            throw new ServiceException("该品牌已有商品关联,不能删除");
+        }
+        this.removeById(id);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java
index be04a69..c038faf 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java
@@ -1,7 +1,9 @@
 package com.ruoyi.goods.service.impl;
 
+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.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
@@ -9,9 +11,12 @@
 import com.ruoyi.goods.controller.management.dto.GoodsCategoryQuery;
 import com.ruoyi.goods.controller.management.vo.GoodsCategoryVO;
 import com.ruoyi.goods.mapper.GoodsCategoryMapper;
+import com.ruoyi.goods.mapper.GoodsSkuMapper;
 import com.ruoyi.goods.service.IGoodsCategoryService;
 import com.ruoyi.system.api.domain.GoodsCategory;
+import com.ruoyi.system.api.domain.GoodsSku;
 import java.util.List;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -23,8 +28,10 @@
  * @since 2024-05-16
  */
 @Service
+@RequiredArgsConstructor
 public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategory> implements IGoodsCategoryService {
 
+    private final GoodsSkuMapper goodsSkuMapper;
     /**
      * 获取商品类别列表。
      * <p>此方法不接受任何参数,它会调用 {@code list()} 方法获取当前类别列表,并将其转换为 {@code GoodsCategoryVO} 类型的列表后返回。</p>
@@ -70,4 +77,14 @@
             this.updateById(goodsCategory);
         }
     }
+
+    @Override
+    public void delete(Long id) {
+        Long count = goodsSkuMapper.selectCount(
+                Wrappers.lambdaQuery(GoodsSku.class).eq(GoodsSku::getCategoryId, id));
+        if (count > 0) {
+            throw new ServiceException("该分类已有商品关联,不能删除");
+        }
+        this.removeById(id);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java
index f191f59..42389ec 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java
@@ -1,7 +1,9 @@
 package com.ruoyi.goods.service.impl;
 
+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.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
@@ -9,9 +11,12 @@
 import com.ruoyi.goods.controller.management.dto.GoodsFlavorTypeQuery;
 import com.ruoyi.goods.controller.management.vo.GoodsFlavorTypeVO;
 import com.ruoyi.goods.mapper.GoodsFlavorTypeMapper;
+import com.ruoyi.goods.mapper.GoodsSkuMapper;
 import com.ruoyi.goods.service.IGoodsFlavorTypeService;
 import com.ruoyi.system.api.domain.GoodsFlavorType;
+import com.ruoyi.system.api.domain.GoodsSku;
 import java.util.List;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -23,8 +28,10 @@
  * @since 2024-05-16
  */
 @Service
+@RequiredArgsConstructor
 public class GoodsFlavorTypeServiceImpl extends ServiceImpl<GoodsFlavorTypeMapper, GoodsFlavorType> implements IGoodsFlavorTypeService {
 
+    private final GoodsSkuMapper goodsSkuMapper;
     /**
      * 获取商品口味类型的列表。
      * <p>此方法通过调用 {@code list()} 方法获取原始列表,并使用 {@code BeanUtils.copyList} 方法将每个元素转换为
@@ -70,4 +77,14 @@
             this.updateById(goodsFlavorType);
         }
     }
+
+    @Override
+    public void delete(Long id) {
+        Long count = goodsSkuMapper.selectCount(
+                Wrappers.lambdaQuery(GoodsSku.class).eq(GoodsSku::getFlavorTypeId, id));
+        if (count > 0) {
+            throw new ServiceException("该香型已有商品关联,不能删除");
+        }
+        this.removeById(id);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
index 60dacaf..f544f53 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -17,12 +17,12 @@
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
+import com.ruoyi.common.core.utils.page.CollUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.goods.controller.management.dto.GoodsGroupPurchaseDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsGroupPurchaseQuery;
 import com.ruoyi.goods.controller.management.vo.GoodsGroupPurchaseVO;
-import com.ruoyi.system.api.domain.GoodsGroupPurchaseInfo;
 import com.ruoyi.goods.domain.MemberGoodsCollection;
 import com.ruoyi.goods.mapper.GoodsGroupPurchaseMapper;
 import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
@@ -32,9 +32,11 @@
 import com.ruoyi.system.api.constants.DelayTaskEnum;
 import com.ruoyi.system.api.constants.NotificationTypeConstant;
 import com.ruoyi.system.api.domain.GoodsGroupPurchase;
+import com.ruoyi.system.api.domain.GoodsGroupPurchaseInfo;
 import com.ruoyi.system.api.domain.GoodsSku;
 import com.ruoyi.system.api.domain.Order;
 import com.ruoyi.system.api.domain.WebsocketMessageDTO;
+import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
 import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import com.ruoyi.system.api.domain.dto.OrderUpdDTO;
@@ -49,11 +51,10 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
+import javax.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
 
 /**
  * <p>
@@ -108,10 +109,10 @@
             queryWrapper.eq(GoodsGroupPurchase::getGoodsSkuId, dto.getGoodsSkuId());
             queryWrapper.eq(GoodsGroupPurchase::getListingStatus,
                     ListingStatusEnum.ON_SHELVES.getCode());
-            queryWrapper.between(GoodsGroupPurchase::getStartTime, dto.getStartTime(),
-                    dto.getEndTime());
-            List<GoodsGroupPurchase> list = this.list(queryWrapper);
-            if (StringUtils.isNotEmpty(list)) {
+            queryWrapper.le(GoodsGroupPurchase::getStartTime, dto.getStartTime());
+            queryWrapper.ge(GoodsGroupPurchase::getEndTime, dto.getEndTime());
+            long count = this.count(queryWrapper);
+            if (count > 0) {
                 throw new ServiceException("添加失败,当前商品在该时间段内有其他团购活动");
             }
             this.save(goodsGroupPurchase);
@@ -120,10 +121,14 @@
                 throw new ServiceException("商品不存在");
             }
             int groupPurchaseStock = dto.getLimitNumber() * dto.getGroupSize();
-            goodsSkuService.lambdaUpdate()
-                    .set(GoodsSku::getStock, goodsSku.getStock() - groupPurchaseStock)
-                    .ge(GoodsSku::getStock, groupPurchaseStock)
-                    .eq(GoodsSku::getId, goodsSku.getId());
+            if (goodsSku.getStock() < groupPurchaseStock) {
+                throw new ServiceException(String.format("团购商品【%s】剩余库存不足,请修改团购库存",
+                        goodsSku.getSkuName()));
+            }
+            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
+            goodsStockUpdDTO.setAuctionStock(groupPurchaseStock * -1);
+            goodsStockUpdDTO.setGoodsSkuId(goodsSku.getId());
+            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
         } else {
             GoodsGroupPurchase groupPurchase = this.getById(dto.getId());
             if (StringUtils.isNull(groupPurchase)) {
@@ -142,12 +147,17 @@
             }
             int groupPurchaseStock = dto.getLimitNumber() * dto.getGroupSize();
             int latestStock = originGroupStock - groupPurchaseStock;
-            goodsSkuService.lambdaUpdate()
-                    .set(GoodsSku::getStock,
-                            goodsSku.getStock() + latestStock)
-                    .ge(GoodsSku::getStock, latestStock)
-                    .eq(GoodsSku::getId, goodsSku.getId());
+            if (goodsSku.getStock() < latestStock) {
+                throw new ServiceException(String.format("团购商品%s剩余库存不足,请修改团购库存",
+                        goodsSku.getSkuName()));
+            }
+            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
+            goodsStockUpdDTO.setAuctionStock(latestStock);
+            goodsStockUpdDTO.setGoodsSkuId(goodsSku.getId());
+            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
             this.updateById(goodsGroupPurchase);
+        }
+        if (goodsGroupPurchase.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) {
             asyncMethodService.groupPurchaseScheduleTask(Lists.newArrayList(goodsGroupPurchase));
         }
     }
@@ -197,7 +207,14 @@
         }
         //修改状态
         groupPurchase.setListingStatus(dto.getListingStatus());
+        groupPurchase.setStartStatus(StartStatusEnum.ENDED);
+        if (!groupPurchase.getGroupStatus().equals(GroupStatusEnum.FORMED_INTO_A_GROUP)) {
+            groupPurchase.setGroupStatus(GroupStatusEnum.GROUP_FAILURE);
+        }
         this.updateById(groupPurchase);
+        if (dto.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) {
+            asyncMethodService.groupPurchaseScheduleTask(Lists.newArrayList(groupPurchase));
+        }
     }
 
     /**
@@ -268,42 +285,43 @@
             //查询关联订单
             List<Order> orderList = orderClient.getOrderByGroupPurchaseId(id,
                     SecurityConstants.INNER).getData();
+            if (CollUtils.isNotEmpty(orderList)) {
 
-            List<RefundDTO> refundDTOList = orderList.stream().map(order -> {
-                RefundDTO refundDTO = new RefundDTO();
-                refundDTO.setOrderNo(order.getOrderNo());
-                refundDTO.setAmount(order.getTotalAmount());
-                return refundDTO;
-            }).collect(Collectors.toList());
-            Map<String, Object> data = orderClient.refund(refundDTOList,
-                    SecurityConstants.INNER).getData();
-            if (StringUtils.isNotEmpty(data)) {
-                // 处理退款返回结果
-                List<String> successfulOrders = new ArrayList<>();
-                List<String> failedOrders = new ArrayList<>();
+                List<RefundDTO> refundDTOList = orderList.stream().map(order -> {
+                    RefundDTO refundDTO = new RefundDTO();
+                    refundDTO.setOrderNo(order.getOrderNo());
+                    refundDTO.setAmount(order.getTotalAmount());
+                    return refundDTO;
+                }).collect(Collectors.toList());
+                Map<String, Object> data = orderClient.refund(refundDTOList,
+                        SecurityConstants.INNER).getData();
+                if (StringUtils.isNotEmpty(data)) {
+                    // 处理退款返回结果
+                    List<String> successfulOrders = new ArrayList<>();
+                    List<String> failedOrders = new ArrayList<>();
 
-                data.forEach((key, value) -> {
-                    if ((boolean) value) {
-                        successfulOrders.add(key);
-                    } else {
-                        failedOrders.add(key);
-                    }
-                });
-                // 处理退款结果
-                List<Order> updateOrderList = orderList.stream()
-                        .filter(order -> successfulOrders.contains(order.getOrderNo()))
-                        .peek(order -> {
-                            order.setOrderStatus(OrderStatusEnum.CANCELED);
-                        }).collect(Collectors.toList());
-                List<OrderUpdDTO> orderUpdDTOS = BeanUtils.copyList(updateOrderList,
-                        OrderUpdDTO.class);
-                orderClient.updateOrderList(orderUpdDTOS, SecurityConstants.INNER);
+                    data.forEach((key, value) -> {
+                        if ((boolean) value) {
+                            successfulOrders.add(key);
+                        } else {
+                            failedOrders.add(key);
+                        }
+                    });
+                    // 处理退款结果
+                    List<Order> updateOrderList = orderList.stream()
+                            .filter(order -> successfulOrders.contains(order.getOrderNo()))
+                            .peek(order -> {
+                                order.setOrderStatus(OrderStatusEnum.CANCELED);
+                            }).collect(Collectors.toList());
+                    List<OrderUpdDTO> orderUpdDTOS = BeanUtils.copyList(updateOrderList,
+                            OrderUpdDTO.class);
+                    orderClient.updateOrderList(orderUpdDTOS, SecurityConstants.INNER);
+                }
             }
-        } else {
-            this.lambdaUpdate()
-                    .set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.ENDED)
-                    .eq(GoodsGroupPurchase::getId, id).update();
+            groupPurchase.setGroupStatus(GroupStatusEnum.GROUP_FAILURE);
         }
+        groupPurchase.setStartStatus(StartStatusEnum.ENDED);
+        this.updateById(groupPurchase);
     }
 
     @Override
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java
index 5399efa..6dc1706 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java
@@ -1,7 +1,9 @@
 package com.ruoyi.goods.service.impl;
 
+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.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
@@ -9,8 +11,12 @@
 import com.ruoyi.goods.controller.management.dto.GoodsInfoTitleQuery;
 import com.ruoyi.goods.controller.management.vo.GoodsInfoTitleVO;
 import com.ruoyi.goods.domain.GoodsInfoTitle;
+import com.ruoyi.goods.domain.GoodsInfoTitleValue;
 import com.ruoyi.goods.mapper.GoodsInfoTitleMapper;
+import com.ruoyi.goods.mapper.GoodsInfoTitleValueMapper;
+import com.ruoyi.goods.mapper.GoodsSkuMapper;
 import com.ruoyi.goods.service.IGoodsInfoTitleService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -22,8 +28,11 @@
  * @since 2024-05-16
  */
 @Service
+@RequiredArgsConstructor
 public class GoodsInfoTitleServiceImpl extends ServiceImpl<GoodsInfoTitleMapper, GoodsInfoTitle> implements IGoodsInfoTitleService {
 
+    private final GoodsSkuMapper goodsSkuMapper;
+    private final GoodsInfoTitleValueMapper goodsInfoTitleValueMapper;
     /**
      * 获取商品信息标题的分页数据。
      *
@@ -61,4 +70,15 @@
             this.updateById(goodsInfoTitle); // 更新现有纪录
         }
     }
+
+    @Override
+    public void delete(Long id) {
+        Long count = goodsInfoTitleValueMapper.selectCount(
+                Wrappers.lambdaQuery(GoodsInfoTitleValue.class)
+                        .eq(GoodsInfoTitleValue::getGoodsInfoTitleId, id));
+        if (count > 0) {
+            throw new ServiceException("该商品信息标题已有商品关联,不能删除");
+        }
+        this.removeById(id);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
index e061b5c..71dc751 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -39,6 +39,7 @@
 import com.ruoyi.system.api.domain.GoodsSeries;
 import com.ruoyi.system.api.domain.GoodsSku;
 import com.ruoyi.system.api.domain.WebsocketMessageDTO;
+import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
 import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import com.ruoyi.system.api.domain.vo.HomeGoodsSeckillInfoVO;
@@ -52,6 +53,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -102,6 +104,30 @@
             goodsSeckill.setEndTime(dto.getEndTime());
             goodsSeckill.setStartStatus(StartStatusEnum.NOT_STARTED);
         }
+        // 查询该时间范围内,是否已经存在该秒杀商品
+        List<GoodsSeckill> list = this.lambdaQuery()
+                .ne(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED)
+                .eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES)
+                .le(GoodsSeckill::getStartTime, dto.getStartTime())
+                .ge(GoodsSeckill::getEndTime, dto.getEndTime()).list();
+        Set<Long> existGoodsSkuIdSet = list.stream().map(GoodsSeckill::getGoodsSkuId)
+                .collect(Collectors.toSet());
+        if (!existGoodsSkuIdSet.isEmpty()) {
+            List<GoodsSku> goodsSkuList = goodsSkuService.listByIds(existGoodsSkuIdSet);
+            Map<Long, String> goodsSkuMap = goodsSkuList.stream()
+                    .collect(Collectors.toMap(GoodsSku::getId, GoodsSku::getSkuName));
+            List<GoodsSeckill> collect = goodsSeckills.stream()
+                    .filter(goodsSeckill -> existGoodsSkuIdSet.contains(
+                            goodsSeckill.getGoodsSkuId()))
+                    .collect(Collectors.toList());
+            if (!collect.isEmpty()) {
+                String goodsSkuNames = collect.stream().map(item -> {
+                            return goodsSkuMap.get(item.getGoodsSkuId());
+                        }).filter(Objects::nonNull)
+                        .collect(Collectors.joining(","));
+                throw new ServiceException("添加失败,当前商品在该时间段内有其他秒杀活动");
+            }
+        }
         this.saveBatch(goodsSeckills);
 
         for (GoodsSeckill goodsSeckill : goodsSeckills) {
@@ -109,11 +135,17 @@
             if (StringUtils.isNull(goodsSku)) {
                 throw new ServiceException("商品不存在");
             }
+
             Integer seckillStock = goodsSeckill.getSeckillStock();
-            goodsSkuService.lambdaUpdate()
-                    .set(GoodsSku::getStock, goodsSku.getStock() - seckillStock)
-                    .ge(GoodsSku::getStock, seckillStock)
-                    .eq(GoodsSku::getId, goodsSku.getId());
+            if (goodsSku.getStock() < seckillStock) {
+                throw new ServiceException(
+                        String.format("秒杀商品%s剩余库存不足,请修改秒杀库存",
+                                goodsSku.getSkuName()));
+            }
+            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
+            goodsStockUpdDTO.setAuctionStock(seckillStock * -1);
+            goodsStockUpdDTO.setGoodsSkuId(goodsSku.getId());
+            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
             asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill));
         }
     }
@@ -145,12 +177,23 @@
         if (StringUtils.isNull(goodsSeckill)) {
             throw new ServiceException("秒杀商品不存在");
         }
-        if (goodsSeckill.getStartStatus().equals(StartStatusEnum.STARTED)) {
+        if (goodsSeckill.getStartStatus().equals(StartStatusEnum.STARTED)
+                && goodsSeckill.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) {
             throw new ServiceException("秒杀商品已开始秒杀,不能修改");
+        }
+        GoodsSku goodsSku = goodsSkuService.getById(goodsSeckill.getGoodsSkuId());
+        if (goodsSku.getStock() < upd.getSeckillStock()) {
+            throw new ServiceException("编辑失败,商品库存不足");
         }
         GoodsSeckill goodsSeckillUpd = BeanUtils.copyBean(upd, GoodsSeckill.class);
         this.updateById(goodsSeckillUpd);
-        asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill));
+        GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
+        goodsStockUpdDTO.setAuctionStock(upd.getSeckillStock() * -1);
+        goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId());
+        goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
+        if (goodsSeckill.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) {
+            asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill));
+        }
     }
 
     /**
@@ -164,16 +207,23 @@
         if (StringUtils.isNull(goodsSeckill)) {
             throw new ServiceException("秒杀商品不存在");
         }
-        this.lambdaUpdate()
-                .eq(GoodsSeckill::getId, dto.getId())
-                .set(GoodsSeckill::getListingStatus, dto.getListingStatus())
-                .update();
+        goodsSeckill.setListingStatus(dto.getListingStatus());
         if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)) {
             //移除该秒杀商品的延时任务
             redisService.deleteObject(
                     DelayTaskEnum.SECKILL_START_TASK.getCode() + "-" + goodsSeckill.getId());
             redisService.deleteObject(
                     DelayTaskEnum.SECKILL_END_TASK.getCode() + "-" + goodsSeckill.getId());
+            // 退回剩余库存
+            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
+            goodsStockUpdDTO.setAuctionStock(goodsSeckill.getSeckillStock() * -1);
+            goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId());
+            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
+            goodsSeckill.setSeckillStock(0);
+        }
+        this.updateById(goodsSeckill);
+        if (dto.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) {
+            asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill));
         }
     }
 
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java
index 6684581..f52f23d 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java
@@ -1,7 +1,9 @@
 package com.ruoyi.goods.service.impl;
 
+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.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
@@ -9,9 +11,12 @@
 import com.ruoyi.goods.controller.management.dto.GoodsSeriesQuery;
 import com.ruoyi.goods.controller.management.vo.GoodsSeriesVO;
 import com.ruoyi.goods.mapper.GoodsSeriesMapper;
+import com.ruoyi.goods.mapper.GoodsSkuMapper;
 import com.ruoyi.goods.service.IGoodsSeriesService;
 import com.ruoyi.system.api.domain.GoodsSeries;
+import com.ruoyi.system.api.domain.GoodsSku;
 import java.util.List;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -23,8 +28,10 @@
  * @since 2024-05-16
  */
 @Service
+@RequiredArgsConstructor
 public class GoodsSeriesServiceImpl extends ServiceImpl<GoodsSeriesMapper, GoodsSeries> implements IGoodsSeriesService {
 
+    private final GoodsSkuMapper goodsSkuMapper;
     /**
      * 获取商品系列列表的视图对象。
      *
@@ -72,4 +79,14 @@
             this.updateById(goodsSeries);
         }
     }
+
+    @Override
+    public void delete(Long id) {
+        Long count = goodsSkuMapper.selectCount(
+                Wrappers.lambdaQuery(GoodsSku.class).eq(GoodsSku::getSeriesId, id));
+        if (count > 0) {
+            throw new ServiceException("该分类已有商品关联,不能删除");
+        }
+        this.removeById(id);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
index 2b9c673..96eefd7 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -52,10 +52,8 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -202,7 +200,8 @@
                 ), GoodsSku::getListingStatus, query.getListingStatus())
                 .eq(query.getQueryType().equals(1), GoodsSku::getListingStatus,
                         ListingStatusEnum.ON_SHELVES)
-                .orderByDesc(GoodsSku::getSortNum)
+                .gt(query.getQueryType().equals(2), GoodsSku::getStock, 0)
+                .orderByDesc(GoodsSku::getCreateTime)
                 .page(new Page<>(query.getPageCurr(), query.getPageSize()));
         return PageDTO.of(page, GoodsSkuVO.class);
     }
@@ -271,41 +270,9 @@
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void updGoodsStock(List<GoodsStockUpdDTO> goodsStockUpdDTOS) {
         log.info("开始批量更新商品库存");
-        List<Long> goodsSkuIdList = goodsStockUpdDTOS.stream()
-                .map(GoodsStockUpdDTO::getGoodsSkuId)
-                .collect(Collectors.toList());
-        List<GoodsSku> goodsSkus = this.listByIds(goodsSkuIdList);
-
-        if (StringUtils.isEmpty(goodsSkus)) {
-            throw new ServiceException("商品不存在");
-        }
-        Map<Long, Integer> stockMap = goodsStockUpdDTOS.stream()
-                .collect(Collectors.toMap(GoodsStockUpdDTO::getGoodsSkuId,
-                        GoodsStockUpdDTO::getAuctionStock));
-        for (GoodsSku skus : goodsSkus) {
-            String goodsLock = "goods_lock:" + skus.getId();
-            RLock redissonLock = redissonClient.getLock(goodsLock);
-            try {
-                redissonLock.lock(30, TimeUnit.SECONDS);
-                Integer auctionStock = stockMap.get(skus.getId());
-                if (StringUtils.isNotNull(auctionStock)) {
-                    // 更新商品库存,更新五次失败抛出异常
-                    boolean isUpdated = false;
-                    for (int i = 0; i < 5; i++) {
-                        isUpdated = updateGoodsStock(skus, auctionStock);
-                        if (isUpdated) {
-                            break;
-                        } else {
-                            skus = this.getById(skus.getId());
-                        }
-                    }
-                    if (!isUpdated) {
-                        throw new ServiceException("商品库存回退失败");
-                    }
-                }
-            } finally {
-                redissonLock.unlock();
-            }
+        for (GoodsStockUpdDTO goodsStockUpdDTO : goodsStockUpdDTOS) {
+            updateGoodsStock(goodsStockUpdDTO.getGoodsSkuId(),
+                    goodsStockUpdDTO.getAuctionStock());
         }
         log.info("批量更新商品库存结束");
     }
@@ -625,13 +592,21 @@
         return homeGoodsSkuXxiVOS;
     }
 
-    private boolean updateGoodsStock(GoodsSku skus, Integer auctionStock) {
-        return this.lambdaUpdate()
-                .set(skus.getStock() + auctionStock > 0, GoodsSku::getStock,
-                        skus.getStock() + auctionStock)
-                .eq(GoodsSku::getId, skus.getId())
-                .eq(GoodsSku::getStock, skus.getStock())
-                .update();
+    private void updateGoodsStock(Long goodsSkuId, Integer auctionStock) {
+        String goodsLock = "goods_lock:" + goodsSkuId;
+        RLock redissonLock = redissonClient.getLock(goodsLock);
+        try {
+            redissonLock.lock(30, TimeUnit.SECONDS);
+            // 加库存
+            if (auctionStock > 0) {
+                this.baseMapper.addGoodsStock(goodsSkuId, auctionStock);
+            } else {
+                // 减库存
+                this.baseMapper.subGoodsStock(goodsSkuId, auctionStock * -1);
+            }
+        } finally {
+            redissonLock.unlock();
+        }
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java
index a28e3fb..90d2b31 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java
@@ -111,12 +111,12 @@
         long auctionOrderTotalCount = orderList.stream()
                 .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS))
                 .count();
-        // 商城订单统计-订单总数
+        // 拍卖订单统计-拍卖商品订单
         long auctionGoodsOrderCount = orderList.stream()
                 .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)
                         && order.getAuctionOrderType().equals(AuctionOrderTypeEnum.REGULAR_ITEMS))
                 .count();
-        // 拍卖订单统计-拍卖商品订单
+        // 拍卖订单统计-拍卖场订单
         long auctionSalesroomOrderCount = orderList.stream()
                 .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)
                         && order.getAuctionOrderType().equals(AuctionOrderTypeEnum.AUCTION_ITEMS))
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/PaylogServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/PaylogServiceImpl.java
index a5c6bde..0e64e66 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/PaylogServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/PaylogServiceImpl.java
@@ -1,8 +1,5 @@
 package com.ruoyi.order.service.impl;
 
-import static com.ruoyi.order.util.tencent.WXPay.requestRefundService;
-import static com.ruoyi.order.util.tencent.WXPay.requestUnifiedorderService;
-
 import com.alipay.api.AlipayClient;
 import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.request.AlipayTradeRefundRequest;
@@ -18,37 +15,46 @@
 import com.ruoyi.common.core.enums.OrderStatusEnum;
 import com.ruoyi.common.core.enums.PaymentMethodEnum;
 import com.ruoyi.common.core.enums.PointStatusEnum;
-import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.order.domain.Paylog;
 import com.ruoyi.order.mapper.OrderAuctionBondMapper;
 import com.ruoyi.order.mapper.OrderMapper;
 import com.ruoyi.order.mapper.PaylogMapper;
-import com.ruoyi.order.service.IOrderAuctionBondService;
 import com.ruoyi.order.service.IPaylogService;
 import com.ruoyi.order.util.MD5AndKL;
 import com.ruoyi.order.util.SinataUtil;
 import com.ruoyi.order.util.alipay.config.AlipayConfig;
 import com.ruoyi.order.util.alipay.util.PayDemoActivity;
 import com.ruoyi.order.util.tencent.common.Configure;
-import com.ruoyi.order.util.tencent.common.Signature;
 import com.ruoyi.order.util.tencent.common.XMLParser;
-import com.ruoyi.order.util.tencent.protocol.AppPayReqData;
-import com.ruoyi.order.util.tencent.protocol.UnifiedorderReqData;
-import com.ruoyi.system.api.domain.*;
-import com.ruoyi.system.api.domain.dto.BondDTO;
+import com.ruoyi.system.api.domain.GoodsGroupPurchase;
+import com.ruoyi.system.api.domain.GoodsGroupPurchaseInfo;
+import com.ruoyi.system.api.domain.GoodsSku;
+import com.ruoyi.system.api.domain.Order;
+import com.ruoyi.system.api.domain.OrderAuctionBond;
 import com.ruoyi.system.api.domain.dto.MemberPointsDTO;
 import com.ruoyi.system.api.domain.dto.RefundDTO;
 import com.ruoyi.system.api.domain.dto.updMembeOneDTO;
 import com.ruoyi.system.api.feignClient.AuctionClient;
 import com.ruoyi.system.api.feignClient.GoodsSkuClient;
 import com.ruoyi.system.api.feignClient.MemberClient;
-
-import java.io.*;
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.UUID;
 import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -56,10 +62,7 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-
-import com.ruoyi.system.api.feignClient.OrderClient;
 import org.springframework.stereotype.Service;
-import org.springframework.util.Assert;
 
 /**
  * <p>
@@ -760,6 +763,7 @@
             List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
             // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
             Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
+                @Override
                 public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
                     return (o1.getKey()).toString().compareTo(o2.getKey());
                 }
@@ -952,7 +956,7 @@
         boolean res = false;
         if (StringUtils.isNotNull(paylog)) {
             if (paylog.getPayType() == 1) {
-                res = this.refundForAlipay(paylog.getOutTradeNo(),
+                res = refundForAlipay(paylog.getOutTradeNo(),
                         paylog.getTradeNo(), amount.doubleValue());
             }
             if (paylog.getPayType() == 2) {
@@ -963,9 +967,9 @@
                 String money = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100d);
                 Integer totalFee = Integer.parseInt(
                         money.substring(0, money.length() - 3));
-                res = this.refundForWxpay(2, paylog.getTradeNo(),
+                res = refundForWxpay(1, paylog.getTradeNo(),
                         paylog.getOutTradeNo(), orderNo, totalFee,
-                        refundFee, "4");
+                        refundFee, "2");
             }
         }
         return res;
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
index 2fb3073..3701850 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -544,6 +544,7 @@
     public R<SysUser> queryUserByUserName(@RequestBody String userName){
         SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                 .eq(SysUser::getUserName, userName)
+                .eq(SysUser::getDelFlag, "0")
                 .last("LIMIT 1"));
         return R.ok(user);
     }

--
Gitblit v1.7.1