package com.insigma.dict.plugin;import com.insigma.common.core.annotation.*;import com.insigma.common.core.utils.StringUtils;import com.insigma.sysdict.dto.input.SysDictInDTO;import com.insigma.sysdict.dto.output.SysDictOutDTO;import com.insigma.sysdict.feign.FeignServiceSysDict;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections4.CollectionUtils;import org.apache.ibatis.executor.resultset.ResultSetHandler;import org.apache.ibatis.plugin.*;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.sql.Statement;import java.util.*;// TODO 插入数据时 使用雪花算法生成分布式主键ID/** 1.查询结果处理数据字典 2.插入数据,使用雪花算法生成分布式主键ID */@Intercepts( @Signature( type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}))@Slf4j@Componentpublic class MybatisDictPlugin implements Interceptor { @Resource private FeignServiceSysDict feignServiceSysDict; @Override public Object intercept(Invocation invocation) throws Throwable { long startTime = System.currentTimeMillis(); Object proceed = invocation.proceed(); if (proceed instanceof List){ List data = (List) proceed; if (StringUtils.isEmpty(data)) { return proceed; } else if (data.get(0) == null) { return Collections.emptyList(); } // 遍历所有数据 for (Object object : data) { if (object == null){ continue; } Field[] declaredFields = object.getClass().getDeclaredFields(); // 为了减少远程调用次数,将一个对象中所有需要字典翻译的字段放入map中,一次性请求,提高查询效率 Map<Field, SysDictInDTO> map = new HashMap<>(); for (Field field : declaredFields) { // 如果字段有dict注解 if (field.isAnnotationPresent(Dict.class)){ Annotation[] annotations = field.getAnnotations(); for (Annotation annotation : annotations) { if (annotation.annotationType().equals(Dict.class)){ Dict dict = (Dict) annotation; String dicCode = dict.dicCode(); // 设置字段可访问, 否则无法访问private修饰的变量值 field.setAccessible(true); Object value = field.get(object); if (value != null){ // 根据dictCode和value查询中文解释 SysDictInDTO sysDictInDTO = new SysDictInDTO(); sysDictInDTO.setDictCode(dicCode); sysDictInDTO.setDictValue(value.toString()); map.put(field, sysDictInDTO); } } } } } if (map.size() > 0){ // 查询字典服务 ArrayList<SysDictInDTO> sysDictInDTOS = new ArrayList<>(map.values()); List<SysDictOutDTO> sysDictOutDTOList = feignServiceSysDict.queryDictListByCodeAndValue(sysDictInDTOS); if (CollectionUtils.isNotEmpty(sysDictOutDTOList)){ for (Field field : map.keySet()) { for (SysDictOutDTO sysDictOutDTO : sysDictOutDTOList) { SysDictInDTO sysDictInDTO = map.get(field); if (Objects.equals(sysDictInDTO.getDictCode(), sysDictOutDTO.getDictCode())){ field.set(object, sysDictOutDTO.getItemText()); } } } } } } } log.info("MybatisDictPlugin.intercept cost:{} ms", System.currentTimeMillis()-startTime); return proceed; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) {}}
package com.insigma.sysdict.feign;
import com.insigma.sysdict.hystrix.HystrixServiceSysDict;
import com.insigma.sysdict.service.api.SysDictService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Repository;
@FeignClient(name = "app-dpes-sysdict",fallbackFactory = HystrixServiceSysDict.class)
@Repository
public interface FeignServiceSysDict extends SysDictService {
}
package com.insigma.sysdict.dto.input;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@Valid
@ApiModel(value = "数据字典接收参数")
public class SysDictInDTO implements Serializable {
@NotNull(message = "字典编码不能为空!")
@ApiModelProperty(value = "字典编码")
private String dictCode;
private String dictText;
private String dictType;
private String dictValue;
}
package com.insigma.common.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author Jiangchao
* @description: TODO
* @date 2022/3/9 14:10
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {
/**
* 方法描述: 数据code
* 作 者: dangzhenghui
* 日 期: 2019年03月17日-下午9:37:16
*
* @return 返回类型: String
*/
String dicCode();
/**
* 方法描述: 数据Text
* 作 者: dangzhenghui
* 日 期: 2019年03月17日-下午9:37:16
*
* @return 返回类型: String
*/
String dicText() default "";
/**
* 方法描述: 数据字典表
* 作 者: dangzhenghui
* 日 期: 2019年03月17日-下午9:37:16
*
* @return 返回类型: String
*/
String dictTable() default "";
}
package com.insigma.sysdict.dto.output;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
@ApiModel(value = "数据字典返回参数")
public class SysDictOutDTO implements Serializable {
@ApiModelProperty(value = "ID")
private String id;
@ApiModelProperty(value = "字典名称")
private String itemText;
@ApiModelProperty(value = "字典值")
private String itemValue;
@ApiModelProperty(value = "父级ID")
private String superId;
@ApiModelProperty(value = "字典编码")
private String dictCode;
private List<SysDictOutDTO> dictOutDTOS;
}
package com.insigma.sysdict.service.api;
import com.alibaba.fastjson.JSONObject;
import com.insigma.common.core.constants.DictConstant;
import com.insigma.common.core.domain.BaseResponse;
import com.insigma.sysdict.dto.input.SysDictInDTO;
import com.insigma.sysdict.dto.output.DictOutDTO;
import com.insigma.sysdict.dto.output.SysDictOutDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Api(tags = "数据字典服务接口")
@RequestMapping("app-dpes-sysdict")
public interface SysDictService {
//@ApiOperation(value = "根据代码获取数据字典")
//@PostMapping("/getDict")
//@CrossOrigin
//BaseResponse<JSONObject> getDictCode(@ModelAttribute("sysDictInDTO") @Validated SysDictInDTO sysDictInDTO);
@PostMapping("/parseDictText")
@CrossOrigin
String parseDictText(@RequestParam("listClassName") String listClassName, @RequestParam("type") String type, @RequestBody BaseResponse baseResponse);
@GetMapping("/queryDictByDiCode")
@ApiOperation(value = "根据父代码,类别查列表")
@CrossOrigin
BaseResponse<List<DictOutDTO>> queryDictByDiCode(@RequestParam("itemValue") String itemValue, @RequestParam("code") String code);
@GetMapping("/queryDictTextByDiCode")
@ApiOperation(value = "各种下拉框")
@CrossOrigin
BaseResponse<List<Map<String, String>>> queryDictTextByDiCode(@RequestParam("code") String code);
@GetMapping("/queryDictValueByDiCode")
@ApiOperation(value = "获取字典值,模糊搜索")
@CrossOrigin
String queryDictValueByDiCode(@RequestParam("dictCode") String dictCode, @RequestParam("dictText") String dictText);
@GetMapping("/getCodeByCityName")
@ApiOperation(value = "模糊获取cityId")
@CrossOrigin
BaseResponse getCodeByCityName(@RequestParam("city") String city);
@GetMapping("/getThreeCityListByCityName")
@ApiOperation(value = "根据城市名称获取区县列表")
@CrossOrigin
List<DictOutDTO> getThreeCityListByCityName(@RequestParam("city") String city);
@GetMapping("/getJobClassThree")
@ApiOperation(value = "职位类别三级联动")
@CrossOrigin
BaseResponse<List<DictOutDTO>> getJobClassThree();
@GetMapping("/getHyTwoList")
@ApiOperation(value = "职位行业三级联动")
@CrossOrigin
BaseResponse<List<DictOutDTO>> getHyTwoList();
@GetMapping("/getThreeCityList")
@ApiOperation(value = "职位行业三级联动")
@CrossOrigin
List<DictOutDTO> getThreeCityList();
@PostMapping("/queryDictByCodeAndValue")
@ApiOperation(value = "查询字典信息")
@CrossOrigin
SysDictOutDTO queryDictByCodeAndValue(@RequestBody SysDictInDTO sysDictInDTO);
@PostMapping("/queryDictListByCodeAndValue")
@ApiOperation(value = "批量查询字典信息")
@CrossOrigin
List<SysDictOutDTO> queryDictListByCodeAndValue(@RequestBody List<SysDictInDTO> sysDictInDTOList);
@GetMapping("/queryDictById")
@ApiOperation(value = "查询字典信息")
@CrossOrigin
SysDictOutDTO queryDictById(String id);
@GetMapping("/seachJobClassBythree")
@ApiOperation(value = "搜索第三极,逆推第二级")
@CrossOrigin
BaseResponse<List<DictOutDTO>> seachJobClassBythree(@RequestParam("search") String search);
//@GetMapping("/getCityParams/{type}")
//BaseResponse getCityParams(@PathVariable(name = "type", required = false) String type);
@ApiOperation(value = "根据dictType获取数据字典信息")
@GetMapping("/getDict/{dictType}")
@Cacheable(cacheNames = "DictLevel", key = "#dictType", unless = "#result==null")
BaseResponse getDictLevel(@PathVariable(name = "dictType") String dictType);
@ApiOperation(value = "根据codeType获取数据CodeValue字典信息")
@GetMapping("/getCodeValue")
@Cacheable(value = "CodeValue", key = "T(String).valueOf(#dictType).concat('-').concat(#dictLevel)", unless = "#result==null")
BaseResponse getCodeValue(@RequestParam(name = "dictType") String dictType,
@RequestParam(name = "dictLevel", required = false, defaultValue = "1") String dictLevel);
//最终数据字典服务接口,1级,2级,3级
@ApiOperation(value = "根据codeType获取数据CodeValue字典信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "maxLevel", value = "最多的层级,-1代表最大可能", defaultValue = "-1"),
@ApiImplicitParam(name = "dictValue", value = "父级代码值"),
@ApiImplicitParam(name = "dictCode", value = "商品分类:product_fir"),
@ApiImplicitParam(name = "dictCode", value = "到岗时间:arrival_time"),
@ApiImplicitParam(name = "dictCode", value = "发布时间:publish_date"),
@ApiImplicitParam(name = "dictCode", value = "地区:provinceid"),
@ApiImplicitParam(name = "dictCode", value = "残疾类别:disabled_type"),
@ApiImplicitParam(name = "dictCode", value = "职位类型:job1"),
@ApiImplicitParam(name = "dictCode", value = "行业:hy1"),
@ApiImplicitParam(name = "dictCode", value = "职位薪资:user_salary"),
@ApiImplicitParam(name = "dictCode", value = "工作经验:user_word"),
@ApiImplicitParam(name = "dictCode", value = "学历:user_edu"),
@ApiImplicitParam(name = "dictCode", value = "性别:user_sex"),
@ApiImplicitParam(name = "dictCode", value = "职位特色:job_tese"),
@ApiImplicitParam(name = "dictCode", value = "公司性质,企业类型:pr"),
@ApiImplicitParam(name = "dictCode", value = "职位类型:job_type"),
@ApiImplicitParam(name = "dictCode", value = "职位人数:job_number"),
@ApiImplicitParam(name = "dictCode", value = "专栏分类:clum_class"),
})
@GetMapping("/commonDictValue")
public BaseResponse commonDictValue(@RequestParam(name = "dictCode") String dictType,
@RequestParam(name = "dictValue", required = false, defaultValue = "-1") String dictValue,
@RequestParam(name = "maxLevel", required = false, defaultValue = "-1") String dictLevel);
@ApiOperation(value = "根据市区代码获取省代码")
@PostMapping("/getProvinceByCityId")
BaseResponse getProvinceByCityId(@RequestParam(name = "city") String city);
@ApiOperation(value = "根据市区代码获取省代码")
@GetMapping("/根据汉字获取代码")
String selectCodeByCha(@RequestParam(name = "codeName") String codeName);
}