Browse Source

标签管理/字典管理/标签cache/字典cache

master
liuxinxin 1 year ago
parent
commit
f84ca1d210
61 changed files with 1760 additions and 94 deletions
  1. +32
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/common/constant/BoolDisplayEnum.java
  2. +6
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/common/util/BizUtils.java
  3. +0
    -16
      pmapi/src/main/java/com/ningdatech/pmapi/dictionary/service/IMetaDictionaryService.java
  4. +0
    -20
      pmapi/src/main/java/com/ningdatech/pmapi/dictionary/service/impl/MetaDictionaryServiceImpl.java
  5. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/expert/entity/ExpertUserFullInfo.java
  6. +36
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/assembler/MetaDictionaryAssembler.java
  7. +62
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/assembler/MetaTagAssembler.java
  8. +53
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/DictAllTypeEnum.java
  9. +70
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/DictExpertInfoTypeEnum.java
  10. +51
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/ExpertTagEnum.java
  11. +21
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/TagConst.java
  12. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/ExpertDictionaryController.java
  13. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/ExpertTagController.java
  14. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/MetaDictionaryController.java
  15. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/MetaTagController.java
  16. +79
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/MetaTagManageController.java
  17. +49
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/DictionaryCache.java
  18. +55
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/TagCache.java
  19. +54
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/basic/AbstractDictionaryCache.java
  20. +97
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/basic/AbstractTagsCache.java
  21. +40
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/impl/DictionaryCacheImpl.java
  22. +105
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/impl/TagsCacheImpl.java
  23. +289
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/manage/MetaManage.java
  24. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertDictionaryMapper.java
  25. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertDictionaryMapper.xml
  26. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertTagMapper.java
  27. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertTagMapper.xml
  28. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaDictionaryMapper.java
  29. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaDictionaryMapper.xml
  30. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaTagMapper.java
  31. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaTagMapper.xml
  32. +36
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/ExpertRegionInfo.java
  33. +24
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/bo/RegionContainsBO.java
  34. +40
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/dto/DictionaryDTO.java
  35. +37
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/dto/TagDTO.java
  36. +42
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/dto/TagTreeDTO.java
  37. +1
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/ExpertDictionary.java
  38. +1
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/ExpertTag.java
  39. +1
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/MetaDictionary.java
  40. +1
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/MetaTag.java
  41. +37
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/AddDictionaryRequest.java
  42. +20
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/AddTagTypeRequest.java
  43. +19
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/DictionaryListRequest.java
  44. +14
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/ReqTagListPO.java
  45. +14
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/TagListRequest.java
  46. +24
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/TagQueryRequest.java
  47. +25
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/DictionaryListVO.java
  48. +49
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/DictionaryVO.java
  49. +41
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/TagListVO.java
  50. +58
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/TagTreeVO.java
  51. +23
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/TagTypeVO.java
  52. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IExpertDictionaryService.java
  53. +2
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IExpertTagService.java
  54. +22
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IMetaDictionaryService.java
  55. +7
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IMetaTagService.java
  56. +4
    -4
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/ExpertDictionaryServiceImpl.java
  57. +4
    -4
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/ExpertTagServiceImpl.java
  58. +32
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/MetaDictionaryServiceImpl.java
  59. +33
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/MetaTagServiceImpl.java
  60. +31
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/meta/validate/TagListRequestValidator.java
  61. +0
    -20
      pmapi/src/main/java/com/ningdatech/pmapi/tag/service/impl/MetaTagServiceImpl.java

+ 32
- 0
pmapi/src/main/java/com/ningdatech/pmapi/common/constant/BoolDisplayEnum.java View File

@@ -0,0 +1,32 @@
package com.ningdatech.pmapi.common.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* @author liuxinxin
* @date 2022/7/26 上午9:21
*/
@AllArgsConstructor
@Getter
public enum BoolDisplayEnum {

/**
* true
*/
Y,

/**
* false
*/
N;

public static boolean judgeBoolean(String key) {
return Y.name().equals(key);
}

public static BoolDisplayEnum judgeBoolean(boolean key) {
return key ? Y : N;
}

}

+ 6
- 0
pmapi/src/main/java/com/ningdatech/pmapi/common/util/BizUtils.java View File

@@ -8,6 +8,7 @@ import org.springframework.util.NumberUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.stream.Collectors;

@@ -63,4 +64,9 @@ public class BizUtils {
}
return result;
}

public static String uuid32() {
return UUID.randomUUID().toString().replace("-", "");
}

}

+ 0
- 16
pmapi/src/main/java/com/ningdatech/pmapi/dictionary/service/IMetaDictionaryService.java View File

@@ -1,16 +0,0 @@
package com.ningdatech.pmapi.dictionary.service;

import com.ningdatech.pmapi.dictionary.entity.MetaDictionary;
import com.baomidou.mybatisplus.extension.service.IService;

/**
* <p>
* 服务类
* </p>
*
* @author Liuxinxin
* @since 2023-02-22
*/
public interface IMetaDictionaryService extends IService<MetaDictionary> {

}

+ 0
- 20
pmapi/src/main/java/com/ningdatech/pmapi/dictionary/service/impl/MetaDictionaryServiceImpl.java View File

@@ -1,20 +0,0 @@
package com.ningdatech.pmapi.dictionary.service.impl;

import com.ningdatech.pmapi.dictionary.entity.MetaDictionary;
import com.ningdatech.pmapi.dictionary.mapper.MetaDictionaryMapper;
import com.ningdatech.pmapi.dictionary.service.IMetaDictionaryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
* <p>
* 服务实现类
* </p>
*
* @author Liuxinxin
* @since 2023-02-22
*/
@Service
public class MetaDictionaryServiceImpl extends ServiceImpl<MetaDictionaryMapper, MetaDictionary> implements IMetaDictionaryService {

}

+ 1
- 1
pmapi/src/main/java/com/ningdatech/pmapi/expert/entity/ExpertUserFullInfo.java View File

@@ -93,7 +93,7 @@ public class ExpertUserFullInfo implements Serializable {

private String regionCode;

private String regionLevel;
private Integer regionLevel;

private String recommendedWay;



+ 36
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/assembler/MetaDictionaryAssembler.java View File

@@ -0,0 +1,36 @@
package com.ningdatech.pmapi.meta.assembler;


import com.ningdatech.pmapi.meta.model.entity.MetaDictionary;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;
import com.ningdatech.pmapi.meta.model.vo.DictionaryVO;

/**
* @author liuxinxin
* @date 2022/7/22 上午10:53
*/

public class MetaDictionaryAssembler {

public static DictionaryDTO toDictionaryDTO(MetaDictionary dictionaryManage) {
DictionaryDTO dictionaryDTO = new DictionaryDTO();
dictionaryDTO.setDescribe(dictionaryManage.getDictionaryDescribe());
dictionaryDTO.setDictionaryCode(dictionaryManage.getDictionaryCode());
dictionaryDTO.setDictionaryType(dictionaryManage.getDictionaryType());
dictionaryDTO.setName(dictionaryManage.getDictionaryName());
dictionaryDTO.setReadonly(dictionaryManage.getReadonly());
dictionaryDTO.setSortValue(dictionaryManage.getSortValue());
return dictionaryDTO;
}

public static DictionaryVO toDictionaryVO(DictionaryDTO dictionaryDTO) {
DictionaryVO dictionaryVO = new DictionaryVO();
dictionaryVO.setDescribe(dictionaryDTO.getDescribe());
dictionaryVO.setDictionaryCode(dictionaryDTO.getDictionaryCode());
dictionaryVO.setDictionaryType(dictionaryDTO.getDictionaryType());
dictionaryVO.setName(dictionaryDTO.getName());
dictionaryVO.setReadonly(dictionaryDTO.getReadonly());
dictionaryVO.setSortValue(dictionaryDTO.getSortValue());
return dictionaryVO;
}
}

+ 62
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/assembler/MetaTagAssembler.java View File

@@ -0,0 +1,62 @@
package com.ningdatech.pmapi.meta.assembler;

import com.ningdatech.pmapi.meta.model.entity.MetaTag;
import com.ningdatech.pmapi.meta.model.dto.TagDTO;
import com.ningdatech.pmapi.meta.model.dto.TagTreeDTO;
import com.ningdatech.pmapi.meta.model.vo.TagTreeVO;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author liuxinxin
* @date 2022/7/22 上午9:57
*/

public class MetaTagAssembler {

public static TagDTO toTagDTO(MetaTag metaTagManage) {
TagDTO tagDTO = new TagDTO();
tagDTO.setParentCode(metaTagManage.getParentCode());
tagDTO.setTagCode(metaTagManage.getTagCode());
tagDTO.setTagLevel(metaTagManage.getTagLevel());
tagDTO.setTagName(metaTagManage.getTagName());
return tagDTO;
}

public static List<TagTreeDTO> toTagTreeDTOList(List<TagDTO> tagDTOList) {
if (CollectionUtils.isEmpty(tagDTOList)) {
return new ArrayList<>();
}
return tagDTOList.stream().map(MetaTagAssembler::toTagTreeDTO).collect(Collectors.toList());

}

public static TagTreeDTO toTagTreeDTO(TagDTO tagDTO) {
TagTreeDTO tagTreeDTO = new TagTreeDTO();
tagTreeDTO.setParentCode(tagDTO.getParentCode());
tagTreeDTO.setTagCode(tagDTO.getTagCode());
tagTreeDTO.setTagLevel(tagDTO.getTagLevel());
tagTreeDTO.setTagName(tagDTO.getTagName());
return tagTreeDTO;
}

public static List<TagTreeVO> toTagTreeVOList(List<TagTreeDTO> tagTreeDTOList) {
List<TagTreeVO> tagTreeVOList = new ArrayList<>();
for (TagTreeDTO tagTreeDTO : tagTreeDTOList) {
TagTreeVO tagTreeVO = new TagTreeVO();
tagTreeVO.setTagLevel(tagTreeDTO.getTagLevel());
tagTreeVO.setTagName(tagTreeDTO.getTagName());
tagTreeVO.setParentCode(tagTreeDTO.getParentCode());
tagTreeVO.setTagCode(tagTreeDTO.getTagCode());
tagTreeVO.setUnionCode(tagTreeDTO.getTagName() + "##" + tagTreeDTO.getTagCode());
if (CollectionUtils.isNotEmpty(tagTreeDTO.getChildren())) {
tagTreeVO.setChildren(toTagTreeVOList(tagTreeDTO.getChildren()));
}
tagTreeVOList.add(tagTreeVO);
}
return tagTreeVOList;
}
}

+ 53
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/DictAllTypeEnum.java View File

@@ -0,0 +1,53 @@
package com.ningdatech.pmapi.meta.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

/**
* @author liuxinxin
* @date 2022/7/21 下午6:08
*/
@AllArgsConstructor
@Getter
public enum DictAllTypeEnum {

// 政治面貌
POLITICAL("political"),
// 专家来源
EXPERT_SOURCE("expert_source"),
// 学历
EDU("edu"),
// 学位
DEGREE("degree"),
// 在职状态
JOB_STATUS("job_status"),
// 行政职级
ADMINISTRATIVE_RANK("administrative_rank"),
// 内外围(专家类型)
EXPERT_TYPE("expert_type"),
// 单位类型
COMPANY_ATTRIBUTE("company_attribute"),
// 职称级别
TITLE_LEVEL("title_level"),
// 通知类型
NOTICE_TYPE("notice_type"),
// 会议类型
MEETING_TYPE("meeting_type");

private final String key;


public static boolean contains(String key) {
if (StringUtils.isBlank(key)) {
return false;
}
for (DictAllTypeEnum typeEnum : DictAllTypeEnum.values()) {
if (typeEnum.key.equals(key)) {
return true;
}
}
return false;
}

}

+ 70
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/DictExpertInfoTypeEnum.java View File

@@ -0,0 +1,70 @@
package com.ningdatech.pmapi.meta.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/21 下午6:08
*/
@AllArgsConstructor
@Getter
public enum DictExpertInfoTypeEnum {

// 政治面貌
POLITICAL("political"),
// 学历
EDU("edu"),
// 学位
DEGREE("degree"),
// 在职状态
JOB_STATUS("job_status"),
// 行政职级
ADMINISTRATIVE_RANK("administrative_rank"),
// 内外围(专家类型)
EXPERT_TYPE("expert_type"),
// 单位类型
COMPANY_ATTRIBUTE("company_attribute"),
// 职称级别
TITLE_LEVEL("title_level"),
// 推荐方式
RECOMMENDED_WAY("recommended_way");


private final String key;

public static List<String> getAll() {
List<String> dictionaryList = new ArrayList<>();
DictExpertInfoTypeEnum[] values = DictExpertInfoTypeEnum.values();
for (DictExpertInfoTypeEnum typeEnum : values) {
dictionaryList.add(typeEnum.key);
}
return dictionaryList;
}

public static boolean contains(String key) {
if (StringUtils.isBlank(key)) {
return false;
}
for (DictExpertInfoTypeEnum typeEnum : DictExpertInfoTypeEnum.values()) {
if (typeEnum.key.equals(key)) {
return true;
}
}
return false;
}

public static DictExpertInfoTypeEnum of(String key) {
for (DictExpertInfoTypeEnum statusEnum : DictExpertInfoTypeEnum.values()) {
if (statusEnum.key.equals(key)) {
return statusEnum;
}
}
throw new IllegalArgumentException(String.format("Illegal DictionaryExpertInfoTypeEnum = %s", key));
}

}

+ 51
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/ExpertTagEnum.java View File

@@ -0,0 +1,51 @@
package com.ningdatech.pmapi.meta.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/22 上午11:13
*/
@AllArgsConstructor
@Getter
public enum ExpertTagEnum {

// 专家来源
EXPERT_SOURCE("expert_source"),
// 擅长方向
GOOD_AT("good_at"),
// 技术专长
TECHNICAL_EXPERTISE("technical_expertise"),
// 行业领域
INDUSTRY_SECTOR("industry_sector"),
// 其他
OTHER("other");

private final String key;

public static List<String> getAll() {
List<String> tagList = new ArrayList<>();
ExpertTagEnum[] values = ExpertTagEnum.values();
for (ExpertTagEnum fieldEnum : values) {
tagList.add(fieldEnum.key);
}
return tagList;
}

public static boolean contains(String key) {
if (StringUtils.isBlank(key)) {
return false;
}
for (ExpertTagEnum fieldEnum : ExpertTagEnum.values()) {
if (fieldEnum.key.equals(key)) {
return true;
}
}
return false;
}
}

+ 21
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/constant/TagConst.java View File

@@ -0,0 +1,21 @@
package com.ningdatech.pmapi.meta.constant;

/**
* @author liuxinxin
* @date 2022/8/27 下午1:49
*/

public class TagConst {

private TagConst() {
}

/**
* 标签类型顶级时 parent_code 为 -1
*/
public static final String TAG_ROOT_PARENT_CODE = "-1";

public static final Long TAG_ROOT_LEVEL = 1L;

public static final String TAG_CREATOR = "管理员";
}

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/controller/ExpertDictionaryController.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/ExpertDictionaryController.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.dictionary.controller;
package com.ningdatech.pmapi.meta.controller;


import org.springframework.web.bind.annotation.RequestMapping;

pmapi/src/main/java/com/ningdatech/pmapi/tag/controller/ExpertTagController.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/ExpertTagController.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.tag.controller;
package com.ningdatech.pmapi.meta.controller;


import org.springframework.web.bind.annotation.RequestMapping;

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/controller/MetaDictionaryController.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/MetaDictionaryController.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.dictionary.controller;
package com.ningdatech.pmapi.meta.controller;


import org.springframework.web.bind.annotation.RequestMapping;

pmapi/src/main/java/com/ningdatech/pmapi/tag/controller/MetaTagController.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/MetaTagController.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.tag.controller;
package com.ningdatech.pmapi.meta.controller;


import org.springframework.web.bind.annotation.RequestMapping;

+ 79
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/controller/MetaTagManageController.java View File

@@ -0,0 +1,79 @@
package com.ningdatech.pmapi.meta.controller;


import com.ningdatech.pmapi.meta.manage.MetaManage;
import com.ningdatech.pmapi.meta.model.po.AddTagTypeRequest;
import com.ningdatech.pmapi.meta.model.po.ReqTagListPO;
import com.ningdatech.pmapi.meta.model.po.TagQueryRequest;
import com.ningdatech.pmapi.meta.model.vo.TagListVO;
import com.ningdatech.pmapi.meta.model.vo.TagTreeVO;
import com.ningdatech.pmapi.meta.model.vo.TagTypeVO;
import com.ningdatech.pmapi.meta.validate.TagListRequestValidator;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;

/**
* <p>
* 前端控制器
* </p>
*
* @author liuxinxin
* @since 2022-07-21
*/
@RestController
@Validated
@RequiredArgsConstructor
@RequestMapping("/api/v1/meta")
@Api(value = "MetaController", tags = "基础数据接口")
public class MetaTagManageController {

/**
* 专家标签的缓存时间设置为5分钟,单位秒
*/
private static final Long MAX_AGE = 5 * 60L;
/**
* max-age=86400
*/
private static final String MAX_AGE_STR = "max-age=" + MAX_AGE;
private final MetaManage metaManage;

@PostMapping("/tag")
@ApiOperation("获取专家标签的树状结构")
public List<TagTreeVO> getRegionTree(HttpServletResponse response, @RequestBody ReqTagListPO request) {
response.setHeader("Cache-Control", MAX_AGE_STR);
TagListRequestValidator.tagListRequestValidator(request);
return metaManage.getTagTree(request);
}

@PostMapping("/tag/query")
@ApiOperation("标签查询接口")
public List<TagListVO> tagQuery(@Valid @RequestBody TagQueryRequest tagQueryRequest) {
return metaManage.tagQuery(tagQueryRequest);
}

@PostMapping("/tag-tyoe/list")
@ApiOperation("获取标签分类列表")
public List<TagTypeVO> tagTypeList() {
return metaManage.tagTypeList();
}

@PostMapping("/add/tag-type")
@ApiOperation("新增标签分类")
public void addTagType(@Valid @RequestBody AddTagTypeRequest request) {
metaManage.addTagType(request);
}

@PostMapping("/remove/tag/{tagCode}")
@ApiOperation("删除标签")
public void removeTagName(@PathVariable String tagCode) {
metaManage.removeTagName(tagCode);
}

}

+ 49
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/DictionaryCache.java View File

@@ -0,0 +1,49 @@
package com.ningdatech.pmapi.meta.helper;



import com.ningdatech.pmapi.meta.constant.DictAllTypeEnum;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/12/22 上午11:03
*/

public interface DictionaryCache {

/**
* 根据字典类型枚举 获取 字典列表
*
* @param dictionaryType
* @return
*/
List<DictionaryDTO> getDictionaryListByDictionaryType(DictAllTypeEnum dictionaryType);

/**
* 根据字典类型 获取 字典列表
*
* @param dictionaryType
* @return
*/
List<DictionaryDTO> getDictionaryListByDictionaryType(String dictionaryType);

/**
* 根据字典类型、字典编码 获取 字典实体
*
* @param dictionaryType
* @param code
* @return
*/
DictionaryDTO getDictionaryByDictionaryType(DictAllTypeEnum dictionaryType, String code);

/**
* 根据字典编码 获取 字典实体
*
* @param dictionaryCode
* @return
*/
DictionaryDTO getByCode(String dictionaryCode);
}

+ 55
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/TagCache.java View File

@@ -0,0 +1,55 @@
package com.ningdatech.pmapi.meta.helper;


import com.ningdatech.pmapi.meta.model.dto.TagDTO;
import com.ningdatech.pmapi.meta.model.dto.TagTreeDTO;

import java.util.List;
import java.util.Map;

/**
* @author liuxinxin
* @date 2022/12/22 上午11:56
*/

public interface TagCache {

/**
* @param level 最多几级标签
* @param rootTagCode 根标签类型及对应的字段类型
* @return
*/
TagTreeDTO getTagTreeDTO(int level, String rootTagCode);

/**
* 根据标签编码获取 实体类
*
* @param tagCode
* @return
*/
TagDTO getByTagCode(String tagCode);

/**
* 导入原专家库数据使用
*
* @return
*/
Map<String, TagDTO> getNameTagDtoMap();

/**
* 获取所有子节点包含当前节点
*
* @param code 标签编码
* @return
*/
List<TagTreeDTO> listChildren(String code);

/**
* 获取所有子节点包含当前节点的编码
*
* @param code 标签编码
* @return
*/
List<String> listChildrenCodes(String code);

}

+ 54
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/basic/AbstractDictionaryCache.java View File

@@ -0,0 +1,54 @@
package com.ningdatech.pmapi.meta.helper.basic;

import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.ningdatech.pmapi.meta.service.IMetaDictionaryService;
import com.ningdatech.pmapi.meta.constant.DictAllTypeEnum;
import com.ningdatech.pmapi.meta.helper.DictionaryCache;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
* @author liuxinxin
* @date 2022/12/22 上午11:03
*/
public abstract class AbstractDictionaryCache implements InitializingBean, DictionaryCache {

@Autowired
private IMetaDictionaryService iMetaDictionaryService;

protected Map<String, DictionaryDTO> dictionaryMap;
protected LoadingCache<String, List<DictionaryDTO>> dictionaryCacheHelper;

@Override
public void afterPropertiesSet() {
dictionaryCacheHelper = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES)
.refreshAfterWrite(5, TimeUnit.MINUTES).build(key -> {
List<DictionaryDTO> dictionaryDTOList = iMetaDictionaryService.queryAll();
dictionaryMap = buildCateMap(dictionaryDTOList);
Map<String, List<DictionaryDTO>> dictionaryTypeListMap = dictionaryDTOList.stream().collect(Collectors.groupingBy(DictionaryDTO::getDictionaryType));
return dictionaryTypeListMap.get(key);
});
warmUp();
}

private Map<String, DictionaryDTO> buildCateMap(List<DictionaryDTO> dictionaryDTOList) {
Map<String, DictionaryDTO> dictionaryDtoMap = new ConcurrentHashMap<>(128);
dictionaryDTOList.forEach(dictionaryDTO -> dictionaryDtoMap.put(dictionaryDTO.getDictionaryCode(), dictionaryDTO));
return dictionaryDtoMap;
}

private void warmUp() {
for (DictAllTypeEnum typeEnum : DictAllTypeEnum.values()) {
dictionaryCacheHelper.get(typeEnum.getKey());
}
}

}

+ 97
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/basic/AbstractTagsCache.java View File

@@ -0,0 +1,97 @@
package com.ningdatech.pmapi.meta.helper.basic;

import cn.hutool.core.lang.Assert;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.ningdatech.pmapi.meta.assembler.MetaTagAssembler;
import com.ningdatech.pmapi.meta.helper.TagCache;
import com.ningdatech.pmapi.meta.model.dto.TagDTO;
import com.ningdatech.pmapi.meta.model.dto.TagTreeDTO;
import com.ningdatech.pmapi.meta.service.IMetaTagService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
* @author liuxinxin
* @date 2022/12/22 上午11:56
*/
public abstract class AbstractTagsCache implements InitializingBean, TagCache {

protected static final int MAX_LEVEL = 4;

@Autowired
private IMetaTagService iMetaTagService;

protected LoadingCache<String, List<TagTreeDTO>> tagsCache;

protected Map<String, TagDTO> tagDtoMap;

@Override
public void afterPropertiesSet() {
tagsCache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES)
.refreshAfterWrite(5, TimeUnit.MINUTES)
.build(key -> {
// 查询全部
List<TagDTO> tagDTOList = iMetaTagService.queryAll();
// TODO 临时关闭校验
// Assert.isTrue(CollectionUtils.isNotEmpty(tagDTOList), "MetaTags queryAll is Empty");
tagDtoMap = buildCateMap(tagDTOList);
List<TagDTO> tagInLevel = tagDTOList.stream().filter(tagDto -> {
// 只过滤出小于等于level的tag
if (Objects.isNull(tagDto.getTagLevel())) {
return false;
}
return Integer.parseInt(key) >= tagDto.getTagLevel();
}).collect(Collectors.toList());
List<TagTreeDTO> treeDtos = MetaTagAssembler.toTagTreeDTOList(tagInLevel);
return toTreeStructure(treeDtos);
});
warmUp();
}

private Map<String, TagDTO> buildCateMap(List<TagDTO> tagDTOList) {
Map<String, TagDTO> tagDtoMapTemp = new ConcurrentHashMap<>(1024);
tagDTOList.forEach(tagDTO -> tagDtoMapTemp.put(tagDTO.getTagCode(), tagDTO));
return tagDtoMapTemp;
}

private List<TagTreeDTO> toTreeStructure(List<TagTreeDTO> rootList) {
List<TagTreeDTO> nodeList = new ArrayList<>();
for (TagTreeDTO tagTreeDTO : rootList) {
if ("-1".equals(tagTreeDTO.getParentCode()) || Objects.isNull(tagTreeDTO.getParentCode())) {
nodeList.add(tagTreeDTO);
}
tagTreeDTO.setChildren(getChildren(tagTreeDTO.getTagCode(), rootList));
}
return nodeList;
}

public void warmUp() {
for (int level = 1; level <= MAX_LEVEL; level++) {
tagsCache.get(level + "");
}
}

protected List<TagTreeDTO> getChildren(String tagCode, List<TagTreeDTO> list) {
List<TagTreeDTO> childList = new ArrayList<>();
for (TagTreeDTO tagTreeDTO : list) {
if (tagCode.equals(tagTreeDTO.getParentCode())) {
childList.add(tagTreeDTO);
}
}
for (TagTreeDTO tagTreeDTO : childList) {
tagTreeDTO.setChildren(getChildren(tagTreeDTO.getTagCode(), list));
}
if (CollectionUtils.isEmpty(childList)) {
return Collections.emptyList();
}
return childList;
}

}

+ 40
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/impl/DictionaryCacheImpl.java View File

@@ -0,0 +1,40 @@
package com.ningdatech.pmapi.meta.helper.impl;

import com.ningdatech.pmapi.meta.constant.DictAllTypeEnum;
import com.ningdatech.pmapi.meta.helper.basic.AbstractDictionaryCache;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Objects;

/**
* @author liuxinxin
* @date 2022/7/22 上午10:47
*/
@Component
public class DictionaryCacheImpl extends AbstractDictionaryCache {

@Override
public List<DictionaryDTO> getDictionaryListByDictionaryType(DictAllTypeEnum dictionaryType) {
return dictionaryCacheHelper.get(dictionaryType.getKey());
}

@Override
public List<DictionaryDTO> getDictionaryListByDictionaryType(String dictionaryType) {
return dictionaryCacheHelper.get(dictionaryType);
}

@Override
public DictionaryDTO getDictionaryByDictionaryType(DictAllTypeEnum dictionaryType, String code) {
return Objects.requireNonNull(dictionaryCacheHelper.get(dictionaryType.getKey()))
.stream().filter(w -> w.getDictionaryCode().equals(code))
.findFirst().orElse(null);
}

@Override
public DictionaryDTO getByCode(String dictionaryCode) {
return dictionaryMap.get(dictionaryCode);
}

}

+ 105
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/helper/impl/TagsCacheImpl.java View File

@@ -0,0 +1,105 @@
package com.ningdatech.pmapi.meta.helper.impl;

import cn.hutool.core.bean.BeanUtil;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.pmapi.meta.helper.basic.AbstractTagsCache;
import com.ningdatech.pmapi.meta.model.dto.TagDTO;
import com.ningdatech.pmapi.meta.model.dto.TagTreeDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author liuxinxin
* @date 2022/7/22 上午9:51
* 标签树
*/
@Slf4j
@Component
public class TagsCacheImpl extends AbstractTagsCache {

@Override
public TagTreeDTO getTagTreeDTO(int level, String rootTagCode) {
List<TagTreeDTO> tagTreeDtos = tagsCache.get(level + "");
for (TagTreeDTO tagTreeDTO : tagTreeDtos) {
if (tagTreeDTO.getTagCode().equals(rootTagCode)) {
return tagTreeDTO;
}
}
throw new BizException("rootTagCode not exist");
}

@Override
public TagDTO getByTagCode(String tagCode) {
return tagDtoMap.get(tagCode);
}

/**
* 导入原专家库数据使用
*
* @return
*/
@Override
public Map<String, TagDTO> getNameTagDtoMap() {
Map<String, TagDTO> nameTagDtoMap = new HashMap<>(1024);
for (String key : tagDtoMap.keySet()) {
nameTagDtoMap.put(tagDtoMap.get(key).getTagName(), tagDtoMap.get(key));
}
return nameTagDtoMap;
}


/**
* 获取所有子节点包含当前节点
*
* @param code 标签编码
* @return java.util.List<com.ningdatech.emapi.meta.entity.dto.TagTreeDTO>
* @author WendyYang
**/
@Override
public List<TagTreeDTO> listChildren(String code) {
List<TagTreeDTO> allTree = tagsCache.get(String.valueOf(MAX_LEVEL));
assert allTree != null;
List<TagTreeDTO> children = getChildren(code, allTree);
TagDTO tagDTO = tagDtoMap.get(code);
TagTreeDTO rootNode = BeanUtil.copyProperties(tagDTO, TagTreeDTO.class);
rootNode.setChildren(children);
return treeToList(rootNode);
}

/**
* 获取所有子节点包含当前节点的编码
*
* @param code 标签编码
* @return java.util.List<com.ningdatech.emapi.meta.entity.dto.TagTreeDTO>
* @author WendyYang
**/
@Override
public List<String> listChildrenCodes(String code) {
return CollUtils.fieldList(listChildren(code), TagTreeDTO::getTagCode);
}

/**
* tree -> list
*
* @param tagTreeDTO 树节点
* @return java.util.List<com.ningdatech.emapi.meta.entity.dto.TagTreeDTO>
* @author WendyYang
**/
private List<TagTreeDTO> treeToList(TagTreeDTO tagTreeDTO) {
List<TagTreeDTO> result = new ArrayList<>();
result.add(tagTreeDTO);
if (tagTreeDTO.getChildren() != null && tagTreeDTO.getChildren().size() > 0) {
tagTreeDTO.getChildren().forEach(node -> {
result.addAll(treeToList(node));
});
}
return result;
}

}

+ 289
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/manage/MetaManage.java View File

@@ -0,0 +1,289 @@
package com.ningdatech.pmapi.meta.manage;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.pmapi.common.constant.BoolDisplayEnum;
import com.ningdatech.pmapi.common.util.BizUtils;
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary;
import com.ningdatech.pmapi.meta.model.entity.MetaDictionary;
import com.ningdatech.pmapi.meta.service.IExpertDictionaryService;
import com.ningdatech.pmapi.meta.service.IMetaDictionaryService;
import com.ningdatech.pmapi.meta.assembler.MetaDictionaryAssembler;
import com.ningdatech.pmapi.meta.assembler.MetaTagAssembler;
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum;
import com.ningdatech.pmapi.meta.constant.ExpertTagEnum;
import com.ningdatech.pmapi.meta.constant.TagConst;
import com.ningdatech.pmapi.meta.model.entity.ExpertTag;
import com.ningdatech.pmapi.meta.model.entity.MetaTag;
import com.ningdatech.pmapi.meta.helper.DictionaryCache;
import com.ningdatech.pmapi.meta.helper.TagCache;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;
import com.ningdatech.pmapi.meta.model.dto.TagTreeDTO;
import com.ningdatech.pmapi.meta.model.po.*;
import com.ningdatech.pmapi.meta.model.vo.*;
import com.ningdatech.pmapi.meta.service.IExpertTagService;
import com.ningdatech.pmapi.meta.service.IMetaTagService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
* @author liuxinxin
* @date 2023/2/22 下午2:34
*/
@Component
@RequiredArgsConstructor
public class MetaManage {

// private final RegionCache regionCache;
private final DictionaryCache dictionaryCache;
private final TagCache tagCache;
private final IMetaDictionaryService metaDictionaryManageService;
private final IExpertDictionaryService iExpertDictionaryService;
private final IMetaTagService iMetaTagManageService;
private final IExpertTagService iExpertTagService;

// public List<RegionTreeVO> getRegionTree() {
// List<RegionTreeDTO> regionTreeDtos = regionCache.getAll();
// return MetaRegionAssembler.toRegionTreeVOList(regionTreeDtos);
// }

public List<DictionaryListVO> getDictionaryList(DictionaryListRequest request) {
List<String> dictionaryTypeList = request.getDictionaryTypeList();
if (CollectionUtils.isEmpty(dictionaryTypeList)) {
dictionaryTypeList = DictExpertInfoTypeEnum.getAll();
}

List<DictionaryListVO> dictionaryListVos = new ArrayList<>();
for (String dictionaryType : dictionaryTypeList) {
DictionaryListVO dictionaryListVO = new DictionaryListVO();
dictionaryListVO.setDictionaryName(dictionaryType);
List<DictionaryDTO> dictionaryList = dictionaryCache.getDictionaryListByDictionaryType(dictionaryType);
List<DictionaryVO> dictionaryVOList = dictionaryList.stream()
.map(MetaDictionaryAssembler::toDictionaryVO).collect(Collectors.toList());
dictionaryListVO.setDictionaryList(dictionaryVOList);
dictionaryListVos.add(dictionaryListVO);
}
return dictionaryListVos;
}

public List<DictionaryListVO> commonDictList(DictionaryListRequest request) {
List<DictionaryListVO> result = new ArrayList<>();
if (request.getAllDict()) {
Map<String, List<MetaDictionary>> groupByType = CollUtils.group(metaDictionaryManageService.list(), MetaDictionary::getDictionaryType);
groupByType.forEach((k, v) -> {
DictionaryListVO dictionaryListVO = new DictionaryListVO();
dictionaryListVO.setDictionaryName(k);
List<DictionaryVO> dictionaryVOList = v.stream()
.map(w -> {
DictionaryVO vo = new DictionaryVO();
vo.setDescribe(w.getDictionaryDescribe());
vo.setDictionaryCode(w.getDictionaryCode());
vo.setDictionaryType(w.getDictionaryType());
vo.setName(w.getDictionaryName());
vo.setReadonly(w.getReadonly());
vo.setSortValue(w.getSortValue());
return vo;
}).collect(Collectors.toList());
dictionaryListVO.setDictionaryList(dictionaryVOList);
result.add(dictionaryListVO);
});
} else {
List<String> dictionaryTypeList = request.getDictionaryTypeList();
for (String dictionaryType : dictionaryTypeList) {
DictionaryListVO dictionaryListVO = new DictionaryListVO();
dictionaryListVO.setDictionaryName(dictionaryType);
List<DictionaryDTO> dictionaryList = dictionaryCache.getDictionaryListByDictionaryType(dictionaryType);
List<DictionaryVO> dictionaryVOList = dictionaryList.stream()
.map(MetaDictionaryAssembler::toDictionaryVO).collect(Collectors.toList());
dictionaryListVO.setDictionaryList(dictionaryVOList);
result.add(dictionaryListVO);
}
}
return result;
}

public List<TagTreeVO> getTagTree(ReqTagListPO request) {
List<String> rootTagCodeList = request.getRootTagCodeList();
if (CollectionUtils.isEmpty(rootTagCodeList)) {
rootTagCodeList = ExpertTagEnum.getAll();
}
List<TagTreeDTO> tagTreeDTOList = new ArrayList<>();
for (String rootTagCode : rootTagCodeList) {
TagTreeDTO tagTreeDTO = tagCache.getTagTreeDTO(4, rootTagCode);
if (Objects.nonNull(tagTreeDTO)) {
tagTreeDTOList.add(tagTreeDTO);
}
}
return MetaTagAssembler.toTagTreeVOList(tagTreeDTOList);
}


/**
* 专家管理员才能调用
*
* @param addDictionaryRequest
*/
@Transactional(rollbackFor = Exception.class)
public void addDictionary(AddDictionaryRequest addDictionaryRequest) {
String dictionaryType = addDictionaryRequest.getDictionaryType();
boolean contains = DictExpertInfoTypeEnum.contains(dictionaryType);
if (!contains) {
throw BizException.wrap("无效的专家字典类型:%s", dictionaryType);
}
String name = addDictionaryRequest.getName();
Integer sortValue = addDictionaryRequest.getSortValue();
LambdaQueryWrapper<MetaDictionary> eq = Wrappers.lambdaQuery(MetaDictionary.class).eq(MetaDictionary::getDictionaryType, dictionaryType);
List<MetaDictionary> dictionaryManageList = metaDictionaryManageService.list(eq);

MetaDictionary saveRecord = new MetaDictionary();
saveRecord.setCreateOn(LocalDateTime.now());
saveRecord.setDictionaryName(name);
saveRecord.setUpdateOn(LocalDateTime.now());
saveRecord.setDictionaryCode(BizUtils.uuid32());
saveRecord.setDictionaryType(dictionaryType);
saveRecord.setReadonly(BoolDisplayEnum.N.name());
saveRecord.setSortValue(sortValue);

List<MetaDictionary> saveRecordList = new ArrayList<>();
saveRecordList.add(saveRecord);
for (MetaDictionary metaDictionary : dictionaryManageList) {
if (metaDictionary.getSortValue() >= sortValue) {
metaDictionary.setSortValue(metaDictionary.getSortValue() + 1);
}
saveRecordList.add(metaDictionary);
}
boolean remove = metaDictionaryManageService
.remove(Wrappers.lambdaQuery(MetaDictionary.class).eq(MetaDictionary::getDictionaryType, dictionaryType));
if (remove) {
metaDictionaryManageService.saveBatch(saveRecordList);
}
}

public void removeDictionary(String dictionaryCode) {
LambdaUpdateWrapper<MetaDictionary> eq = Wrappers.lambdaUpdate(MetaDictionary.class)
.eq(MetaDictionary::getDictionaryCode, dictionaryCode);
MetaDictionary one = metaDictionaryManageService.getOne(eq);
if (Objects.isNull(one)) {
throw BizException.wrap("字典值不存在");
}
if (BoolDisplayEnum.judgeBoolean(one.getReadonly())) {
throw BizException.wrap("内置字典值无法删除");
}
List<ExpertDictionary> expertDictionaryList = iExpertDictionaryService.list(Wrappers.lambdaQuery(ExpertDictionary.class).eq(ExpertDictionary::getDictionaryCode, dictionaryCode));
if (CollUtil.isNotEmpty(expertDictionaryList)) {
throw BizException.wrap("该字典值已被使用无法删除");
}
metaDictionaryManageService.removeById(one);
}

public void addTagType(AddTagTypeRequest request) {
String tagName = request.getTagName();
LambdaQueryWrapper<MetaTag> in = Wrappers.lambdaQuery(MetaTag.class)
.in(MetaTag::getTagName, tagName)
.in(MetaTag::getParentCode, TagConst.TAG_ROOT_PARENT_CODE);
List<MetaTag> list = iMetaTagManageService.list(in);
if (CollectionUtils.isNotEmpty(list)) {
throw BizException.wrap("该标签类型已存在");
}
MetaTag saveRecord = new MetaTag();
saveRecord.setCreateOn(LocalDateTime.now());
saveRecord.setUpdateOn(LocalDateTime.now());
saveRecord.setParentCode(TagConst.TAG_ROOT_PARENT_CODE);
saveRecord.setTagCode(BizUtils.uuid32());
saveRecord.setTagName(tagName);
saveRecord.setTagLevel(TagConst.TAG_ROOT_LEVEL);
iMetaTagManageService.save(saveRecord);
}

public void removeTagName(String tagCode) {
LambdaQueryWrapper<ExpertTag> eq = Wrappers.lambdaQuery(ExpertTag.class)
.eq(ExpertTag::getTagCode, tagCode);
List<ExpertTag> expertTagList = iExpertTagService.list(eq);
if (CollectionUtils.isNotEmpty(expertTagList)) {
throw BizException.wrap("该标签正在使用无法删除");
}
LambdaQueryWrapper<MetaTag> queryWrapper = Wrappers.lambdaQuery(MetaTag.class).eq(MetaTag::getParentCode, tagCode);
List<MetaTag> list = iMetaTagManageService.list(queryWrapper);
if (CollectionUtils.isNotEmpty(list)) {
throw BizException.wrap("该标签存在子标签无法删除");
}
LambdaQueryWrapper<MetaTag> metaTagManageLambdaQueryWrapper = Wrappers.lambdaQuery(MetaTag.class).eq(MetaTag::getTagCode, tagCode);
MetaTag one = iMetaTagManageService.getOne(metaTagManageLambdaQueryWrapper);
if (Objects.nonNull(one)) {
iMetaTagManageService.removeById(one);
}
}

public List<TagTypeVO> tagTypeList() {
LambdaQueryWrapper<MetaTag> eq = Wrappers.lambdaQuery(MetaTag.class).eq(MetaTag::getParentCode, TagConst.TAG_ROOT_PARENT_CODE);
List<MetaTag> list = iMetaTagManageService.list(eq);
return list.stream().map(r -> {
TagTypeVO tagTypeVO = new TagTypeVO();
tagTypeVO.setTagCode(r.getTagCode());
tagTypeVO.setTagLevel(r.getTagLevel());
tagTypeVO.setTagName(r.getTagName());
tagTypeVO.setTagName(r.getTagName());
return tagTypeVO;
}).collect(Collectors.toList());
}

public List<TagListVO> tagQuery(TagQueryRequest tagQueryRequest) {
String parentCode = tagQueryRequest.getParentCode();
if (StringUtils.isBlank(parentCode)) {
parentCode = TagConst.TAG_ROOT_PARENT_CODE;
}
LambdaQueryWrapper<MetaTag> eq = Wrappers.lambdaQuery(MetaTag.class)
.eq(MetaTag::getParentCode, parentCode);
List<MetaTag> list = iMetaTagManageService.list(eq);

List<String> tagCodeList = CollUtils.fieldList(list, MetaTag::getTagCode);
Map<String, List<MetaTag>> hasChildrenMap = new HashMap<>(16);
Map<String, List<ExpertTag>> useFrequencyMap = new HashMap<>(16);
if (CollectionUtils.isNotEmpty(tagCodeList)) {
List<MetaTag> childrenMetaTagList = iMetaTagManageService.list(Wrappers.lambdaQuery(MetaTag.class)
.in(MetaTag::getParentCode, tagCodeList));
hasChildrenMap = CollUtils.group(childrenMetaTagList, MetaTag::getParentCode);

List<ExpertTag> expertTagList = iExpertTagService.list(Wrappers.lambdaQuery(ExpertTag.class)
.in(ExpertTag::getTagCode, tagCodeList));
useFrequencyMap = CollUtils.group(expertTagList, ExpertTag::getTagCode);
}

Map<String, List<MetaTag>> finalHasChildrenMap = hasChildrenMap;
Map<String, List<ExpertTag>> finalUseFrequencyMap = useFrequencyMap;
return list.stream().map(r -> {
TagListVO tagListVO = new TagListVO();
tagListVO.setCreateTime(r.getCreateOn());
tagListVO.setCreator(TagConst.TAG_CREATOR);
tagListVO.setTagLevel(r.getTagLevel());
tagListVO.setTagCode(r.getTagCode());
tagListVO.setTagName(r.getTagName());
List<MetaTag> metaTagManages = finalHasChildrenMap.get(r.getTagCode());
if (CollUtil.isNotEmpty(metaTagManages)) {
tagListVO.setIsLeaf(false);
tagListVO.setHasChildren(true);
} else {
tagListVO.setIsLeaf(true);
tagListVO.setHasChildren(false);
}
long useFrequency = 0;
List<ExpertTag> expertTagList = finalUseFrequencyMap.get(r.getTagCode());
if (CollUtil.isNotEmpty(expertTagList)) {
useFrequency = expertTagList.size();
}
tagListVO.setUseFrequency(useFrequency);
return tagListVO;
}).collect(Collectors.toList());
}
}

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/mapper/ExpertDictionaryMapper.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertDictionaryMapper.java View File

@@ -1,6 +1,6 @@
package com.ningdatech.pmapi.dictionary.mapper;
package com.ningdatech.pmapi.meta.mapper;

import com.ningdatech.pmapi.dictionary.entity.ExpertDictionary;
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/mapper/ExpertDictionaryMapper.xml → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertDictionaryMapper.xml View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.dictionary.mapper.ExpertDictionaryMapper">
<mapper namespace="com.ningdatech.pmapi.meta.mapper.ExpertDictionaryMapper">

</mapper>

pmapi/src/main/java/com/ningdatech/pmapi/tag/mapper/ExpertTagMapper.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertTagMapper.java View File

@@ -1,6 +1,6 @@
package com.ningdatech.pmapi.tag.mapper;
package com.ningdatech.pmapi.meta.mapper;

import com.ningdatech.pmapi.tag.entity.ExpertTag;
import com.ningdatech.pmapi.meta.model.entity.ExpertTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**

pmapi/src/main/java/com/ningdatech/pmapi/tag/mapper/ExpertTagMapper.xml → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/ExpertTagMapper.xml View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.tag.mapper.ExpertTagMapper">
<mapper namespace="com.ningdatech.pmapi.meta.mapper.ExpertTagMapper">

</mapper>

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/mapper/MetaDictionaryMapper.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaDictionaryMapper.java View File

@@ -1,6 +1,6 @@
package com.ningdatech.pmapi.dictionary.mapper;
package com.ningdatech.pmapi.meta.mapper;

import com.ningdatech.pmapi.dictionary.entity.MetaDictionary;
import com.ningdatech.pmapi.meta.model.entity.MetaDictionary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/mapper/MetaDictionaryMapper.xml → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaDictionaryMapper.xml View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.dictionary.mapper.MetaDictionaryMapper">
<mapper namespace="com.ningdatech.pmapi.meta.mapper.MetaDictionaryMapper">

</mapper>

pmapi/src/main/java/com/ningdatech/pmapi/tag/mapper/MetaTagMapper.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaTagMapper.java View File

@@ -1,6 +1,6 @@
package com.ningdatech.pmapi.tag.mapper;
package com.ningdatech.pmapi.meta.mapper;

import com.ningdatech.pmapi.tag.entity.MetaTag;
import com.ningdatech.pmapi.meta.model.entity.MetaTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**

pmapi/src/main/java/com/ningdatech/pmapi/tag/mapper/MetaTagMapper.xml → pmapi/src/main/java/com/ningdatech/pmapi/meta/mapper/MetaTagMapper.xml View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.tag.mapper.MetaTagMapper">
<mapper namespace="com.ningdatech.pmapi.meta.mapper.MetaTagMapper">

</mapper>

+ 36
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/ExpertRegionInfo.java View File

@@ -0,0 +1,36 @@
package com.ningdatech.pmapi.meta.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
* @author liuxinxin
* @date 2022/7/25 下午2:43
*/
@Data
@ApiModel("专家区域信息")
public class ExpertRegionInfo {

/**
* 区域编码
*/
@NotBlank
@ApiModelProperty("区域编码")
private String regionCode;

/**
* 区域级别
*/
@NotBlank
@ApiModelProperty("区域级别")
private Integer regionLevel;

/**
* 区域名称
*/
@ApiModelProperty("区域名称")
private String regionName;
}

+ 24
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/bo/RegionContainsBO.java View File

@@ -0,0 +1,24 @@
package com.ningdatech.pmapi.meta.model.bo;

import lombok.Data;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/26 下午4:48
*/
@Data
public class RegionContainsBO {

/**
* 最高级节点级别
*/
private Integer parentRegionTreeLevel;

/**
* 所有区域码列表
*/
private List<String> containsRegionCodeList;

}

+ 40
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/dto/DictionaryDTO.java View File

@@ -0,0 +1,40 @@
package com.ningdatech.pmapi.meta.model.dto;

import lombok.Data;

/**
* @author liuxinxin
* @date 2022/7/22 上午10:49
*/
@Data
public class DictionaryDTO {

private String dictionaryType;

/**
* 编码 随机数处理
*/
private String dictionaryCode;

/**
* 名称
*/
private String name;

/**
* 描述
*/
private String describe;

/**
* 排序
*/
private Integer sortValue;

/**
* 是否内置,内置不可删除
*/
private String readonly;

}


+ 37
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/dto/TagDTO.java View File

@@ -0,0 +1,37 @@
package com.ningdatech.pmapi.meta.model.dto;

import lombok.Data;

/**
* @author liuxinxin
* @date 2022/7/22 上午9:53
*/
@Data
public class TagDTO {

/**
* 标签 编码
* 根标签
擅长方向 good_at
* 技术专长 technical_expertise
* 行业领域 industry_sector
* 其他 other
*/
private String tagCode;

/**
* 标签名称
*/
private String tagName;

/**
* 标签级别
*/
private Long tagLevel;

/**
* 标签父级id
* 当parent_tag_code 为 -1 时为顶级标签
*/
private String parentCode;

}

+ 42
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/dto/TagTreeDTO.java View File

@@ -0,0 +1,42 @@
package com.ningdatech.pmapi.meta.model.dto;

import lombok.Data;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/22 上午9:53
*/
@Data
public class TagTreeDTO {


/**
* 标签 编码
* 根标签
擅长方向 good_at
* 技术专长 technical_expertise
* 行业领域 industry_sector
* 其他 other
*/
private String tagCode;

/**
* 标签名称
*/
private String tagName;

/**
* 标签级别
*/
private Long tagLevel;

/**
* 标签父级id
* 当parent_tag_code 为 -1 时为顶级标签
*/
private String parentCode;


private List<TagTreeDTO> children;
}

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/entity/ExpertDictionary.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/ExpertDictionary.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.dictionary.entity;
package com.ningdatech.pmapi.meta.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**

pmapi/src/main/java/com/ningdatech/pmapi/tag/entity/ExpertTag.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/ExpertTag.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.tag.entity;
package com.ningdatech.pmapi.meta.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/entity/MetaDictionary.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/MetaDictionary.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.dictionary.entity;
package com.ningdatech.pmapi.meta.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

pmapi/src/main/java/com/ningdatech/pmapi/tag/entity/MetaTag.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/model/entity/MetaTag.java View File

@@ -1,4 +1,4 @@
package com.ningdatech.pmapi.tag.entity;
package com.ningdatech.pmapi.meta.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**

+ 37
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/AddDictionaryRequest.java View File

@@ -0,0 +1,37 @@
package com.ningdatech.pmapi.meta.model.po;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
* @author liuxinxin
* @date 2022/8/25 上午11:10
*/
@Data
@ApiModel("新增字典值")
public class AddDictionaryRequest {

@ApiModelProperty(value = "字典类型")
@NotBlank
private String dictionaryType;

/**
* 名称
*/
@ApiModelProperty(value = "名称")
@NotBlank
private String name;

/**
* 排序
*/
@ApiModelProperty(value = "排序")
@NotNull
private Integer sortValue;


}

+ 20
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/AddTagTypeRequest.java View File

@@ -0,0 +1,20 @@
package com.ningdatech.pmapi.meta.model.po;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
* @author liuxinxin
* @date 2022/8/27 上午10:17
*/
@ApiModel(description = "新增标签分类")
@Data
public class AddTagTypeRequest {

@ApiModelProperty("标签分类名")
@NotBlank
private String tagName;
}

+ 19
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/DictionaryListRequest.java View File

@@ -0,0 +1,19 @@
package com.ningdatech.pmapi.meta.model.po;

import lombok.Data;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/21 下午6:05
*/
@Data
public class DictionaryListRequest {

private List<String> dictionaryTypeList;

private Boolean allDict = false;


}

+ 14
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/ReqTagListPO.java View File

@@ -0,0 +1,14 @@
package com.ningdatech.pmapi.meta.model.po;

import lombok.Data;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/22 下午2:43
*/
@Data
public class ReqTagListPO {
private List<String> rootTagCodeList;
}

+ 14
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/TagListRequest.java View File

@@ -0,0 +1,14 @@
package com.ningdatech.pmapi.meta.model.po;

import lombok.Data;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/22 下午2:43
*/
@Data
public class TagListRequest {
private List<String> rootTagCodeList;
}

+ 24
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/po/TagQueryRequest.java View File

@@ -0,0 +1,24 @@
package com.ningdatech.pmapi.meta.model.po;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* @author liuxinxin
* @date 2022/8/27 下午2:30
*/
@Data
@ApiModel(description = "标签查询request")
public class TagQueryRequest {
//
// @ApiModelProperty("标签类型")
// private Long tagType;
//
// @ApiModelProperty("标签名")
// private String tagName;

@ApiModelProperty("父级标签编码")
private String parentCode;

}

+ 25
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/DictionaryListVO.java View File

@@ -0,0 +1,25 @@
package com.ningdatech.pmapi.meta.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/21 下午6:13
*/
@Data
@ToString(callSuper = true)
@ApiModel(value = "DictionaryListVO", description = "字典列表结构VO")
public class DictionaryListVO {

@ApiModelProperty(value = "字典名称")
private String dictionaryName;

@ApiModelProperty(value = "字典选项名称")
private List<DictionaryVO> dictionaryList;

}

+ 49
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/DictionaryVO.java View File

@@ -0,0 +1,49 @@
package com.ningdatech.pmapi.meta.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* @author liuxinxin
* @date 2022/7/22 上午11:26
*/
@Data
@ApiModel(value = "DictionaryListVO", description = "字典结构VO")
public class DictionaryVO {


@ApiModelProperty(value = "字典类型")
private String dictionaryType;

/**
* 编码 随机数处理
*/
@ApiModelProperty(value = "编码")
private String dictionaryCode;

/**
* 名称
*/
@ApiModelProperty(value = "名称")
private String name;

/**
* 描述
*/
@ApiModelProperty(value = "描述")
private String describe;

/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer sortValue;

/**
* 是否内置,内置不可删除
*/
@ApiModelProperty(value = "是否内置,内置不可删除")
private String readonly;

}

+ 41
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/TagListVO.java View File

@@ -0,0 +1,41 @@
package com.ningdatech.pmapi.meta.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.time.LocalDateTime;

/**
* @author liuxinxin
* @date 2022/8/27 下午2:35
*/
@Data
@ApiModel(description = "标签列表展示")
public class TagListVO {

@ApiModelProperty(value = "标签 编码")
private String tagCode;

@ApiModelProperty(value = "标签名称")
private String tagName;

@ApiModelProperty(value = "标签级别")
private Long tagLevel;

@ApiModelProperty(value = "使用频次")
private Long useFrequency;

@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;

@ApiModelProperty(value = "创建人")
private String creator;

@ApiModelProperty(value = "是否为叶子节点")
private Boolean isLeaf;

@ApiModelProperty(value = "是否有子集")
private Boolean hasChildren;

}

+ 58
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/TagTreeVO.java View File

@@ -0,0 +1,58 @@
package com.ningdatech.pmapi.meta.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/22 下午2:27
*/
@Data
@ToString(callSuper = true)
@ApiModel(value = "TagTreeVO", description = "标签树状结构VO")
public class TagTreeVO {

/**
* 标签 编码
* 根标签
擅长方向 good_at
* 技术专长 technical_expertise
* 行业领域 industry_sector
* 其他 other
*/
@ApiModelProperty(value = " * 标签 编码\n" +
" * 根标签\u2028擅长方向 good_at\n" +
" * 技术专长 technical_expertise\n" +
" * 行业领域 industry_sector\n" +
" * 其他 other")
private String tagCode;

/**
* 标签名称
*/
@ApiModelProperty(value = "标签名称")
private String tagName;

/**
* 标签级别
*/
@ApiModelProperty(value = "标签级别")
private Long tagLevel;

/**
* 标签父级id
* 当parent_tag_code 为 -1 时为顶级标签
*/
@ApiModelProperty(value = " * 标签父级id\n" +
" * 当parent_tag_code 为 -1 时为顶级标签")
private String parentCode;

@ApiModelProperty(value = "子节点标签")
private List<TagTreeVO> children;

@ApiModelProperty(value = "联合唯一字段方便页面使用(tagName##tagCode)")
private String unionCode;
}

+ 23
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/model/vo/TagTypeVO.java View File

@@ -0,0 +1,23 @@
package com.ningdatech.pmapi.meta.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* @author liuxinxin
* @date 2022/8/27 下午2:20
*/
@Data
@ApiModel(description = "标签类型VO")
public class TagTypeVO {

@ApiModelProperty(value = "标签编码")
private String tagCode;

@ApiModelProperty(value = "标签名称")
private String tagName;

@ApiModelProperty(value = "标签级别")
private Long tagLevel;
}

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/service/IExpertDictionaryService.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IExpertDictionaryService.java View File

@@ -1,6 +1,6 @@
package com.ningdatech.pmapi.dictionary.service;
package com.ningdatech.pmapi.meta.service;

import com.ningdatech.pmapi.dictionary.entity.ExpertDictionary;
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary;
import com.baomidou.mybatisplus.extension.service.IService;

/**

pmapi/src/main/java/com/ningdatech/pmapi/tag/service/IExpertTagService.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IExpertTagService.java View File

@@ -1,6 +1,6 @@
package com.ningdatech.pmapi.tag.service;
package com.ningdatech.pmapi.meta.service;

import com.ningdatech.pmapi.tag.entity.ExpertTag;
import com.ningdatech.pmapi.meta.model.entity.ExpertTag;
import com.baomidou.mybatisplus.extension.service.IService;

/**

+ 22
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IMetaDictionaryService.java View File

@@ -0,0 +1,22 @@
package com.ningdatech.pmapi.meta.service;

import com.ningdatech.pmapi.meta.model.entity.MetaDictionary;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;

import java.util.List;

/**
* <p>
* 服务类
* </p>
*
* @author Liuxinxin
* @since 2023-02-22
*/
public interface IMetaDictionaryService extends IService<MetaDictionary> {

List<DictionaryDTO> queryAll();


}

pmapi/src/main/java/com/ningdatech/pmapi/tag/service/IMetaTagService.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/service/IMetaTagService.java View File

@@ -1,7 +1,10 @@
package com.ningdatech.pmapi.tag.service;
package com.ningdatech.pmapi.meta.service;

import com.ningdatech.pmapi.tag.entity.MetaTag;
import com.ningdatech.pmapi.meta.model.entity.MetaTag;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.meta.model.dto.TagDTO;

import java.util.List;

/**
* <p>
@@ -13,4 +16,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IMetaTagService extends IService<MetaTag> {

List<TagDTO> queryAll();

}

pmapi/src/main/java/com/ningdatech/pmapi/dictionary/service/impl/ExpertDictionaryServiceImpl.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/ExpertDictionaryServiceImpl.java View File

@@ -1,8 +1,8 @@
package com.ningdatech.pmapi.dictionary.service.impl;
package com.ningdatech.pmapi.meta.service.impl;

import com.ningdatech.pmapi.dictionary.entity.ExpertDictionary;
import com.ningdatech.pmapi.dictionary.mapper.ExpertDictionaryMapper;
import com.ningdatech.pmapi.dictionary.service.IExpertDictionaryService;
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary;
import com.ningdatech.pmapi.meta.mapper.ExpertDictionaryMapper;
import com.ningdatech.pmapi.meta.service.IExpertDictionaryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;


pmapi/src/main/java/com/ningdatech/pmapi/tag/service/impl/ExpertTagServiceImpl.java → pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/ExpertTagServiceImpl.java View File

@@ -1,8 +1,8 @@
package com.ningdatech.pmapi.tag.service.impl;
package com.ningdatech.pmapi.meta.service.impl;

import com.ningdatech.pmapi.tag.entity.ExpertTag;
import com.ningdatech.pmapi.tag.mapper.ExpertTagMapper;
import com.ningdatech.pmapi.tag.service.IExpertTagService;
import com.ningdatech.pmapi.meta.model.entity.ExpertTag;
import com.ningdatech.pmapi.meta.mapper.ExpertTagMapper;
import com.ningdatech.pmapi.meta.service.IExpertTagService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;


+ 32
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/MetaDictionaryServiceImpl.java View File

@@ -0,0 +1,32 @@
package com.ningdatech.pmapi.meta.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.pmapi.meta.model.entity.MetaDictionary;
import com.ningdatech.pmapi.meta.mapper.MetaDictionaryMapper;
import com.ningdatech.pmapi.meta.service.IMetaDictionaryService;
import com.ningdatech.pmapi.meta.assembler.MetaDictionaryAssembler;
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
* <p>
* 服务实现类
* </p>
*
* @author Liuxinxin
* @since 2023-02-22
*/
@Service
public class MetaDictionaryServiceImpl extends ServiceImpl<MetaDictionaryMapper, MetaDictionary> implements IMetaDictionaryService {

@Override
public List<DictionaryDTO> queryAll() {
List<MetaDictionary> dictionaryList = this.lambdaQuery().ne(MetaDictionary::getId, -1).list();
List<DictionaryDTO> dictionaryDTOList = dictionaryList.stream().map(MetaDictionaryAssembler::toDictionaryDTO).collect(Collectors.toList());
return dictionaryDTOList;
}

}

+ 33
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/service/impl/MetaTagServiceImpl.java View File

@@ -0,0 +1,33 @@
package com.ningdatech.pmapi.meta.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.pmapi.meta.assembler.MetaTagAssembler;
import com.ningdatech.pmapi.meta.model.entity.MetaTag;
import com.ningdatech.pmapi.meta.mapper.MetaTagMapper;
import com.ningdatech.pmapi.meta.model.dto.TagDTO;
import com.ningdatech.pmapi.meta.service.IMetaTagService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
* <p>
* 服务实现类
* </p>
*
* @author Liuxinxin
* @since 2023-02-22
*/
@Service
public class MetaTagServiceImpl extends ServiceImpl<MetaTagMapper, MetaTag> implements IMetaTagService {


@Override
public List<TagDTO> queryAll() {
List<MetaTag> allTags = this.lambdaQuery().ne(MetaTag::getId, -1).list();
List<TagDTO> allTagDTOList = allTags.stream().map(MetaTagAssembler::toTagDTO).collect(Collectors.toList());
return allTagDTOList;
}

}

+ 31
- 0
pmapi/src/main/java/com/ningdatech/pmapi/meta/validate/TagListRequestValidator.java View File

@@ -0,0 +1,31 @@
package com.ningdatech.pmapi.meta.validate;


import com.ningdatech.basic.exception.BizException;
import com.ningdatech.pmapi.meta.constant.ExpertTagEnum;
import com.ningdatech.pmapi.meta.model.po.ReqTagListPO;
import org.apache.commons.collections4.CollectionUtils;

import java.util.List;

/**
* @author liuxinxin
* @date 2022/7/22 下午2:44
*/

public class TagListRequestValidator {

private TagListRequestValidator() {
}

public static void tagListRequestValidator(ReqTagListPO request) {
List<String> rootTagCodeList = request.getRootTagCodeList();
if (CollectionUtils.isNotEmpty(rootTagCodeList)) {
for (String rootTagCode : rootTagCodeList) {
if (!ExpertTagEnum.contains(rootTagCode)) {
throw new BizException("Illegal rootTagCode:" + rootTagCode);
}
}
}
}
}

+ 0
- 20
pmapi/src/main/java/com/ningdatech/pmapi/tag/service/impl/MetaTagServiceImpl.java View File

@@ -1,20 +0,0 @@
package com.ningdatech.pmapi.tag.service.impl;

import com.ningdatech.pmapi.tag.entity.MetaTag;
import com.ningdatech.pmapi.tag.mapper.MetaTagMapper;
import com.ningdatech.pmapi.tag.service.IMetaTagService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
* <p>
* 服务实现类
* </p>
*
* @author Liuxinxin
* @since 2023-02-22
*/
@Service
public class MetaTagServiceImpl extends ServiceImpl<MetaTagMapper, MetaTag> implements IMetaTagService {

}

Loading…
Cancel
Save