代码完善(master): 数据库翻译支持字段不一致情况(映射模式解决)

This commit is contained in:
song_jx 2024-03-18 11:26:04 +08:00
parent edb337d188
commit 0e8bc80015
8 changed files with 124 additions and 27 deletions

View File

@ -148,7 +148,7 @@ dict-trans
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>dict-trans</artifactId>
<version>0.7</version>
<version>0.8</version>
</dependency>
<!-- hutool工具类必须 -->
@ -269,6 +269,9 @@ public class People {
参数:
* dictClass字典配置类指定的 class 上必须是 `DictTranslate.class` 实现类 、 `IEnum` 接口的实现类 、 `Desensitized``SummaryExtract` 或者是 `@Dictionary` 注解;
* translateField翻译后的属性名注意使用驼峰命名默认为原属性名去除末尾的 "Id" 和 "Code" 再接上 "Name"
1. 不填时默认为原属性名去除末尾的"Id"和"Code"再接上"Name"
2. Desensitized脱敏 与 SummaryExtract摘要提取不填时默认为原字段
3. 数据库翻译时,若查询的字段与翻译字段长度不一致,可以填写字段映射。格式:“查询字段:翻译字段”如“sex:sexName”。此时将会自动重新组织数据防止翻译对不上的情况。*注意:若不使用映射模式,一定要长度一致,顺序一致!!!否者会出现对应错乱!!!*
* groupValue组属性值在静态字典表这种拥有组属性的字典中需要手动传入一个定值字典分组的 code
* dictionary指定 `Dictionary` 并设置其属性,将覆盖 `dictClass` 上的 `Dictionary` 注解的配置,指定了该属性后也可不指定 `dictClass` ,一般情况下不会使用;
* conditionField指定判断条件字段仅自定义翻译实现时用来进行判断『20230822更新后支持固定值格式V:<>』;
@ -310,7 +313,14 @@ public class UserDB {
}
// 2.2. 字段翻译
// 特殊用法1多列翻译
// @Translate(dictClass = UserDB.class, translateField = {"name", "sex"})
//
// 特殊用法2映射翻译
// 针对此种翻译注解情况 @Dictionary(codeColumn = "id", textColumn = {"user_name", "sex"})
// @Translate(dictClass = UserDB.class, translateField = {"user_name:name"})
//
// 常规用法如下:
@Translate(dictClass = UserDB.class, translateField = "name")
private String id;

View File

@ -38,6 +38,7 @@ public @interface Translate {
* <ul>
* <li>1. 不填时默认为原属性名去除末尾的"Id""Code"再接上"Name"</li>
* <li>2. Desensitized脱敏 SummaryExtract摘要提取不填时默认为原字段</li>
* <li>3. 数据库翻译时若查询的字段与翻译字段长度不一致可以填写字段映射格式查询字段:翻译字段sex:sexName此时将会自动重新组织数据防止翻译对不上的情况<p>注意若不使用映射模式一定要长度一致顺序一致否者会出现对应错乱</p></li>
* </ul>
*
*

View File

@ -1,6 +1,12 @@
package com.aizuda.trans.demo;
import com.aizuda.trans.entity.*;
import com.aizuda.trans.entity.Device;
import com.aizuda.trans.entity.People;
import com.aizuda.trans.entity.People2;
import com.aizuda.trans.entity.People2_1;
import com.aizuda.trans.entity.People3;
import com.aizuda.trans.entity.People4;
import com.aizuda.trans.entity.Result;
import java.util.List;
@ -44,6 +50,14 @@ public interface DemoService {
*/
public List<People2> dbDemo();
/**
* 数据库演示单列翻译
*
* @return {@link List }<{@link People2 }>
* @author nn200433
*/
public List<People2_1> dbDemo1();
/**
* json演示
*

View File

@ -6,6 +6,7 @@ import com.aizuda.trans.demo.DemoService;
import com.aizuda.trans.entity.Device;
import com.aizuda.trans.entity.People;
import com.aizuda.trans.entity.People2;
import com.aizuda.trans.entity.People2_1;
import com.aizuda.trans.entity.People3;
import com.aizuda.trans.entity.People4;
import com.aizuda.trans.entity.Result;
@ -55,6 +56,15 @@ public class DemoServiceImpl implements DemoService {
return CollUtil.newArrayList(man, woman, more);
}
@Translator
@Override
public List<People2_1> dbDemo1() {
People2_1 man = People2_1.builder().id("1").build();
People2_1 woman = People2_1.builder().id("2").build();
People2_1 more = People2_1.builder().id("1,2").build();
return CollUtil.newArrayList(man, woman, more);
}
@Translator
@Override
public List<People3> jsonDemo() {

View File

@ -0,0 +1,27 @@
package com.aizuda.trans.entity;
import com.aizuda.trans.annotation.Translate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 人2_1
*
* @author nn200433
* @date 2022-12-16 016 11:40:30
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class People2_1 {
/** 数据库翻译 */
@Translate(dictClass = UserDB.class, translateField = {"user_name:name"})
private String id;
private String name;
}

View File

@ -7,6 +7,7 @@ import com.aizuda.trans.demo.DemoService;
import com.aizuda.trans.entity.Device;
import com.aizuda.trans.entity.People;
import com.aizuda.trans.entity.People2;
import com.aizuda.trans.entity.People2_1;
import com.aizuda.trans.entity.People3;
import com.aizuda.trans.entity.People4;
import com.aizuda.trans.entity.Result;
@ -50,6 +51,12 @@ public class TranslatorTest {
Console.log("---> 数据库 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
}
@Test
public void demo3_1() {
List<People2_1> peopleList = demoService.dbDemo1();
Console.log("---> 数据库(长度不一致,采用字段映射方式) 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
}
@Test
public void demo4() {
List<People3> peopleList = demoService.jsonDemo();

View File

@ -43,6 +43,7 @@ import org.springframework.stereotype.Service;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@ -171,41 +172,68 @@ public class TranslatorHandle {
* @author nn200433
*/
private static <T> void transformField(T origin, FormatType fieldFormatType, Field field) {
// 1.获取要翻译的属性名
// 1.获取要翻译的属性名 获取每个待翻译属性的配置
final String fName = field.getName();
final String fieldName = NameUtil.parseCamelTo(fName, fieldFormatType);
// 2.获取每个待翻译属性的配置
final Translate translateConfig = field.getAnnotation(Translate.class);
final Class<?> dictClass = getDictClass(translateConfig);
final List<String> writeFieldList = getWriteFieldNameSrv().getFieldNameList(translateConfig, fName, fieldFormatType);
final String groupValue = translateConfig.groupValue();
final String conditionField = translateConfig.conditionField();
final String desensitizedModel = translateConfig.desensitizedModel();
final int maxLen = translateConfig.maxLen();
final Dictionary dictionaryConfig = handle(dictClass, translateConfig);
final boolean isJsonConvert = IJsonConvert.class.isAssignableFrom(dictClass);
final boolean isSetFieldEmpty = translateConfig.setFieldEmpty();
// 获取未翻译的原值如果值为空则跳过
final Dictionary dictionaryConfig = handle(dictClass, translateConfig);
final String[] columns = dictionaryConfig.textColumn();
final String codeColumn = dictionaryConfig.codeColumn();
List<String> writeFieldList = getWriteFieldNameSrv().getFieldNameList(translateConfig, fName, fieldFormatType);
// 2. 获取未翻译的原值如果值为空则跳过
String originValue = Convert.toStr(getProperty(origin, fieldName));
if (originValue == null) {
return;
}
// 获取条件字段值
// 3. 获取条件字段值
String conditionFieldValue = Opt.ofBlankAble(conditionField)
.map(c -> StrUtil.startWith(c, CONDITION_FIELD_IS_VALUE_PREFIX) ? StrUtil.removePrefix(c, CONDITION_FIELD_IS_VALUE_PREFIX) : Convert.toStr(getProperty(origin, c)))
.get();
// 获取翻译结果并脱敏处理
// 4. 获取翻译结果
final ExtendParam extendParam = new ExtendParam(groupValue, conditionFieldValue, dictClass, maxLen);
List<Object> translateValList = parse(originValue, dictionaryConfig, extendParam);
// 5. 数据库翻译时处理多个值情况的问题
if (StrUtil.isNotBlank(codeColumn) && ArrayUtil.isNotEmpty(columns)) {
final int columnLen = columns.length;
final int writeFieldSize = writeFieldList.size();
List<String> newWriteFieldList = new ArrayList<String>(writeFieldSize);
List<Object> newTranslateValList = new ArrayList<Object>(translateValList.size());
if (columnLen > 1) {
for (final String writeField : writeFieldList) {
final List<String> fieldList = StrUtil.split(writeField, StrUtil.COLON, Boolean.TRUE, Boolean.TRUE);
// Assert.isTrue(fieldList.size() == 2, "数据库翻译异常:由于查询字段多于翻译字段,需要设置映射关系(格式:“查询字段:翻译字段”如“sex:sexName”您未进行设置或设置错误。");
if (fieldList.size() != 2) {
continue;
}
// 左侧为数据库查询字段右侧为翻译字段根据查询字段获取结果值的下标
final String queryColumn = fieldList.get(0);
final String waitWriteField = fieldList.get(1);
final int translateValDataIndex = ArrayUtil.indexOf(columns, queryColumn);
// 构造新数据
newWriteFieldList.add(waitWriteField);
newTranslateValList.add(translateValList.get(translateValDataIndex));
}
if (CollUtil.isNotEmpty(newWriteFieldList)) {
writeFieldList = newWriteFieldList;
}
if (CollUtil.isNotEmpty(newTranslateValList)) {
translateValList = newTranslateValList;
}
}
}
// 6. 脱敏处理
if (!isJsonConvert) {
// 不是 JsonConvert.class 时可进行脱敏
translateValList = desensitizedHandle(desensitizedModel, translateValList);
}
// 将翻译结果填入翻译展示字段
// 7. 将翻译结果填入翻译展示字段
setProperty(origin, (isJsonConvert && isSetFieldEmpty), fieldName, writeFieldList, translateValList);
}

View File

@ -22,7 +22,7 @@
<properties>
<!-- 版本 -->
<revision>0.7</revision>
<revision>0.8</revision>
<!-- 数据库操作 -->
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<!-- hutool -->