diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/DefaultResourceReporter.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/DefaultResourceReporter.java new file mode 100644 index 000000000..50ac89b86 --- /dev/null +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/DefaultResourceReporter.java @@ -0,0 +1,86 @@ +package cn.stylefeng.roses.kernel.sys.modular.resource.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; +import cn.stylefeng.roses.kernel.scanner.api.ResourceReportApi; +import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ReportResourceParam; +import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; +import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.SysResourcePersistencePojo; +import cn.stylefeng.roses.kernel.sys.modular.resource.entity.SysResource; +import cn.stylefeng.roses.kernel.sys.modular.resource.factory.ResourceFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 资源扫描的搜集 + * + * @author fengshuonan + * @since 2023/6/18 10:34 + */ +@Service +public class DefaultResourceReporter implements ResourceReportApi { + + @Resource + private SysResourceService sysResourceService; + + @Resource(name = "resourceCache") + private CacheOperatorApi resourceCache; + + @Override + @Transactional(rollbackFor = Exception.class) + public void reportResources(@RequestBody ReportResourceParam reportResourceReq) { + this.reportResourcesAndGetResult(reportResourceReq); + } + + @Override + public List reportResourcesAndGetResult(ReportResourceParam reportResourceReq) { + String projectCode = reportResourceReq.getProjectCode(); + Map> resourceDefinitions = reportResourceReq.getResourceDefinitions(); + + if (ObjectUtil.isEmpty(projectCode) || resourceDefinitions == null) { + return new ArrayList<>(); + } + + // 根据project删除该项目下的所有资源 + this.sysResourceService.deleteResourceByProjectCode(projectCode); + + // 获取当前应用的所有资源 + ArrayList allResources = new ArrayList<>(); + ArrayList resourceDefinitionArrayList = new ArrayList<>(); + for (Map.Entry> appModularResources : resourceDefinitions.entrySet()) { + Map value = appModularResources.getValue(); + for (Map.Entry modularResources : value.entrySet()) { + resourceDefinitionArrayList.add(modularResources.getValue()); + SysResource resource = ResourceFactory.createResource(modularResources.getValue()); + allResources.add(resource); + } + } + + // 将资源存入库中 + sysResourceService.batchSaveResourceList(allResources); + + // 将资源存入缓存一份 + Map resourceDefinitionMap = ResourceFactory.orderedResourceDefinition(resourceDefinitionArrayList); + for (Map.Entry entry : resourceDefinitionMap.entrySet()) { + resourceCache.put(entry.getKey(), entry.getValue()); + } + + // 组装返回结果 + ArrayList finalResult = new ArrayList<>(); + for (SysResource item : allResources) { + SysResourcePersistencePojo sysResourcePersistencePojo = new SysResourcePersistencePojo(); + BeanUtil.copyProperties(item, sysResourcePersistencePojo); + finalResult.add(sysResourcePersistencePojo); + } + + return finalResult; + } + +} diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java index 0725b1390..f64bad508 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java @@ -30,6 +30,8 @@ import cn.stylefeng.roses.kernel.sys.modular.resource.entity.SysResource; import cn.stylefeng.roses.kernel.sys.modular.resource.pojo.ResourceRequest; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * 资源服务类 * @@ -48,4 +50,21 @@ public interface SysResourceService extends IService, ResourceServi */ PageResult findPage(ResourceRequest resourceRequest); + /** + * 删除某个项目的所有资源 + * + * @param projectCode 项目编码,一般为spring application name + * @author fengshuonan + * @since 2020/11/24 20:46 + */ + void deleteResourceByProjectCode(String projectCode); + + /** + * 批量保存系统资源 + * + * @author fengshuonan + * @since 2023/6/18 10:37 + */ + void batchSaveResourceList(List sysResourceList); + } diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java index c7d20044a..06de5d9b1 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java @@ -24,12 +24,16 @@ */ package cn.stylefeng.roses.kernel.sys.modular.resource.service.impl; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; +import cn.stylefeng.roses.kernel.db.api.context.DbOperatorContext; import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; +import cn.stylefeng.roses.kernel.rule.enums.DbTypeEnum; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceUrlParam; @@ -73,6 +77,27 @@ public class SysResourceServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysResource::getProjectCode, projectCode); + this.remove(wrapper); + } + + @Override + public void batchSaveResourceList(List sysResourceList) { + DbTypeEnum currentDbType = DbOperatorContext.me().getCurrentDbType(); + if (DbTypeEnum.MYSQL.equals(currentDbType)) { + // 分批插入记录 + List> split = ListUtil.split(sysResourceList, RuleConstants.DEFAULT_BATCH_INSERT_SIZE); + for (List sysResources : split) { + this.getBaseMapper().insertBatchSomeColumn(sysResources); + } + } else { + this.saveBatch(sysResourceList, sysResourceList.size()); + } + } + @Override public ResourceDefinition getResourceByUrl(ResourceUrlParam resourceUrlReq) {