服务指令树

This commit is contained in:
1378012178@qq.com 2025-07-22 09:45:38 +08:00
parent d8c48e0a36
commit 2344374556
8 changed files with 211 additions and 8 deletions

View File

@ -1,5 +1,6 @@
package com.nu.modules.servicedirective.controller; package com.nu.modules.servicedirective.controller;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -7,12 +8,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nu.dto.DirectiveAsyncMQDto; import com.nu.dto.DirectiveAsyncMQDto;
import com.nu.modules.servicedirective.entity.ConfigServiceDirective; import com.nu.modules.servicedirective.entity.ConfigServiceDirective;
import com.nu.modules.servicedirective.entity.TreeNode;
import com.nu.modules.servicedirective.service.IConfigServiceDirectiveService; import com.nu.modules.servicedirective.service.IConfigServiceDirectiveService;
import com.nu.modules.sysconfig.ISysConfigApi; import com.nu.modules.sysconfig.ISysConfigApi;
import com.nu.utils.RabbitMQUtil; import com.nu.utils.RabbitMQUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
@ -52,6 +55,12 @@ public class ConfigServiceDirectiveController extends JeecgController<ConfigServ
@Autowired @Autowired
private ISysBaseAPI sysBaseAPI; private ISysBaseAPI sysBaseAPI;
@GetMapping("/tree")
public Result<List<TreeNode>> getTree() {
List<TreeNode> data = service.getTreeData();
return Result.ok(data);
}
/** /**
* 分页列表查询 * 分页列表查询
* *
@ -173,7 +182,7 @@ public class ConfigServiceDirectiveController extends JeecgController<ConfigServ
} }
//如果是未授权 则同步给管理平台进行更新 //如果是未授权 则同步给管理平台进行更新
if("1".equals(configServiceDirective.getStatus())){ if ("1".equals(configServiceDirective.getStatus())) {
DirectiveAsyncMQDto directiveAsyncMQDto = new DirectiveAsyncMQDto(); DirectiveAsyncMQDto directiveAsyncMQDto = new DirectiveAsyncMQDto();
BeanUtils.copyProperties(configServiceDirective, directiveAsyncMQDto); BeanUtils.copyProperties(configServiceDirective, directiveAsyncMQDto);
rabbitMQUtil.sendToExchange("hldy.directive", "hldy.directive.audit", directiveAsyncMQDto); rabbitMQUtil.sendToExchange("hldy.directive", "hldy.directive.audit", directiveAsyncMQDto);
@ -220,11 +229,18 @@ public class ConfigServiceDirectiveController extends JeecgController<ConfigServ
@ApiOperation(value = "服务指令-通过id查询", notes = "服务指令-通过id查询") @ApiOperation(value = "服务指令-通过id查询", notes = "服务指令-通过id查询")
@GetMapping(value = "/queryById") @GetMapping(value = "/queryById")
public Result<ConfigServiceDirective> queryById(@RequestParam(name = "id", required = true) String id) { public Result<ConfigServiceDirective> queryById(@RequestParam(name = "id", required = true) String id) {
ConfigServiceDirective configServiceDirective = configServiceDirectiveService.getById(id); ConfigServiceDirective configServiceDirective = new ConfigServiceDirective();
if (configServiceDirective == null) { configServiceDirective.setId(id);
List<ConfigServiceDirective> param = Lists.newArrayList();
param.add(configServiceDirective);
Page<ConfigServiceDirective> page = new Page<ConfigServiceDirective>(1, 10);
page.setRecords(param);
List<ConfigServiceDirective> result = configServiceDirectiveService.pageList(configServiceDirective, page);
if (result == null || result.size() < 1) {
return Result.error("未找到对应数据"); return Result.error("未找到对应数据");
} else {
return Result.OK(result.get(0));
} }
return Result.OK(configServiceDirective);
} }
/** /**

View File

@ -0,0 +1,41 @@
package com.nu.modules.servicedirective.entity;
import com.nu.modules.directivetag.body.entity.DirectiveBodyTag;
import com.nu.modules.directivetag.emotion.entity.DirectiveEmotionTag;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class TreeNode {
private String key;
private String title;
private String cycleTypeName;//周期类型
private int level;
private String instructionId;
private String categoryId;
private String typeId;
private String izEnabled;
private Integer sort;
private boolean canAdd;
private List<TreeNode> children = new ArrayList<>();
private List<DirectiveBodyTag> bodyTagList;
private List<DirectiveEmotionTag> emotionTagList;
public TreeNode(String instructionId,String categoryId,String typeId,String key, String title,int level,String cycleTypeName,String izEnabled,Integer sort,boolean canAdd) {
this.instructionId = instructionId;
this.categoryId = categoryId;
this.typeId = typeId;
this.key = key;
this.title = title;
this.level = level;
this.cycleTypeName = cycleTypeName;
this.izEnabled = izEnabled;
this.sort = sort;
this.canAdd = canAdd;
}
public void addChild(TreeNode node) { children.add(node); }
}

View File

@ -2,6 +2,11 @@ package com.nu.modules.servicedirective.mapper;
import java.util.List; import java.util.List;
import com.nu.modules.directivetag.body.entity.DirectiveBodyTag;
import com.nu.modules.directivetag.emotion.entity.DirectiveEmotionTag;
import com.nu.modules.instructiontag.entity.InstructionTag;
import com.nu.modules.servicecategory.entity.ConfigServiceCategory;
import com.nu.modules.servicetype.entity.ConfigServiceType;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import com.nu.modules.servicedirective.entity.ConfigServiceDirective; import com.nu.modules.servicedirective.entity.ConfigServiceDirective;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@ -63,4 +68,12 @@ public interface ConfigServiceDirectiveMapper extends BaseMapper<ConfigServiceDi
int queryCountByEmotionTagIds(@Param("tagIds") List<String> tagIds); int queryCountByEmotionTagIds(@Param("tagIds") List<String> tagIds);
int removeAll(); int removeAll();
List<ConfigServiceDirective> getActiveDirectivesWithTags();
List<InstructionTag> getUsedInstructionTags();
List<ConfigServiceCategory> getUsedCategories();
List<ConfigServiceType> getUsedTypes();
List<DirectiveBodyTag> getBodyTagsByDirective(@Param("id") String directiveId);
List<DirectiveEmotionTag> getEmotionTagsByDirective(@Param("id") String directiveId);
} }

View File

@ -147,4 +147,62 @@
<delete id="removeAll"> <delete id="removeAll">
delete from nu_config_service_directive delete from nu_config_service_directive
</delete> </delete>
<!-- Result map 映射 ConfigServiceDirective 包含标签列表 -->
<resultMap id="DirectiveWithTagsMap" type="com.nu.modules.servicedirective.entity.ConfigServiceDirective">
<id column="id" property="id" />
<result column="directive_name" property="directiveName" />
<result column="category_id" property="categoryId" />
<result column="type_id" property="typeId" />
<result column="cycle_type" property="cycleType" />
<!-- 一级、二级、三级 ID 可根据需要添加 -->
<collection property="bodyTagList" ofType="com.nu.modules.directivetag.body.entity.DirectiveBodyTag" select="getBodyTagsByDirective" column="id"/>
<collection property="emotionTagList" ofType="com.nu.modules.directivetag.emotion.entity.DirectiveEmotionTag" select="getEmotionTagsByDirective" column="id"/>
</resultMap>
<!-- 查询未删除的服务指令,并映射标签 -->
<select id="getActiveDirectivesWithTags" resultMap="DirectiveWithTagsMap">
SELECT id, instruction_tag_id, category_id, type_id, directive_name, sort, iz_enabled,cycle_type
FROM nu_config_service_directive
WHERE del_flag = '0'
ORDER BY sort ASC
</select>
<!-- 查询被使用的一、二、三级分类(包含已删除,只要存在未删指令引用) -->
<select id="getUsedInstructionTags" resultType="com.nu.modules.instructiontag.entity.InstructionTag">
SELECT id, instruction_name, sort, iz_enabled
FROM nu_config_service_instruction_tag
WHERE del_flag = '0'
ORDER BY sort ASC
</select>
<select id="getUsedCategories" resultType="com.nu.modules.servicecategory.entity.ConfigServiceCategory">
SELECT id, category_name, instruction_id, sort, iz_enabled
FROM nu_config_service_category
WHERE del_flag = '0'
ORDER BY sort ASC
</select>
<select id="getUsedTypes" resultType="com.nu.modules.servicetype.entity.ConfigServiceType">
SELECT id, type_name, instruction_id, category_id, sort, iz_enabled
FROM nu_config_service_type
WHERE del_flag = '0'
ORDER BY sort ASC
</select>
<!-- 查询标签中间表方法 -->
<select id="getBodyTagsByDirective" resultType="com.nu.modules.directivetag.body.entity.DirectiveBodyTag">
SELECT bt.id, bt.tag_name, bt.sort, bt.iz_enabled
FROM nu_config_body_tag bt
INNER JOIN nu_directive_body_tag dbt ON bt.id = dbt.tag_id
WHERE dbt.directive_id = #{directiveId}
</select>
<select id="getEmotionTagsByDirective" resultType="com.nu.modules.directivetag.emotion.entity.DirectiveEmotionTag">
SELECT et.id, et.tag_name, et.sort, et.iz_enabled
FROM nu_config_emotion_tag et
INNER JOIN nu_directive_emotion_tag det ON et.id = det.tag_id
WHERE det.directive_id = #{directiveId}
</select>
</mapper> </mapper>

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.nu.dto.DirectiveAsyncMQDto; import com.nu.dto.DirectiveAsyncMQDto;
import com.nu.modules.servicedirective.entity.ConfigServiceDirective; import com.nu.modules.servicedirective.entity.ConfigServiceDirective;
import com.nu.modules.servicedirective.entity.TreeNode;
import java.util.List; import java.util.List;
@ -60,4 +61,7 @@ public interface IConfigServiceDirectiveService extends IService<ConfigServiceDi
void handleMediaFile(ConfigServiceDirective configServiceDirective); void handleMediaFile(ConfigServiceDirective configServiceDirective);
void auditPass(DirectiveAsyncMQDto dto); void auditPass(DirectiveAsyncMQDto dto);
List<TreeNode> getTreeData();
} }

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Maps;
import com.nu.dto.DirectiveAsyncMQDto; import com.nu.dto.DirectiveAsyncMQDto;
import com.nu.modules.directivetag.body.entity.DirectiveBodyTag; import com.nu.modules.directivetag.body.entity.DirectiveBodyTag;
import com.nu.modules.directivetag.body.service.IDirectiveBodyTagService; import com.nu.modules.directivetag.body.service.IDirectiveBodyTagService;
@ -15,6 +16,7 @@ import com.nu.modules.instructiontag.service.IInstructionTagService;
import com.nu.modules.servicecategory.entity.ConfigServiceCategory; import com.nu.modules.servicecategory.entity.ConfigServiceCategory;
import com.nu.modules.servicecategory.service.IConfigServiceCategoryService; import com.nu.modules.servicecategory.service.IConfigServiceCategoryService;
import com.nu.modules.servicedirective.entity.ConfigServiceDirective; import com.nu.modules.servicedirective.entity.ConfigServiceDirective;
import com.nu.modules.servicedirective.entity.TreeNode;
import com.nu.modules.servicedirective.mapper.ConfigServiceDirectiveMapper; import com.nu.modules.servicedirective.mapper.ConfigServiceDirectiveMapper;
import com.nu.modules.servicedirective.service.IConfigServiceDirectiveService; import com.nu.modules.servicedirective.service.IConfigServiceDirectiveService;
import com.nu.modules.servicetype.entity.ConfigServiceType; import com.nu.modules.servicetype.entity.ConfigServiceType;
@ -23,6 +25,7 @@ import com.nu.modules.sysconfig.ISysConfigApi;
import com.nu.utils.RabbitMQUtil; import com.nu.utils.RabbitMQUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.DictModel;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -31,8 +34,7 @@ import org.springframework.stereotype.Service;
import java.io.File; import java.io.File;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.Arrays; import java.util.*;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -397,4 +399,73 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl<ConfigService
emotionTagService.update(emotionTag, emotionTagUW); emotionTagService.update(emotionTag, emotionTagUW);
}); });
} }
@Override
public List<TreeNode> getTreeData() {
//查询周期类型字典项备用
List<DictModel> period_type = sysBaseAPI.getDictItems("period_type");
Map<String, String> cycleTypeMap = Maps.newHashMap();
period_type.stream().forEach(p -> {
cycleTypeMap.put(p.getValue(), p.getLabel());
});
// 查询未删除并带标签的所有服务指令
List<ConfigServiceDirective> directives = baseMapper.getActiveDirectivesWithTags();
// typeId 分组
Map<String, List<ConfigServiceDirective>> directiveMap = directives.stream()
.collect(Collectors.groupingBy(ConfigServiceDirective::getTypeId));
// 获取被引用的各级分类
List<InstructionTag> instructions = baseMapper.getUsedInstructionTags();
List<ConfigServiceCategory> categories = baseMapper.getUsedCategories();
List<ConfigServiceType> types = baseMapper.getUsedTypes();
// 分组
Map<String, List<ConfigServiceCategory>> catMap = categories.stream()
.collect(Collectors.groupingBy(ConfigServiceCategory::getInstructionId));
Map<String, List<ConfigServiceType>> typeMap = types.stream()
.collect(Collectors.groupingBy(ConfigServiceType::getCategoryId));
List<TreeNode> tree = new ArrayList<>();
boolean canAdd = true;
for (InstructionTag inst : instructions) {
canAdd = "0".equals(inst.getIzEnabled());
TreeNode instNode = new TreeNode(inst.getId(), "", "", inst.getId(), inst.getInstructionName(), 1, "", inst.getIzEnabled(), inst.getSort(), canAdd);
List<ConfigServiceCategory> catList = catMap.get(inst.getId());
if (catList != null) {
catList.sort(Comparator.comparingInt(ConfigServiceCategory::getSort));
for (ConfigServiceCategory cat : catList) {
if (canAdd) {
canAdd = "0".equals(cat.getIzEnabled());
}
TreeNode catNode = new TreeNode(inst.getId(), cat.getId(), "", cat.getId(), cat.getCategoryName(), 2, "", cat.getIzEnabled(), cat.getSort(), canAdd);
List<ConfigServiceType> typeList = typeMap.get(cat.getId());
if (typeList != null) {
typeList.sort(Comparator.comparingInt(ConfigServiceType::getSort));
for (ConfigServiceType tp : typeList) {
if (canAdd) {
canAdd = "0".equals(tp.getIzEnabled());
}
TreeNode typeNode = new TreeNode(inst.getId(), cat.getId(), tp.getId(), tp.getId(), tp.getTypeName(), 3, "", tp.getIzEnabled(), tp.getSort(), canAdd);
List<ConfigServiceDirective> dirList = directiveMap.get(tp.getId());
if (dirList != null) {
dirList.sort(Comparator.comparingInt(ConfigServiceDirective::getSort));
for (ConfigServiceDirective dir : dirList) {
TreeNode dirNode = new TreeNode(inst.getId(), cat.getId(), tp.getId(), dir.getId(), dir.getDirectiveName(), 4, cycleTypeMap.get(dir.getCycleType()), dir.getIzEnabled(), dir.getSort(), canAdd);
dirNode.setBodyTagList(dir.getBodyTagList());
dirNode.setEmotionTagList(dir.getEmotionTagList());
typeNode.addChild(dirNode);
}
}
catNode.addChild(typeNode);
}
}
instNode.addChild(catNode);
}
}
tree.add(instNode);
}
return tree;
}
} }

View File

@ -255,7 +255,7 @@ jeecg:
app: http://localhost:8051 app: http://localhost:8051
path: path:
#文件上传根目录 设置 #文件上传根目录 设置
upload: /cache/nu/opt/upFiles002 upload: /cache/nu/opt/upFiles102
#webapp文件路径 #webapp文件路径
webapp: /cache/nu/opt/webapp002 webapp: /cache/nu/opt/webapp002
shiro: shiro:

View File

@ -255,7 +255,7 @@ jeecg:
app: http://localhost:8051 app: http://localhost:8051
path: path:
#文件上传根目录 设置 #文件上传根目录 设置
upload: /cache/nu/opt/upFiles003 upload: /cache/nu/opt/upFiles103
#webapp文件路径 #webapp文件路径
webapp: /cache/nu/opt/webapp003 webapp: /cache/nu/opt/webapp003
shiro: shiro: