rentaiming
2024-07-18 c23f48c5ec15476299edadd91fa18f908d710a4f
Merge remote-tracking branch 'origin/master'
25个文件已修改
364 ■■■■ 已修改文件
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/StartStatusEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsBrandController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsCategoryController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsFlavorTypeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsInfoTitleController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeriesController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsSkuMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/PaylogServiceImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 {
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);
    }
}
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
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();
    }
    
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();
    }
}
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();
    }
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();
    }
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();
    }
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
    }
}
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);
    }
}
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);
    }
}
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,6 +285,7 @@
            //查询关联订单
            List<Order> orderList = orderClient.getOrderByGroupPurchaseId(id,
                    SecurityConstants.INNER).getData();
            if (CollUtils.isNotEmpty(orderList)) {
            List<RefundDTO> refundDTOList = orderList.stream().map(order -> {
                RefundDTO refundDTO = new RefundDTO();
@@ -299,11 +317,11 @@
                        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
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);
    }
}
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);
        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));
        }
    }
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);
    }
}
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();
        }
    }
    /**
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))
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;
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);
    }