需求:有13个表,其中一个主表和12细表,主表用来记录推送状态,细表记录12种病例的详细信息,现在需要把这12张病例表数据进行数据推送;普通方法需要写12个方法分别去推送数据然后修改状态;现在可以通过模块化思想去封装通用接口;
通用数据处理方法
/**
* 通用的数据处理方法
* @param dataList 数据列表
* @param mbType MB类型名称
* @param gType G类型标识
* @param dtoClass DTO类类型
* @param result 结果列表
*/
private <T, D> void processMBData(List<T> dataList, String mbType, String gType, Class<D> dtoClass, List<TechBeianBingLiDetail> result) {
if (CollUtil.isNotEmpty(dataList)) {
dataList.forEach(item -> {
try {
D dto = BeanUtil.copyProperties(item, dtoClass);
BeanUtil.setFieldValue(dto, "timestamp", DateUtil.format(DateUtil.date(), "yyyy/MM/dd HH:mm:ss"));
BeanUtil.setFieldValue(dto, "flag", "i");
BeanUtil.setFieldValue(dto, "mbid", gType);
String jsonRequest = dto.toString();
NcisReponseMsg ncisReponseMsg = proxyUtil.postCaseInfo(jsonRequest, mbType + "-" + BeanUtil.getFieldValue(dto, "ZJID"));
PushStatusEnum pushStatus = "0".equals(ncisReponseMsg.getFlag())
? PushStatusEnum.YI_TUI_SONG
: PushStatusEnum.TUI_SONG_SHI_BAI;
result.add(new TechBeianBingLiDetail()
.setBusinessId(String.valueOf(BeanUtil.getFieldValue(dto, "ZJID")))
.setPushStatus(pushStatus.getStatus()));
} catch (Exception e) {
log.error("推送失败{} data: {}, Error: {}",
mbType, JSONUtil.toJsonStr(item), e.getMessage(), e);
}
});
}
}
因为我的数据要求json格式为:
[{"ZD":"timestamp","DA":"2020/11/02 21:11:30"},
{"ZD":"flag","DA":"i"},
{"ZD":"mbid","DA":"G01"},
{"ZD":"zjid","DA":"xxxx"},
{"ZD":"yyid","DA":"xxxx"},
......
{"ZD":"p1","DA":"123456"}]
因为我写了一个通用类,重写tostring方法,这12个病例继承这个类,并重写自己的同string方法,通过super.tostring调用父类方法就行;
ToStringIgnore是我自定义的json忽略注解;
ToStringAlias是我自定义的json别名注解;
package org.yunshu.medicaltechnology.proxys;
import org.yunshu.medicaltechnology.annotation.ToStringAlias;
import org.yunshu.medicaltechnology.annotation.ToStringIgnore;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class BaseDto {
@Override
public String toString() {
List<String> fields = new ArrayList<>();
Class<?> clazz = this.getClass();
while (clazz != null && clazz != Object.class) {
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
// 1. 忽略被标记为 @ToStringIgnore 的字段
if (field.isAnnotationPresent(ToStringIgnore.class)) {
continue;
}
// 2. 获取别名
String fieldName = field.getName();
if (field.isAnnotationPresent(ToStringAlias.class)) {
fieldName = field.getAnnotation(ToStringAlias.class).value();
}
// 3. 读取字段值并格式化
try {
Object value = field.get(this);
fields.add(formatField(fieldName, value != null ? value.toString() : ""));
} catch (IllegalAccessException e) {
fields.add(formatField(fieldName, ""));
}
}
clazz = clazz.getSuperclass(); // 处理继承的字段
}
return "[" + String.join(", ", fields) + "]";
}
private String formatField(String fieldName, String fieldValue) {
return "{\"ZD\":\"" + fieldName + "\",\"DA\":\"" + fieldValue + "\"}";
}
}
最终实现:
/**
* 获取并处理所有类型的数据
* @return 推送成功的记录数
*/
@Override
@Scheduled(cron = "0 20 0 * * ?")
public String insert() {
ArrayList<TechBeianBingLiDetail> bo = new ArrayList<>();
// 处理MB01数据
processMBData(gMapper.getMB01(), "MB01", "G01", NcisCaseInfoG01Dto.class, bo);
// 处理MB02数据
processMBData(gMapper.getMB02(), "MB02", "G02", NcisCaseInfoG02Dto.class, bo);
// 处理MB03数据
processMBData(gMapper.getMB03(), "MB03", "G03", NcisCaseInfoG03Dto.class, bo);
// 处理MB04数据
processMBData(gMapper.getMB04(), "MB04", "G04", NcisCaseInfoG04Dto.class, bo);
// 处理MB06数据
processMBData(gMapper.getMB06(), "MB06", "G06", NcisCaseInfoG06Dto.class, bo);
// 处理MB07数据
processMBData(gMapper.getMB07(), "MB07", "G07", NcisCaseInfoG07Dto.class, bo);
// 处理MB08数据
processMBData(gMapper.getMB08(), "MB08", "G08", NcisCaseInfoG08Dto.class, bo);
// 处理MB10数据
processMBData(gMapper.getMB10(), "MB10", "G10", NcisCaseInfoG10Dto.class, bo);
// 处理MB11数据
processMBData(gMapper.getMB11(), "MB11", "G11", NcisCaseInfoG11Dto.class, bo);
// 处理MB13数据
processMBData(gMapper.getMB13(), "MB13", "G13", NcisCaseInfoG13Dto.class, bo);
// 处理MB16数据
processMBData(gMapper.getMb16(), "MB16", "G16", NcisCaseInfoG16Dto.class, bo);
// 处理MB17数据
processMBData(gMapper.getMb17(), "MB17", "G17", NcisCaseInfoG17Dto.class, bo);
if(CollUtil.isNotEmpty(bo)){
techBeianBingLiDetailMapper.batchUpdatePushStatus(bo);
}
return String.valueOf(bo.size());
}