|
|
@@ -0,0 +1,365 @@
|
|
|
+package org.dromara.mall.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.core.exception.base.BaseException;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.redis.utils.RedisUtils;
|
|
|
+import org.dromara.mall.config.CacheConstants;
|
|
|
+import org.dromara.mall.domain.PageLink;
|
|
|
+import org.dromara.mall.domain.vo.PageLinkVo;
|
|
|
+import org.dromara.mall.domain.bo.PageLinkBo;
|
|
|
+import org.dromara.mall.event.DataSyncEvent;
|
|
|
+import org.dromara.mall.mapper.PageLinkMapper;
|
|
|
+import org.dromara.mall.service.IPageLinkService;
|
|
|
+import org.springframework.context.ApplicationEventPublisher;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 页面链接Service业务层处理
|
|
|
+ *
|
|
|
+ * @author ruoyi
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class PageLinkServiceImpl extends ServiceImpl<PageLinkMapper, PageLink> implements IPageLinkService {
|
|
|
+
|
|
|
+ private final PageLinkMapper baseMapper;
|
|
|
+ private final ApplicationEventPublisher eventPublisher;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询页面链接列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 页面链接分页列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PageLinkVo> queryPageList(PageLinkBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<PageLinkVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<PageLink> buildQueryWrapper(PageLinkBo bo) {
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.orderByAsc(PageLink::getId);
|
|
|
+ lqw.eq(bo.getCateId() != null, PageLink::getCateId, bo.getCateId());
|
|
|
+ lqw.eq(bo.getType() != null, PageLink::getType, bo.getType());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getName()), PageLink::getName, bo.getName());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getLinkKey()), PageLink::getLinkKey, bo.getLinkKey());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getUrl()), PageLink::getUrl, bo.getUrl());
|
|
|
+ lqw.eq(bo.getIsCustom() != null, PageLink::getIsCustom, bo.getIsCustom());
|
|
|
+ lqw.eq(bo.getStatus() != null, PageLink::getStatus, bo.getStatus());
|
|
|
+ lqw.eq(bo.getSort() != null, PageLink::getSort, bo.getSort());
|
|
|
+ lqw.eq(bo.getCreateTime() != null, PageLink::getCreateTime, bo.getCreateTime());
|
|
|
+ lqw.eq(bo.getIsMer() != null, PageLink::getIsMer, bo.getIsMer());
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据分类ID查询链接列表
|
|
|
+ *
|
|
|
+ * @param categoryId 分类ID
|
|
|
+ * @return 链接列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PageLink> selectByCategoryId(Long categoryId) {
|
|
|
+ String cacheKey = CacheConstants.LINK_LIST_CACHE_KEY + "category:" + categoryId;
|
|
|
+ return RedisUtils.getCacheObject(cacheKey, () -> {
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(PageLink::getCateId, categoryId);
|
|
|
+ lqw.orderByAsc(PageLink::getSort);
|
|
|
+ return baseMapper.selectList(lqw);
|
|
|
+ }, CacheConstants.CACHE_EXPIRE_TIME);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据是否自定义查询链接列表
|
|
|
+ *
|
|
|
+ * @param isCustom 是否自定义:0-系统预设,1-自定义
|
|
|
+ * @return 链接列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PageLink> selectByIsCustom(Integer isCustom) {
|
|
|
+ String cacheKey = CacheConstants.LINK_LIST_CACHE_KEY + "custom:" + isCustom;
|
|
|
+ return RedisUtils.getCacheObject(cacheKey, () -> {
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(PageLink::getIsCustom, isCustom);
|
|
|
+ lqw.orderByAsc(PageLink::getSort);
|
|
|
+ return baseMapper.selectList(lqw);
|
|
|
+ }, CacheConstants.CACHE_EXPIRE_TIME);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据ID查询链接详情
|
|
|
+ *
|
|
|
+ * @param id 链接ID
|
|
|
+ * @return 链接详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public PageLinkVo selectLinkDetail(Long id) {
|
|
|
+ String cacheKey = CacheConstants.PAGE_LINK_CACHE_KEY + id;
|
|
|
+ return baseMapper.selectLinkDetail(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据链接关键字查询链接
|
|
|
+ *
|
|
|
+ * @param key 链接关键字
|
|
|
+ * @return 链接信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public PageLink selectByKey(String key) {
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(PageLink::getLinkKey, key);
|
|
|
+ return baseMapper.selectOne(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据分类ID列表查询链接
|
|
|
+ *
|
|
|
+ * @param categoryIds 分类ID列表
|
|
|
+ * @return 链接列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PageLink> selectLinksByCategoryIds(List<Long> categoryIds) {
|
|
|
+ if (categoryIds == null || categoryIds.isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 简单实现,不缓存多ID查询
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.in(PageLink::getCateId, categoryIds);
|
|
|
+ lqw.orderByAsc(PageLink::getSort);
|
|
|
+ return baseMapper.selectList(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增链接
|
|
|
+ *
|
|
|
+ * @param bo 链接业务对象
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Boolean insertByBo(PageLinkBo bo) {
|
|
|
+ boolean result = false;
|
|
|
+ // 检查链接关键字是否已存在
|
|
|
+ checkKeyUnique(bo.getLinkKey(), null);
|
|
|
+
|
|
|
+ PageLink link = MapstructUtils.convert(bo, PageLink.class);
|
|
|
+ if (link != null) {
|
|
|
+ if (link.getSort() == null) {
|
|
|
+ link.setSort(50);
|
|
|
+ }
|
|
|
+
|
|
|
+ result = save(link);
|
|
|
+ if (result) {
|
|
|
+ // 发布数据同步事件
|
|
|
+ eventPublisher.publishEvent(new DataSyncEvent(
|
|
|
+ this,
|
|
|
+ DataSyncEvent.DATA_TYPE_PAGE_LINK,
|
|
|
+ DataSyncEvent.OPERATION_CREATE,
|
|
|
+ link.getId()
|
|
|
+ ));
|
|
|
+ // 清除缓存
|
|
|
+ clearLinkCache(link);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改链接
|
|
|
+ *
|
|
|
+ * @param bo 链接业务对象
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Boolean updateByBo(PageLinkBo bo) {
|
|
|
+ boolean result = false;
|
|
|
+ // 检查链接关键字是否已存在
|
|
|
+ checkKeyUnique(bo.getLinkKey(), bo.getId());
|
|
|
+
|
|
|
+ PageLink link = MapstructUtils.convert(bo, PageLink.class);
|
|
|
+ // 获取旧的链接信息,用于清除缓存
|
|
|
+ if (link != null) {
|
|
|
+ PageLink oldLink = getById(link.getId());
|
|
|
+ result = updateById(link);
|
|
|
+ if (result) {
|
|
|
+ // 发布数据同步事件
|
|
|
+ eventPublisher.publishEvent(new DataSyncEvent(
|
|
|
+ this,
|
|
|
+ DataSyncEvent.DATA_TYPE_PAGE_LINK,
|
|
|
+ DataSyncEvent.OPERATION_UPDATE,
|
|
|
+ link.getId()
|
|
|
+ ));
|
|
|
+ // 清除新旧链接的缓存
|
|
|
+ if (oldLink != null) {
|
|
|
+ clearLinkCache(oldLink);
|
|
|
+ }
|
|
|
+ clearLinkCache(link);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查链接关键字是否唯一
|
|
|
+ *
|
|
|
+ * @param key 链接关键字
|
|
|
+ * @param id 链接ID,用于更新时排除自身
|
|
|
+ */
|
|
|
+ private void checkKeyUnique(String key, Long id) {
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(PageLink::getLinkKey, key);
|
|
|
+ if (id != null) {
|
|
|
+ lqw.ne(PageLink::getId, id);
|
|
|
+ }
|
|
|
+ if (baseMapper.exists(lqw)) {
|
|
|
+ throw new BaseException("链接关键字已存在,请更换");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除链接
|
|
|
+ *
|
|
|
+ * @param ids 链接ID列表
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Boolean deleteWithValidByIds(List<Long> ids) {
|
|
|
+ // 检查是否有系统预设的链接
|
|
|
+ LambdaQueryWrapper<PageLink> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.in(PageLink::getId, ids);
|
|
|
+ lqw.eq(PageLink::getIsCustom, 0);
|
|
|
+ List<PageLink> systemLinks = baseMapper.selectList(lqw);
|
|
|
+ if (!systemLinks.isEmpty()) {
|
|
|
+ throw new BaseException("包含系统预设链接,无法删除");
|
|
|
+ }
|
|
|
+ // 获取要删除的链接信息,用于清除缓存
|
|
|
+ List<PageLink> links = listByIds(ids);
|
|
|
+ boolean result = removeByIds(ids);
|
|
|
+ if (result && links != null) {
|
|
|
+ // 发布数据同步事件
|
|
|
+ eventPublisher.publishEvent(new DataSyncEvent(
|
|
|
+ this,
|
|
|
+ DataSyncEvent.DATA_TYPE_PAGE_LINK,
|
|
|
+ DataSyncEvent.OPERATION_BATCH_DELETE,
|
|
|
+ ids
|
|
|
+ ));
|
|
|
+ // 清除缓存
|
|
|
+ for (PageLink link : links) {
|
|
|
+ clearLinkCache(link);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量更新链接状态
|
|
|
+ *
|
|
|
+ * @param ids 链接ID列表
|
|
|
+ * @param status 状态:0-启用,1-禁用
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+// @Override
|
|
|
+// @Transactional
|
|
|
+// public Boolean updateBatchStatus(List<Long> ids, String status) {
|
|
|
+// // 获取要更新的链接信息,用于清除缓存
|
|
|
+// List<PageLink> links = listByIds(ids);
|
|
|
+// boolean result = baseMapper.updateBatchStatus(ids, status) > 0;
|
|
|
+// if (result && links != null) {
|
|
|
+// // 发布数据同步事件
|
|
|
+// eventPublisher.publishEvent(new DataSyncEvent(
|
|
|
+// this,
|
|
|
+// DataSyncEvent.DATA_TYPE_PAGE_LINK,
|
|
|
+// DataSyncEvent.OPERATION_STATUS_CHANGE,
|
|
|
+// ids
|
|
|
+// ));
|
|
|
+// // 清除缓存
|
|
|
+// for (PageLink link : links) {
|
|
|
+// clearLinkCache(link);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量更新链接排序
|
|
|
+ *
|
|
|
+ * @param links 链接列表
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+// @Override
|
|
|
+// @Transactional
|
|
|
+// public Boolean updateBatchSort(List<PageLink> links) {
|
|
|
+// if (links.isEmpty()) {
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+// // 验证分类一致性
|
|
|
+// Map<Long, List<PageLink>> categoryMap = links.stream()
|
|
|
+// .collect(Collectors.groupingBy(PageLink::getCategoryId));
|
|
|
+// if (categoryMap.size() > 1) {
|
|
|
+// throw new BaseException("批量排序只能处理同一分类下的链接");
|
|
|
+// }
|
|
|
+// boolean result = baseMapper.updateBatchSort(links) > 0;
|
|
|
+// if (result) {
|
|
|
+// // 发布数据同步事件
|
|
|
+// eventPublisher.publishEvent(new DataSyncEvent(
|
|
|
+// this,
|
|
|
+// DataSyncEvent.DATA_TYPE_PAGE_LINK,
|
|
|
+// DataSyncEvent.OPERATION_SORT_CHANGE,
|
|
|
+// links.stream().map(PageLink::getId).collect(Collectors.toList())
|
|
|
+// ));
|
|
|
+// // 清除缓存
|
|
|
+// for (PageLink link : links) {
|
|
|
+// clearLinkCache(link);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清除链接缓存
|
|
|
+ *
|
|
|
+ * @param link 链接对象
|
|
|
+ */
|
|
|
+ private void clearLinkCache(PageLink link) {
|
|
|
+ if (link == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 清除链接详情缓存
|
|
|
+ RedisUtils.deleteObject(CacheConstants.PAGE_LINK_CACHE_KEY + link.getId());
|
|
|
+
|
|
|
+ // 清除分类链接列表缓存
|
|
|
+ RedisUtils.deleteObject(CacheConstants.LINK_LIST_CACHE_KEY + "category:" + link.getCateId());
|
|
|
+
|
|
|
+ // 清除自定义链接列表缓存
|
|
|
+ RedisUtils.deleteObject(CacheConstants.LINK_LIST_CACHE_KEY + "custom:" + link.getIsCustom());
|
|
|
+
|
|
|
+ // 清除关键字缓存
|
|
|
+ if (StringUtils.isNotEmpty(link.getLinkKey())) {
|
|
|
+ RedisUtils.deleteObject(CacheConstants.PAGE_LINK_CACHE_KEY + link.getLinkKey());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|