需求:有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 {@Overridepublic 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());}