diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/IscConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/IscConstants.java index 6a15e6334..eedaef59d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/IscConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/IscConstants.java @@ -5,6 +5,9 @@ public class IscConstants { /** 待审核 */ public static final String AUDIT_WAIT = "0"; + /** 审核通过 */ + public static final String AUDIT_PASS = "1"; + /** 待审核 */ public static final String ONLINE_STATUS_ON = "1"; diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscAppServiceController.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscAppServiceController.java index 24c412947..4bc679579 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscAppServiceController.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscAppServiceController.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Arrays; import java.util.concurrent.TimeUnit; +import cn.hutool.core.lang.tree.Tree; +import com.ruoyi.isc.domain.IscServiceCate; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; @@ -40,7 +42,7 @@ import io.swagger.annotations.ApiOperation; @RequestMapping("/isc/appservice") public class IscAppServiceController extends BaseController { - private final IIscAppServiceService iIscAppServiceService; + private final IIscAppServiceService appServiceService; /** * 查询应用服务列表 @@ -49,7 +51,7 @@ public class IscAppServiceController extends BaseController { @PreAuthorize("@ss.hasPermi('isc:appservice:list')") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) IscAppServiceBo bo) { - return iIscAppServiceService.queryPageList(bo); + return appServiceService.queryPageList(bo); } /** @@ -60,7 +62,7 @@ public class IscAppServiceController extends BaseController { @Log(title = "应用服务", businessType = BusinessType.EXPORT) @GetMapping("/export") public void export(@Validated IscAppServiceBo bo, HttpServletResponse response) { - List list = iIscAppServiceService.queryList(bo); + List list = appServiceService.queryList(bo); ExcelUtil.exportExcel(list, "应用服务", IscAppServiceVo.class, response); } @@ -72,7 +74,7 @@ public class IscAppServiceController extends BaseController { @GetMapping("/{serviceAppId}") public AjaxResult getInfo(@NotNull(message = "主键不能为空") @PathVariable("serviceAppId") Long serviceAppId) { - return AjaxResult.success(iIscAppServiceService.queryById(serviceAppId)); + return AjaxResult.success(appServiceService.queryById(serviceAppId)); } /** @@ -84,7 +86,7 @@ public class IscAppServiceController extends BaseController { @RepeatSubmit() @PostMapping() public AjaxResult add(@Validated(AddGroup.class) @RequestBody IscAppServiceBo bo) { - return toAjax(iIscAppServiceService.insertByBo(bo) ? 1 : 0); + return toAjax(appServiceService.insertByBo(bo) ? 1 : 0); } /** @@ -96,7 +98,7 @@ public class IscAppServiceController extends BaseController { @RepeatSubmit() @PutMapping() public AjaxResult edit(@Validated(EditGroup.class) @RequestBody IscAppServiceBo bo) { - return toAjax(iIscAppServiceService.updateByBo(bo) ? 1 : 0); + return toAjax(appServiceService.updateByBo(bo) ? 1 : 0); } /** @@ -108,6 +110,16 @@ public class IscAppServiceController extends BaseController { @DeleteMapping("/{serviceAppIds}") public AjaxResult remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] serviceAppIds) { - return toAjax(iIscAppServiceService.deleteWithValidByIds(Arrays.asList(serviceAppIds), true) ? 1 : 0); + return toAjax(appServiceService.deleteWithValidByIds(Arrays.asList(serviceAppIds), true) ? 1 : 0); + } + + /** + * 获取应用服务下拉树列表 + */ + @GetMapping("/treeselect/{applicationId}") + @ApiOperation("获取应用服务下拉树列表") + public AjaxResult>> treeselect(@NotNull(message = "应用主键不能为空") @PathVariable Long applicationId) + { + return AjaxResult.success(appServiceService.genAppServiceTree(applicationId)); } } diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscServiceCateController.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscServiceCateController.java index d9862599a..15b57cd13 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscServiceCateController.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/controller/IscServiceCateController.java @@ -64,16 +64,11 @@ public class IscServiceCateController extends BaseController { * 获取分类下拉树列表 */ @GetMapping("/treeselect") - public AjaxResult treeselect() + @ApiOperation("获取分类下拉树列表") + public AjaxResult>> treeselect() { List cates = cateService.selectCateList(); - return AjaxResult.success(TreeUtils.build(cates, (cate, tree) -> { - tree.setId(cate.getCateId()); - tree.setParentId(cate.getParentId()); - tree.setName(cate.getCateName()); - tree.setWeight(cate.getOrderNum()); - tree.putExtra("fullPath", cate.getFullPath()); - })); + return AjaxResult.success(cateService.genCateTree(cates)); } /** diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/bo/IscAppServiceBo.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/bo/IscAppServiceBo.java index 0f331f243..340edd465 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/bo/IscAppServiceBo.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/bo/IscAppServiceBo.java @@ -46,12 +46,6 @@ public class IscAppServiceBo extends BaseEntity { @NotNull(message = "应用ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long applicationId; - /** - * 用户ID - */ - @ApiModelProperty(value = "用户ID") - private Long userId; - /** * 启用状态(0启用 1停用) */ diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/vo/IscAppServiceVo.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/vo/IscAppServiceVo.java index acfb95381..5310f1574 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/vo/IscAppServiceVo.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/domain/vo/IscAppServiceVo.java @@ -34,10 +34,16 @@ public class IscAppServiceVo { /** * 服务ID */ - @ExcelProperty(value = "服务ID") @ApiModelProperty("服务ID") private Long serviceId; + /** + * 服务名称 + */ + @ExcelProperty(value = "服务名称") + @ApiModelProperty("服务名称") + private String serviceName; + /** * 应用ID */ diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java index 41087fdd5..9c0c04300 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java @@ -1,5 +1,6 @@ package com.ruoyi.isc.service; +import cn.hutool.core.lang.tree.Tree; import com.ruoyi.isc.domain.IscAppService; import com.ruoyi.isc.domain.vo.IscAppServiceVo; import com.ruoyi.isc.domain.bo.IscAppServiceBo; @@ -53,4 +54,11 @@ public interface IIscAppServiceService extends IServicePlus ids, Boolean isValid); + + /** + * 构造 应用服务树结构 + * @param applicationId 应用ID + * @return 应用服务树结构 (标识服务是否存在) + */ + List> genAppServiceTree(Long applicationId); } diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceCateService.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceCateService.java index 7161c5f8c..6f40e00bd 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceCateService.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceCateService.java @@ -1,10 +1,11 @@ package com.ruoyi.isc.service; -import com.ruoyi.common.core.domain.entity.SysMenu; -import com.ruoyi.isc.domain.IscServiceCate; -import com.ruoyi.isc.domain.vo.IscServiceCateVo; -import com.ruoyi.isc.domain.bo.IscServiceCateBo; +import cn.hutool.core.lang.tree.Tree; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.ruoyi.isc.domain.IscService; +import com.ruoyi.isc.domain.IscServiceCate; +import com.ruoyi.isc.domain.bo.IscServiceCateBo; +import com.ruoyi.isc.domain.vo.IscServiceCateVo; import java.util.Collection; import java.util.List; @@ -64,4 +65,20 @@ public interface IIscServiceCateService extends IServicePlus batchCateName(Set fullPathList); + + /** + * 组装 服务分类 树结构 + * @param cates 所有分类 + * @return 树结构信息 + */ + List> genCateTree(List cates); + + /** + * 组装 服务分类 树结构 + * @param cates 所有分类 + * @param serviceList 可用服务列表 + * @param exitsIds 已存在服务ID集合 + * @return 树结构信息 + */ + List> genCateTree(List cates, List serviceList, Set exitsIds); } diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceService.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceService.java index 0edf8b342..dc125d83f 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceService.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscServiceService.java @@ -1,13 +1,17 @@ package com.ruoyi.isc.service; -import com.ruoyi.isc.domain.IscService; -import com.ruoyi.isc.domain.vo.IscServiceVo; -import com.ruoyi.isc.domain.bo.IscServiceBo; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.isc.domain.IscService; +import com.ruoyi.isc.domain.bo.IscServiceBo; +import com.ruoyi.isc.domain.vo.IscServiceVo; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.Set; /** * 服务信息Service接口 @@ -53,4 +57,24 @@ public interface IIscServiceService extends IServicePlus ids, Boolean isValid); + + /** + * 通过服务ID集合 查询服务名称map + * @param serviceIds 服务ID集合 + * @return 服务名称map + */ + Map getNameMap(Collection serviceIds); + + /** + * 组装 服务树结构 + * @return 服务树结构 + */ + List> genServiceTree(); + + /** + * 组装 服务树结构 + * @param exitsIds 已存在服务ID集合 + * @return 服务树结构 + */ + List> genServiceTree(Set exitsIds); } diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java index 98e10b198..f3b9483bc 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java @@ -1,10 +1,15 @@ package com.ruoyi.isc.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.isc.domain.IscService; +import com.ruoyi.isc.service.IIscServiceService; import org.springframework.stereotype.Service; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -15,9 +20,12 @@ import com.ruoyi.isc.domain.IscAppService; import com.ruoyi.isc.mapper.IscAppServiceMapper; import com.ruoyi.isc.service.IIscAppServiceService; +import javax.annotation.Resource; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; /** * 应用服务Service业务层处理 @@ -28,6 +36,8 @@ import java.util.Collection; @Service public class IscAppServiceServiceImpl extends ServicePlusImpl implements IIscAppServiceService { + @Resource + private IIscServiceService serviceService; @Override public IscAppServiceVo queryById(Long serviceAppId){ return getVoById(serviceAppId); @@ -36,20 +46,41 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl queryPageList(IscAppServiceBo bo) { PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); + genServiceName(result.getRecordsVo()); return PageUtils.buildDataInfo(result); } @Override public List queryList(IscAppServiceBo bo) { - return listVo(buildQueryWrapper(bo)); + final List results = listVo(buildQueryWrapper(bo)); + genServiceName(results); + return results; + } + + /** + * 组装服务名称 + * @param results 应用服务列表 + */ + private void genServiceName(List results) + { + if(CollectionUtil.isEmpty(results)) { + return; + } + Set serviceIds = results.stream().map(IscAppServiceVo::getServiceId).collect(Collectors.toSet()); + Map nameMap = serviceService.getNameMap(serviceIds); + for (IscAppServiceVo result : results) + { + result.setServiceName(nameMap.get(result.getServiceId())); + } } private LambdaQueryWrapper buildQueryWrapper(IscAppServiceBo bo) { Map params = bo.getParams(); + Long userId = SecurityUtils.getUserId(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getServiceId() != null, IscAppService::getServiceId, bo.getServiceId()); lqw.eq(bo.getApplicationId() != null, IscAppService::getApplicationId, bo.getApplicationId()); - lqw.eq(bo.getUserId() != null, IscAppService::getUserId, bo.getUserId()); + lqw.eq(!SecurityUtils.isAdmin(userId), IscAppService::getUserId, userId); lqw.eq(StringUtils.isNotBlank(bo.getEnabled()), IscAppService::getEnabled, bo.getEnabled()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), IscAppService::getStatus, bo.getStatus()); return lqw; @@ -85,4 +116,13 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl> genAppServiceTree(Long applicationId) + { + List serviceIds = listObjs(Wrappers.lambdaQuery() + .select(IscAppService::getServiceId) + .eq(IscAppService::getApplicationId, applicationId), o -> (Long) o); + return serviceService.genServiceTree(CollectionUtil.newHashSet(serviceIds)); + } } diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceCateServiceImpl.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceCateServiceImpl.java index 20028edb1..64ec9ecb6 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceCateServiceImpl.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceCateServiceImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.isc.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.FullPathUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.TreeUtils; +import com.ruoyi.isc.domain.IscService; import org.springframework.stereotype.Service; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -27,6 +31,12 @@ import java.util.stream.Collectors; @Service public class IscServiceCateServiceImpl extends ServicePlusImpl implements IIscServiceCateService { + public static final String FIELD_FULL_PATH = "fullPath"; + public static final String FIELD_NODE_TYPE = "type"; + public static final int NODE_TYPE_SERVICE = 1; + public static final int NODE_TYPE_CATE = 0; + public static final String FIELD_NODE_EXIST = "exist"; + @Override public IscServiceCateVo queryById(Long cateId){ return getVoById(cateId); @@ -135,6 +145,53 @@ public class IscServiceCateServiceImpl extends ServicePlusImpl> genCateTree(List cates) + { + return genCateTree(cates, null, CollectionUtil.newHashSet()); + } + + @Override + public List> genCateTree(List cates, List serviceList, Set exitsIds) + { + boolean isServiceTree = Objects.nonNull(serviceList); + final Map> cateServiceMap = isServiceTree ? serviceList.stream() + .collect(Collectors.groupingBy(IscService::getCateFullPath)) : null; + + return TreeUtils.build(cates, (cate, tree) -> { + tree.setId(cate.getCateId()); + tree.setParentId(cate.getParentId()); + tree.setName(cate.getCateName()); + tree.setWeight(cate.getOrderNum()); + tree.putExtra(FIELD_FULL_PATH, cate.getFullPath()); + if(isServiceTree) { + tree.putExtra(FIELD_NODE_TYPE, NODE_TYPE_CATE); + List services = cateServiceMap.get(cate.getFullPath()); + if(CollectionUtil.isEmpty(services)) { + return; + } + for (int index = 0; index < services.size(); index++) + { + IscService service = services.get(index); + List> children = tree.getChildren(); + if(Objects.isNull(children)) { + children = CollectionUtil.newArrayList(); + tree.setChildren(children); + } + final Tree child = new Tree<>(TreeUtils.DEFAULT_TREE_NODE_CONFIG); + child.setId(service.getServiceId()); + child.setName(service.getServiceName()); + child.setWeight(index); + child.setParent(tree); + child.setParentId(tree.getId()); + child.putExtra(FIELD_NODE_TYPE, NODE_TYPE_SERVICE); + child.putExtra(FIELD_NODE_EXIST, exitsIds.contains(service.getServiceId())); + children.add(child); + } + } + }); + } + private Map batchCateName(List list) { Map results = new HashMap<>(); final Set parentIds = list.stream().filter(m -> m.getParentId() != 0L).map(IscServiceCate::getParentId).collect(Collectors.toSet()); diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceServiceImpl.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceServiceImpl.java index 1b929a538..5bb969f6a 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceServiceImpl.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscServiceServiceImpl.java @@ -1,10 +1,13 @@ package com.ruoyi.isc.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.constant.IscConstants; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; @@ -24,6 +27,7 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -126,4 +130,30 @@ public class IscServiceServiceImpl extends ServicePlusImpl getNameMap(Collection serviceIds) + { + return list(Wrappers.lambdaQuery() + .select(IscService::getServiceId, IscService::getServiceName) + .in(IscService::getServiceId, serviceIds)).stream() + .collect(Collectors.toMap(IscService::getServiceId, IscService::getServiceName)); + } + + @Override + public List> genServiceTree() + { + return genServiceTree(CollectionUtil.newHashSet()); + } + + @Override + public List> genServiceTree(Set exitsIds) + { + List serviceList = list(Wrappers.lambdaQuery() + .select(IscService::getServiceId, IscService::getServiceName, IscService::getCateFullPath) + .eq(IscService::getStatus, IscConstants.AUDIT_PASS) + .eq(IscService::getEnabled, UserConstants.DICT_NORMAL) + .orderByDesc(IscService::getUpdateTime)); + return cateService.genCateTree(cateService.selectCateList(), serviceList, exitsIds); + } } diff --git a/ruoyi-ui/src/api/isc/appservice.js b/ruoyi-ui/src/api/isc/appservice.js index 180648fef..0f86ce555 100644 --- a/ruoyi-ui/src/api/isc/appservice.js +++ b/ruoyi-ui/src/api/isc/appservice.js @@ -42,3 +42,11 @@ export function delAppservice(serviceAppId) { method: 'delete' }) } + +// 获取应用服务下拉树列表 +export function treeselect(applicationId) { + return request({ + url: '/isc/appservice/treeselect/' + applicationId, + method: 'get' + }) +} diff --git a/ruoyi-ui/src/views/isc/application/index.vue b/ruoyi-ui/src/views/isc/application/index.vue index 66dcda684..3d64af5c1 100644 --- a/ruoyi-ui/src/views/isc/application/index.vue +++ b/ruoyi-ui/src/views/isc/application/index.vue @@ -74,7 +74,7 @@ - +