From 1b8e9b1b96f576454bfdb29d5d18508bf583721a Mon Sep 17 00:00:00 2001 From: "Wang.Huan" Date: Wed, 26 Feb 2025 09:28:02 +0800 Subject: [PATCH] =?UTF-8?q?@Dict=E6=B3=A8=E8=A7=A3:=20=E9=80=82=E7=94=A8?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E5=9C=BA=E6=99=AF=201:=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E8=A1=A8=20=20=20=E5=9C=A8DTO=E7=B1=BB?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=BF=BB=E8=AF=91=E7=9A=84=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=8A=E6=B7=BB=E5=8A=A0@Dict(dictCode=20=3D=20"xx=5Ftype"),?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AAString?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E6=96=87=E6=9C=AC=E5=AD=97=E5=85=B8?= =?UTF-8?q?;=20=20=20=20@Dict(dictCode=20=3D=20"status=5Fenum")=20//=20?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=9F=A5=E8=AF=A2=20sys=5Fdict=5Fdata=20?= =?UTF-8?q?=E8=A1=A8=20=20=20=20private=20Integer=20statusEnum;=20=20=20?= =?UTF-8?q?=20private=20String=20statusEnum=5FdictText;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2:翻译自定义表 @Dict(dictCode = "id", dictText = "name", dictTable = "sys_user") private Integer roleId; private String roleId_dictText; --- .../com/openhis/common/annotation/Dict.java | 14 +++ .../openhis/common/aspectj/DictAspect.java | 109 ++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 openhis-server/openhis-common/src/main/java/com/openhis/common/annotation/Dict.java create mode 100644 openhis-server/openhis-common/src/main/java/com/openhis/common/aspectj/DictAspect.java diff --git a/openhis-server/openhis-common/src/main/java/com/openhis/common/annotation/Dict.java b/openhis-server/openhis-common/src/main/java/com/openhis/common/annotation/Dict.java new file mode 100644 index 00000000..acc89138 --- /dev/null +++ b/openhis-server/openhis-common/src/main/java/com/openhis/common/annotation/Dict.java @@ -0,0 +1,14 @@ +package com.openhis.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Dict { + String dictCode(); // 字典类型字段 + String dictText() default ""; // 回显字段,默认为空 + String dictTable() default ""; // 表名,默认为空 +} diff --git a/openhis-server/openhis-common/src/main/java/com/openhis/common/aspectj/DictAspect.java b/openhis-server/openhis-common/src/main/java/com/openhis/common/aspectj/DictAspect.java new file mode 100644 index 00000000..3edf2977 --- /dev/null +++ b/openhis-server/openhis-common/src/main/java/com/openhis/common/aspectj/DictAspect.java @@ -0,0 +1,109 @@ +package com.openhis.common.aspectj; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.core.common.core.domain.R; +import com.openhis.common.annotation.Dict; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Field; +import java.util.List; + +@Aspect +@Component +public class DictAspect { + + @Autowired + private JdbcTemplate jdbcTemplate; // 使用 JdbcTemplate 执行 SQL + + @Around("@annotation(org.springframework.web.bind.annotation.GetMapping) || " + + "@annotation(org.springframework.web.bind.annotation.PostMapping)") + public Object aroundController(ProceedingJoinPoint joinPoint) throws Throwable { + Object result = joinPoint.proceed(); // 执行原方法 + + if (result instanceof R) { + // 如果返回值是 R,提取其中的数据 + R response = (R) result; + Object data = response.getData(); // 获取 R 中的实际数据 + + if (data instanceof Page) { + // 如果数据是 Page 类型,处理分页数据 + Page page = (Page) data; + List records = page.getRecords(); + if (!records.isEmpty()) { + for (Object obj : records) { + processDict(obj); // 处理每个 DTO 对象 + } + } + } else if (data instanceof List) { + // 如果数据是 List 类型,处理列表数据 + List list = (List) data; + if (!list.isEmpty()) { + for (Object obj : list) { + processDict(obj); // 处理每个 DTO 对象 + } + } + } else { + // 如果数据是单个 DTO 对象,直接处理 + processDict(data); + } + } + + return result; + } + + private void processDict(T dto) throws IllegalAccessException { + if (dto == null) { + return; + } + + // 获取 DTO 类的所有字段 + for (Field field : dto.getClass().getDeclaredFields()) { + // 检查字段是否带有 @Dict 注解 + if (field.isAnnotationPresent(Dict.class)) { + Dict dictAnnotation = field.getAnnotation(Dict.class); + field.setAccessible(true); // 设置字段可访问 + Object fieldValue = field.get(dto); // 获取字段值 + + if (fieldValue != null) { + String dictCode = dictAnnotation.dictCode(); + String dictText = dictAnnotation.dictText(); + String dictTable = dictAnnotation.dictTable(); + + // 查询字典值 + String dictLabel = queryDictLabel(dictTable, dictCode, dictText, fieldValue.toString()); + if (dictLabel != null) { + try { + // 动态生成 _TEXT 字段名 + String textFieldName = field.getName() + "_dictText"; + Field textField = dto.getClass().getDeclaredField(textFieldName); + textField.setAccessible(true); + textField.set(dto, dictLabel); // 设置 _TEXT 字段的值 + } catch (NoSuchFieldException e) { + // 如果 _TEXT 字段不存在,忽略错误 + e.printStackTrace(); + } + } + } + } + } + } + + private String queryDictLabel(String dictTable, String dictCode, String dictText, String dictValue) { + String sql; + if (StringUtils.isEmpty(dictTable)) { + // 场景 1:默认查询 sys_dict_data 表 + sql = "SELECT dict_label FROM sys_dict_data WHERE dict_type = ? AND dict_value::varchar = ? LIMIT 1"; + return jdbcTemplate.queryForObject(sql, String.class, dictCode, dictValue); + } else { + // 场景 2:查询指定表 + sql = String.format("SELECT %s FROM %s WHERE %s::varchar = ? LIMIT 1", dictText, dictTable, dictCode); + return jdbcTemplate.queryForObject(sql, String.class, dictValue); + } + } +} \ No newline at end of file