diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ElasticSearchController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ElasticSearchController.java index 9e63c8529..4084bfbf6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ElasticSearchController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ElasticSearchController.java @@ -27,7 +27,7 @@ public class ElasticSearchController extends XktBaseController { final IElasticSearchService esService; - @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @PreAuthorize("@ss.hasAnyRoles('admin')") @Log(title = "ES批量新增数据", businessType = BusinessType.INSERT) @PutMapping("/batch-create") public R batchCreate(@RequestParam(required = false) Long storeId) { @@ -35,7 +35,7 @@ public class ElasticSearchController extends XktBaseController { return R.ok(); } - @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @PreAuthorize("@ss.hasAnyRoles('admin')") @Log(title = "ES批量新增数据(特定商品)", businessType = BusinessType.INSERT) @PutMapping("/prod/batch-create") public R batchCreateProd(@Validated @RequestBody EsProdBatchCreateVO createVO) { @@ -43,7 +43,7 @@ public class ElasticSearchController extends XktBaseController { return R.ok(); } - @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @PreAuthorize("@ss.hasAnyRoles('admin')") @Log(title = "ES批量删除数据", businessType = BusinessType.DELETE) @DeleteMapping("/batch-delete") public R batchDelete(@RequestParam(required = false) Long storeId) { @@ -51,7 +51,7 @@ public class ElasticSearchController extends XktBaseController { return R.ok(); } - @PreAuthorize("@ss.hasAnyRoles('admin,general_admin')") + @PreAuthorize("@ss.hasAnyRoles('admin')") @Log(title = "ES批量删除数据(特定商品)", businessType = BusinessType.DELETE) @DeleteMapping("/prod/batch-delete") public R batchDeleteProd(@Validated @RequestBody EsProdBatchDeleteVO deleteVO) { diff --git a/ruoyi-admin/src/main/resources/application-local.yml b/ruoyi-admin/src/main/resources/application-local.yml index 1ba82219f..f69735042 100644 --- a/ruoyi-admin/src/main/resources/application-local.yml +++ b/ruoyi-admin/src/main/resources/application-local.yml @@ -117,7 +117,7 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://127.0.0.1:3306/xiekutong?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://127.0.0.1:3306/cdbuju?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root # password: xvV@1WaZbkjSJjRO password: 123456 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index 10b381116..937e181ff 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -90,6 +90,11 @@ public class CacheConstants { */ public static final String STORE_KEY = "store:"; + /** + * 正在生效的档口列表 + */ + public static final String STORE_LIST_KEY = "store_list"; + /** * 推广购买截止时间 */ diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java index 636cbefb9..8ae76eb49 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java @@ -183,9 +183,10 @@ public class XktTask { if (CollectionUtils.isEmpty(storeList)) { return; } - storeList.forEach(store -> { - redisCache.setCacheObject(CacheConstants.STORE_KEY + store.getId(), store); - }); + // 单个档口到redis中 + storeList.forEach(store -> redisCache.setCacheObject(CacheConstants.STORE_KEY + store.getId(), store)); + // 所有正在生效的档口 + redisCache.setCacheObject(CacheConstants.STORE_LIST_KEY, storeList.stream().map(Store::getId).map(String::valueOf).collect(Collectors.toList())); } /** diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductMapper.java index 6cf59864d..2ba8e910e 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductMapper.java @@ -3,6 +3,7 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.StoreProduct; import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; +import com.ruoyi.xkt.dto.picture.ProductMatchDTO; import com.ruoyi.xkt.dto.storeHomepage.StoreRecommendResDTO; import com.ruoyi.xkt.dto.storeProduct.*; import org.apache.ibatis.annotations.Param; @@ -139,5 +140,13 @@ public interface StoreProductMapper extends BaseMapper { */ StoreProdPcDownloadInfoResDTO selectDownloadProdInfo(@Param("storeProdId") Long storeProdId); + /** + * 过滤掉无效的档口商品 + * + * @param storeProdIdList 档口商品ID列表 + * @return List + */ + List filterInvalidStoreProd(@Param("storeProdIdList") List storeProdIdList); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ElasticSearchServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ElasticSearchServiceImpl.java index f672ff335..300048942 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ElasticSearchServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ElasticSearchServiceImpl.java @@ -9,11 +9,14 @@ import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.bulk.BulkOperation; import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.page.Page; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.es.EsClientWrapper; import com.ruoyi.framework.notice.fs.FsNotice; import com.ruoyi.xkt.domain.Store; @@ -65,6 +68,7 @@ public class ElasticSearchServiceImpl implements IElasticSearchService { final EsClientWrapper esClientWrapper; final StoreProductFileMapper prodFileMapper; final FsNotice fsNotice; + final RedisCache redisCache; @Value("${es.indexName}") private String ES_INDEX_NAME; @@ -77,6 +81,10 @@ public class ElasticSearchServiceImpl implements IElasticSearchService { @Override @Transactional public void batchCreate(Long storeId) { + // 用户是否为超级管理员 + if (!SecurityUtils.isSuperAdmin()) { + throw new ServiceException("当前用户非超级管理员,无权限操作!", HttpStatus.ERROR); + } LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(StoreProduct::getDelFlag, Constants.UNDELETED); if (ObjectUtils.isNotEmpty(storeId)) { @@ -99,6 +107,10 @@ public class ElasticSearchServiceImpl implements IElasticSearchService { @Override @Transactional public void batchCreateProd(EsProdBatchCreateDTO createProdDTO) { + // 用户是否为超级管理员 + if (!SecurityUtils.isSuperAdmin()) { + throw new ServiceException("当前用户非超级管理员,无权限操作!", HttpStatus.ERROR); + } LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(StoreProduct::getDelFlag, Constants.UNDELETED).eq(StoreProduct::getStoreId, createProdDTO.getStoreId()) .in(StoreProduct::getId, createProdDTO.getStoreProdIdList()); @@ -119,6 +131,10 @@ public class ElasticSearchServiceImpl implements IElasticSearchService { @Override @Transactional public void batchDelete(Long storeId) { + // 用户是否为超级管理员 + if (!SecurityUtils.isSuperAdmin()) { + throw new ServiceException("当前用户非超级管理员,无权限操作!", HttpStatus.ERROR); + } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(StoreProduct::getDelFlag, Constants.UNDELETED); if (ObjectUtils.isNotEmpty(storeId)) { @@ -141,6 +157,10 @@ public class ElasticSearchServiceImpl implements IElasticSearchService { @Override @Transactional public void batchDeleteProd(EsProdBatchDeleteDTO deleteDTO) { + // 用户是否为超级管理员 + if (!SecurityUtils.isSuperAdmin()) { + throw new ServiceException("当前用户非超级管理员,无权限操作!", HttpStatus.ERROR); + } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(StoreProduct::getDelFlag, Constants.UNDELETED).eq(StoreProduct::getStoreId, deleteDTO.getStoreId()) .in(StoreProduct::getId, deleteDTO.getStoreProdIdList()); @@ -197,15 +217,30 @@ public class ElasticSearchServiceImpl implements IElasticSearchService { // 将搜索条件添加到主查询 boolQueryBuilder.must(searchBoolQuery.build()._toQuery()); } - // 档口ID 过滤条件 + + // 处理逻辑 获取所有可用的档口,如果该档口是停用状态,则不返回该档口的任何数据 + List existStoreIdList = this.redisCache.getCacheObject(CacheConstants.STORE_LIST_KEY); + List effectiveStoreIds = null; if (CollectionUtils.isNotEmpty(searchDTO.getStoreIdList())) { + // 如果查询条件中有指定档口,则过滤掉不在existStoreIdList中的档口 + effectiveStoreIds = CollectionUtils.isEmpty(existStoreIdList) ? searchDTO.getStoreIdList() + : searchDTO.getStoreIdList().stream().filter(existStoreIdList::contains).collect(Collectors.toList()); + } else { + // 如果查询条件中没有指定档口,则使用所有可用档口 + if (CollectionUtils.isNotEmpty(existStoreIdList)) { + effectiveStoreIds = new ArrayList<>(existStoreIdList); + } + } + // 档口ID 过滤条件 + if (CollectionUtils.isNotEmpty(effectiveStoreIds)) { TermsQueryField termsQueryField = new TermsQueryField.Builder() - .value(searchDTO.getStoreIdList().stream() + .value(effectiveStoreIds.stream() .map(FieldValue::of) .collect(Collectors.toList())) .build(); boolQueryBuilder.filter(f -> f.terms(t -> t.field("storeId").terms(termsQueryField))); } + // 添加prodStatus 过滤条件 if (CollectionUtils.isNotEmpty(searchDTO.getProdStatusList())) { TermsQueryField termsQueryField = new TermsQueryField.Builder() diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java index 5ffe4b1f7..1245c1ca9 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java @@ -97,8 +97,18 @@ public class PictureSearchServiceImpl implements IPictureSearchService { final List storeProdIdList = picSearchAdverts.stream().map(x -> x.getStoreProdId()).collect(Collectors.toList()); // 搜索结果过滤掉广告商品 List filterResults = results.stream().filter(x -> !storeProdIdList.contains(x.getStoreProductId())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filterResults)) { + return BeanUtil.copyToList(picSearchAdverts, StoreProdViewDTO.class); + } + // 过滤掉无效的档口,有可能该档口没有续费之类的,被下架了 + List trueResultList = this.storeProdMapper.filterInvalidStoreProd(filterResults.stream() + .map(ProductMatchDTO::getStoreProductId).distinct().collect(Collectors.toList())); + // 过滤掉无效的商品之后,是否还剩下商品 + if (CollectionUtils.isEmpty(trueResultList)) { + return BeanUtil.copyToList(picSearchAdverts, StoreProdViewDTO.class); + } // 档口商品显示的基本属性 数据库筛选,必须要带prodStatus,因为图搜搜出来的可能是下架的商品 - List storeProdViewAttrList = this.storeProdMapper.getStoreProdViewAttr(filterResults.stream() + List storeProdViewAttrList = this.storeProdMapper.getStoreProdViewAttr(trueResultList.stream() .map(ProductMatchDTO::getStoreProductId).distinct().collect(Collectors.toList()), java.sql.Date.valueOf(LocalDate.now().minusMonths(2)), java.sql.Date.valueOf(LocalDate.now())); // 设置商品标签 diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java index 341d94752..9f72ca58d 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.RandomUtil; import co.elastic.clients.elasticsearch.core.BulkResponse; import co.elastic.clients.elasticsearch.core.bulk.BulkOperation; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -22,7 +21,6 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bigDecimal.CollectorsUtil; import com.ruoyi.framework.es.EsClientWrapper; -import com.ruoyi.framework.sms.SmsClientWrapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.xkt.domain.*; @@ -128,7 +126,21 @@ public class StoreServiceImpl implements IStoreService { .eq(Store::getId, delFlagDTO.getStoreId()))) .orElseThrow(() -> new ServiceException("档口不存在!", HttpStatus.ERROR)); store.setDelFlag(delFlagDTO.getDelFlag() ? Constants.UNDELETED : Constants.DELETED); - return storeMapper.updateById(store); + int count = storeMapper.updateById(store); + if (delFlagDTO.getDelFlag()) { + // 如果为启用,则重新添加到redis中 + redisCache.setCacheObject(CacheConstants.STORE_KEY + store.getId(), store); + } else { + // 如果为停用,则从redis中删除 + redisCache.deleteObject(CacheConstants.STORE_KEY + store.getId()); + } + // 获取所有的档口,并且存到redis中 + List storeList = this.storeMapper.selectList(new LambdaQueryWrapper() + .eq(Store::getDelFlag, Constants.UNDELETED)); + if (CollectionUtils.isNotEmpty(storeList)) { + redisCache.setCacheObject(CacheConstants.STORE_LIST_KEY, storeList.stream().map(Store::getId).map(String::valueOf).collect(Collectors.toList())); + } + return count; } /** diff --git a/xkt/src/main/resources/mapper/StoreProductMapper.xml b/xkt/src/main/resources/mapper/StoreProductMapper.xml index f1d353faf..961ddb71b 100644 --- a/xkt/src/main/resources/mapper/StoreProductMapper.xml +++ b/xkt/src/main/resources/mapper/StoreProductMapper.xml @@ -332,5 +332,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sp.del_flag = 0 AND sp.id = #{storeProdId} + + \ No newline at end of file