lyh
2025-01-20 9cbd8c9b66776f427b260902ad5fbb7301794d2c
新增字典翻译返回值List,新增DictList深度翻译
已添加1个文件
已修改5个文件
333 ■■■■■ 文件已修改
lxzn-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/DictList.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocInfoController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java
@@ -58,7 +58,7 @@
    @Around("excudeService()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        long time1=System.currentTimeMillis();
        long time1=System.currentTimeMillis();
        Object result = pjp.proceed();
        long time2=System.currentTimeMillis();
        log.debug("获取JSON数据 è€—时:"+(time2-time1)+"ms");
@@ -70,7 +70,7 @@
    }
    /**
     * æœ¬æ–¹æ³•针对返回对象为Result çš„IPage的分页列表数据进行动态字典注入
     * æœ¬æ–¹æ³•针对返回对象为Result çš„IPage的分页列表数据、List数据(集合里面又套了一层集合是不支持)进行动态字典注入
     * å­—典注入实现 é€šè¿‡å¯¹å®žä½“类添加注解@dict æ¥æ ‡è¯†éœ€è¦çš„字典内容,字典分为单字典code即可 ï¼Œtable字典 code table text配合使用与原来jeecg的用法相同
     * ç¤ºä¾‹ä¸ºSysUser   å­—段为sex æ·»åŠ äº†æ³¨è§£@Dict(dicCode = "sex") ä¼šåœ¨å­—典服务立马查出来对应的text ç„¶åŽåœ¨è¯·æ±‚list的时候将这个字典text,已字段名称加_dictText形式返回到前端
     * ä¾‹è¾“入当前返回值的就会多出一个sex_dictText字段
@@ -94,12 +94,6 @@
    private Object parseDictText(Object result) {
        if (result instanceof Result) {
            if (((Result) result).getResult() instanceof IPage) {
                List<JSONObject> items = new ArrayList<>();
                //step.1 ç­›é€‰å‡ºåŠ äº† Dict æ³¨è§£çš„字段列表
                List<Field> dictFieldList = new ArrayList<>();
                // å­—典数据列表, key = å­—å…¸code,value=数据列表
                Map<String, List<String>> dataListMap = new HashMap<>(5);
                //取出结果集
                List<Object> records=((IPage) ((Result) result).getResult()).getRecords();
                //update-begin--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 åˆ¤æ–­æ˜¯å¦å«æœ‰å­—典注解,没有注解返回-----
@@ -107,102 +101,149 @@
                if(!hasDict){
                    return result;
                }
                log.debug(" __ è¿›å…¥å­—典翻译切面 DictAspect â€”— " );
                //update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 åˆ¤æ–­æ˜¯å¦å«æœ‰å­—典注解,没有注解返回-----
                for (Object record : records) {
                    String json="{}";
                    try {
                        //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                        //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
                         json = objectMapper.writeValueAsString(record);
                        //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                    } catch (JsonProcessingException e) {
                        log.error("json解析失败"+e.getMessage(),e);
                    }
                    //update-begin--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
                    JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
                    //update-end--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
                    //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
                    //for (Field field : record.getClass().getDeclaredFields()) {
                    // éåŽ†æ‰€æœ‰å­—æ®µï¼ŒæŠŠå­—å…¸Code取出来,放到 map é‡Œ
                    for (Field field : oConvertUtils.getAllFields(record)) {
                        String value = item.getString(field.getName());
                        if (oConvertUtils.isEmpty(value)) {
                            continue;
                        }
                    //update-end--Author:scott  -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
                        if (field.getAnnotation(Dict.class) != null) {
                            if (!dictFieldList.contains(field)) {
                                dictFieldList.add(field);
                            }
                            String code = field.getAnnotation(Dict.class).dicCode();
                            String text = field.getAnnotation(Dict.class).dicText();
                            String table = field.getAnnotation(Dict.class).dictTable();
                            List<String> dataList;
                            String dictCode = code;
                            if (!StringUtils.isEmpty(table)) {
                                dictCode = String.format("%s,%s,%s", table, text, code);
                            }
                            dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>());
                            this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(",")));
                        }
                        //date类型默认转换string格式化日期
                        //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                        //if (JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
                            //SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
                        //}
                        //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                    }
                    items.add(item);
                }
                //step.2 è°ƒç”¨ç¿»è¯‘方法,一次性翻译
                Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap);
                //step.3 å°†ç¿»è¯‘结果填充到返回结果里
                for (JSONObject record : items) {
                    for (Field field : dictFieldList) {
                        String code = field.getAnnotation(Dict.class).dicCode();
                        String text = field.getAnnotation(Dict.class).dicText();
                        String table = field.getAnnotation(Dict.class).dictTable();
                        String fieldDictCode = code;
                        if (!StringUtils.isEmpty(table)) {
                            fieldDictCode = String.format("%s,%s,%s", table, text, code);
                        }
                        String value = record.getString(field.getName());
                        if (oConvertUtils.isNotEmpty(value)) {
                            List<DictModel> dictModels = translText.get(fieldDictCode);
                            if(dictModels==null || dictModels.size()==0){
                                continue;
                            }
                            String textValue = this.translDictText(dictModels, value);
                            log.debug(" å­—å…¸Val : " + textValue);
                            log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue);
                            // TODO-sun æµ‹è¯•输出,待删
                            log.debug(" ---- dictCode: " + fieldDictCode);
                            log.debug(" ---- value: " + value);
                            log.debug(" ----- text: " + textValue);
                            log.debug(" ---- dictModels: " + JSON.toJSONString(dictModels));
                            record.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
                        }
                    }
                }
                ((IPage) ((Result) result).getResult()).setRecords(items);
                List<JSONObject> dictText = getDictText(records);
                ((IPage) ((Result) result).getResult()).setRecords(dictText);
            }
            else {
                //取出结果集
                Object object=  (Object) ((Result) result).getResult();
                Class<?> aClass = ((Result) result).getResult().getClass();
                if ("java.util.HashMap".equals(aClass.getName())){
                    //将map转换为集合在转换为map
                    Map<String, Object> mapset = new HashMap<>();
                    Map<String,Object> map=  (Map<String,Object>) object;
                    for (String s : map.keySet()) {
                        Object a1 = map.get(s);
                        List<Object> records=new ArrayList<>();
                        Class<?> aClass1 = a1.getClass();
                        if ("java.util.ArrayList".equals(aClass1.getName())){
                            records = (ArrayList)map.get(s);
                        }else{
                            records = oConvertUtils.castList(a1, Object.class);
                        }
                        Boolean hasDict= checkHasDict(records);
                        if(!hasDict){
                            return result;
                        }
                        List<JSONObject> dictText = getDictText(records);
                        mapset.put(s,dictText);
                    }
                    ((Result) result).setResult(mapset);
                }else {
                    List<Object> records = oConvertUtils.castList(object, Object.class);
                    //update-begin--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 åˆ¤æ–­æ˜¯å¦å«æœ‰å­—典注解,没有注解返回-----
                    Boolean hasDict= checkHasDict(records);
                    if(!hasDict){
                        return result;
                    }
                    List<JSONObject> dictText = getDictText(records);
                    ((Result) result).setResult(dictText);
                }
            }
        }
        return result;
    }
    /**
     ä¼ å…¥é›†åˆ ç¿»è¯‘字典值
     **/
    private List<JSONObject> getDictText(List<Object> records){
        List<JSONObject> items = new ArrayList<>();
        //step.1 ç­›é€‰å‡ºåŠ äº† Dict æ³¨è§£çš„字段列表
        List<Field> dictFieldList = new ArrayList<>();
        // å­—典数据列表, key = å­—å…¸code,value=数据列表
        Map<String, List<String>> dataListMap = new HashMap<>(5);
        log.debug(" __ è¿›å…¥å­—典翻译切面 DictAspect â€”— " );
        //update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 åˆ¤æ–­æ˜¯å¦å«æœ‰å­—典注解,没有注解返回-----
        for (Object record : records) {
            String json="{}";
            try {
                //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
                json = objectMapper.writeValueAsString(record);
                //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
            } catch (JsonProcessingException e) {
                log.error("json解析失败"+e.getMessage(),e);
            }
            //update-begin--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
            JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
            //update-end--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
            //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
            //for (Field field : record.getClass().getDeclaredFields()) {
            // éåŽ†æ‰€æœ‰å­—æ®µï¼ŒæŠŠå­—å…¸Code取出来,放到 map é‡Œ
            for (Field field : oConvertUtils.getAllFields(record)) {
                String value = item.getString(field.getName());
                if (oConvertUtils.isEmpty(value)) {
                    continue;
                }
                //update-end--Author:scott  -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
                if (field.getAnnotation(Dict.class) != null) {
                    if (!dictFieldList.contains(field)) {
                        dictFieldList.add(field);
                    }
                    String code = field.getAnnotation(Dict.class).dicCode();
                    String text = field.getAnnotation(Dict.class).dicText();
                    String table = field.getAnnotation(Dict.class).dictTable();
                    List<String> dataList;
                    String dictCode = code;
                    if (!StringUtils.isEmpty(table)) {
                        dictCode = String.format("%s,%s,%s", table, text, code);
                    }
                    dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>());
                    this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(",")));
                }
                //date类型默认转换string格式化日期
                //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                //if (JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
                //SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
                //}
                //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
            }
            items.add(item);
        }
        //step.2 è°ƒç”¨ç¿»è¯‘方法,一次性翻译
        Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap);
        //step.3 å°†ç¿»è¯‘结果填充到返回结果里
        for (JSONObject record : items) {
            for (Field field : dictFieldList) {
                String code = field.getAnnotation(Dict.class).dicCode();
                String text = field.getAnnotation(Dict.class).dicText();
                String table = field.getAnnotation(Dict.class).dictTable();
                String fieldDictCode = code;
                if (!StringUtils.isEmpty(table)) {
                    fieldDictCode = String.format("%s,%s,%s", table, text, code);
                }
                String value = record.getString(field.getName());
                if (oConvertUtils.isNotEmpty(value)) {
                    List<DictModel> dictModels = translText.get(fieldDictCode);
                    if(dictModels==null || dictModels.size()==0){
                        continue;
                    }
                    String textValue = this.translDictText(dictModels, value);
                    log.debug(" å­—å…¸Val : " + textValue);
                    log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue);
                    // TODO-sun æµ‹è¯•输出,待删
                    log.debug(" ---- dictCode: " + fieldDictCode);
                    log.debug(" ---- value: " + value);
                    log.debug(" ----- text: " + textValue);
                    log.debug(" ---- dictModels: " + JSON.toJSONString(dictModels));
                    record.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
                }
            }
        }
        return items;
    }
    /**
     * list åŽ»é‡æ·»åŠ 
lxzn-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/DictList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package org.jeecg.common.aspect.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * ç±»æè¿°: æ·±åº¦å­—典翻译注解
 * åªèƒ½ç”¨æ¥æ³¨è§£List类型的属性
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictList {
}
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java
@@ -23,7 +23,7 @@
import java.util.regex.Pattern;
/**
 *
 *
 * @Author  å¼ ä»£æµ©
 *
 */
@@ -41,7 +41,7 @@
        }
        return (false);
    }
    public static boolean isNotEmpty(Object object) {
        if (object != null && !"".equals(object) && !object.equals(CommonConstant.STRING_NULL)) {
            return (true);
@@ -166,7 +166,7 @@
            return (defval);
        }
    }
    public static Integer getInt(Object object) {
        if (isEmpty(object)) {
            return null;
@@ -210,7 +210,7 @@
    /*public static String escapeJava(Object s) {
        return StringEscapeUtils.escapeJava(getString(s));
    }*/
    public static String getString(Object object) {
        if (isEmpty(object)) {
            return "";
@@ -266,7 +266,7 @@
    /**
     * åˆ¤æ–­ä¸€ä¸ªç±»æ˜¯å¦ä¸ºåŸºæœ¬æ•°æ®ç±»åž‹ã€‚
     *
     *
     * @param clazz
     *            è¦åˆ¤æ–­çš„类。
     * @return true è¡¨ç¤ºä¸ºåŸºæœ¬æ•°æ®ç±»åž‹ã€‚
@@ -334,7 +334,7 @@
    /**
     * java去除字符串中的空格、回车、换行符、制表符
     *
     *
     * @param str
     * @return
     */
@@ -352,7 +352,7 @@
    /**
     * åˆ¤æ–­å…ƒç´ æ˜¯å¦åœ¨æ•°ç»„内
     *
     *
     * @param substring
     * @param source
     * @return
@@ -379,7 +379,7 @@
    /**
     * SET转换MAP
     *
     *
     * @param str
     * @return
     */
@@ -424,12 +424,12 @@
    private static boolean isInner(long userIp, long begin, long end) {
        return (userIp >= begin) && (userIp <= end);
    }
    /**
     * å°†ä¸‹åˆ’线大写方式命名的字符串转换为驼峰式。
     * å¦‚果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
     * ä¾‹å¦‚:hello_world->helloWorld
     *
     *
     * @param name
     *            è½¬æ¢å‰çš„下划线大写方式命名的字符串
     * @return è½¬æ¢åŽçš„驼峰式命名的字符串
@@ -466,12 +466,12 @@
        }
        return result.toString();
    }
    /**
     * å°†ä¸‹åˆ’线大写方式命名的字符串转换为驼峰式。
     * å¦‚果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
     * ä¾‹å¦‚:hello_world,test_id->helloWorld,testId
     *
     *
     * @param name
     *            è½¬æ¢å‰çš„下划线大写方式命名的字符串
     * @return è½¬æ¢åŽçš„驼峰式命名的字符串
@@ -489,13 +489,13 @@
        String result = sf.toString();
        return result.substring(0, result.length() - 1);
    }
    //update-begin--Author:zhoujf  Date:20180503 for:TASK #2500 ã€ä»£ç ç”Ÿæˆå™¨ã€‘代码生成器开发一通用模板生成功能
    /**
     * å°†ä¸‹åˆ’线大写方式命名的字符串转换为驼峰式。(首字母写)
     * å¦‚果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
     * ä¾‹å¦‚:hello_world->HelloWorld
     *
     *
     * @param name
     *            è½¬æ¢å‰çš„下划线大写方式命名的字符串
     * @return è½¬æ¢åŽçš„驼峰式命名的字符串
@@ -524,7 +524,7 @@
        return result.toString();
    }
    //update-end--Author:zhoujf  Date:20180503 for:TASK #2500 ã€ä»£ç ç”Ÿæˆå™¨ã€‘代码生成器开发一通用模板生成功能
    /**
     * å°†é©¼å³°å‘½åè½¬åŒ–成下划线
     * @param para
@@ -533,19 +533,19 @@
    public static String camelToUnderline(String para){
        int length = 3;
        if(para.length()<length){
            return para.toLowerCase();
            return para.toLowerCase();
        }
        StringBuilder sb=new StringBuilder(para);
        //定位
        int temp=0;
        //从第三个字符开始 é¿å…å‘½åä¸è§„范
        //从第三个字符开始 é¿å…å‘½åä¸è§„范
        for(int i=2;i<para.length();i++){
            if(Character.isUpperCase(para.charAt(i))){
                sb.insert(i+temp, "_");
                temp+=1;
            }
        }
        return sb.toString().toLowerCase();
        return sb.toString().toLowerCase();
    }
    /**
@@ -561,10 +561,10 @@
        }
        return sb.toString();
    }
    /**
     * èŽ·å–ç±»çš„æ‰€æœ‰å±žæ€§ï¼ŒåŒ…æ‹¬çˆ¶ç±»
     *
     *
     * @param object
     * @return
     */
@@ -579,7 +579,7 @@
        fieldList.toArray(fields);
        return fields;
    }
    /**
      * å°†map的key全部转成小写
     * @param list
@@ -589,10 +589,10 @@
        List<Map<String, Object>> select = new ArrayList<>();
        for (Map<String, Object> row : list) {
             Map<String, Object> resultMap = new HashMap<>(5);
             Set<String> keySet = row.keySet();
             for (String key : keySet) {
                 String newKey = key.toLowerCase();
                 resultMap.put(newKey, row.get(key));
             Set<String> keySet = row.keySet();
             for (String key : keySet) {
                 String newKey = key.toLowerCase();
                 resultMap.put(newKey, row.get(key));
             }
             select.add(resultMap);
        }
@@ -677,4 +677,19 @@
        }
        return json;
    }
    public static <T> List<T> castList(Object obj, Class<T> clazz)
    {
        List<T> result = new ArrayList<T>();
        if(obj instanceof List<?>)
        {
            for (Object o : (List<?>) obj)
            {
                result.add(clazz.cast(o));
            }
            return result;
        }
        return null;
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocInfoController.java
@@ -13,7 +13,6 @@
import org.jeecg.modules.dnc.request.DocInfoUploadRequest;
import org.jeecg.modules.dnc.response.CommonCode;
import org.jeecg.modules.dnc.response.QueryListResponseResult;
import org.jeecg.modules.dnc.response.QueryPageResponseResult;
import org.jeecg.modules.dnc.response.ResponseResult;
import org.jeecg.modules.dnc.service.IDocInfoService;
import org.jeecg.modules.dnc.utils.ValidateUtil;
@@ -177,7 +176,8 @@
    @ApiOperation(value = "文件表-查询可指派的文档信息列表", notes = "文件表-查询可指派的文档信息列表")
    @GetMapping("/find/list")
    public Result<?> findList(DocInfoQueryRequest docQuery) {
        return docInfoService.findList(docQuery);
        List<DocInfo> docInfoList=docInfoService.findList(docQuery);
        return Result.ok(docInfoList);
    }
    @AutoLog(value = "文件表-批量删除文档接口")
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
@@ -207,7 +207,7 @@
     * @param docQuery
     * @return
     */
    Result<?> findList(DocInfoQueryRequest docQuery);
    List<DocInfo> findList(DocInfoQueryRequest docQuery);
    /**
     * èŽ·å–ä¸€ç»„å·¥åºä¸‹çš„æ–‡æ¡£ä¿¡æ¯åˆ—è¡¨
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -790,7 +790,7 @@
    }
    @Override
    public Result<?> findList(DocInfoQueryRequest docQuery) {
    public List<DocInfo> findList(DocInfoQueryRequest docQuery) {
        if(docQuery == null || !ValidateUtil.validateString(docQuery.getAttributionId())
                || !ValidateUtil.validateInteger(docQuery.getAttributionType()) ||
                !ValidateUtil.validateString(docQuery.getDocClassCode())) {
@@ -816,8 +816,7 @@
        }
        queryWrapper.ge(StrUtil.isNotEmpty(docQuery.getStartTime()),"date_format(u.create_time,'%Y-%m-%d %H:%i:%s')",docQuery.getStartTime());
        queryWrapper.le(StrUtil.isNotEmpty(docQuery.getEndTime()),"date_format(u.create_time,'%Y-%m-%d %H:%i:%s')",docQuery.getEndTime());
        List<DocInfo> docInfoIPage = super.getBaseMapper().findDocExtList(queryWrapper);
        return Result.ok(docInfoIPage);
        return super.getBaseMapper().findDocExtList(queryWrapper);
    }
    @Override