使用泛型<T>,模块化,反射思想进行多表数据推送

发布于:2025-07-09 ⋅ 阅读:(21) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到