Commit 1f199e88 by zhangxingmin

根据字段ID列表获取字段值列表

parent 0febd2b4
package com.yd.base.api.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
\ No newline at end of file
package com.yd.base.api.controller;
import com.yd.base.feign.client.fvqsetting.ApiFvqSettingFeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 字段值查询配置信息
*
* @author zxm
* @since 2025-12-23
*/
@RestController
@RequestMapping("/fvqSetting")
@Validated
public class ApiFvqSettingController implements ApiFvqSettingFeignClient {
}
...@@ -2,6 +2,8 @@ package com.yd.base.api.service.impl; ...@@ -2,6 +2,8 @@ package com.yd.base.api.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yd.base.api.service.ApiRelFieldValueService; import com.yd.base.api.service.ApiRelFieldValueService;
import com.yd.base.feign.request.relfieldvalue.ApiRelFieldValuePageRequest; import com.yd.base.feign.request.relfieldvalue.ApiRelFieldValuePageRequest;
import com.yd.base.feign.request.relfieldvalue.GetFieldListRequest; import com.yd.base.feign.request.relfieldvalue.GetFieldListRequest;
...@@ -9,17 +11,26 @@ import com.yd.base.feign.response.relfieldvalue.ApiRelFieldValuePageResponse; ...@@ -9,17 +11,26 @@ import com.yd.base.feign.response.relfieldvalue.ApiRelFieldValuePageResponse;
import com.yd.base.feign.response.relfieldvalue.ApiRelFieldValueResponse; import com.yd.base.feign.response.relfieldvalue.ApiRelFieldValueResponse;
import com.yd.base.feign.response.relfieldvalue.GetFieldListResponse; import com.yd.base.feign.response.relfieldvalue.GetFieldListResponse;
import com.yd.base.feign.response.relfieldvalue.GetFieldValueListResponse; import com.yd.base.feign.response.relfieldvalue.GetFieldValueListResponse;
import com.yd.base.service.dto.FieldDto;
import com.yd.base.service.dto.RelFieldValueDto; import com.yd.base.service.dto.RelFieldValueDto;
import com.yd.base.service.model.Field;
import com.yd.base.service.model.FvqSetting;
import com.yd.base.service.model.RelFieldValue; import com.yd.base.service.model.RelFieldValue;
import com.yd.base.service.service.IFieldService;
import com.yd.base.service.service.IFvqSettingService;
import com.yd.base.service.service.IRelFieldValueService; import com.yd.base.service.service.IRelFieldValueService;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.common.utils.TokenUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList; import org.springframework.web.client.RestTemplate;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
...@@ -29,6 +40,18 @@ public class ApiRelFieldValueServiceImpl implements ApiRelFieldValueService { ...@@ -29,6 +40,18 @@ public class ApiRelFieldValueServiceImpl implements ApiRelFieldValueService {
@Autowired @Autowired
private IRelFieldValueService iRelFieldValueService; private IRelFieldValueService iRelFieldValueService;
@Autowired
private IFvqSettingService iFvqSettingService;
@Autowired
private IFieldService iFieldService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private ObjectMapper objectMapper;
/** /**
* 保存字段值和字段的关系 * 保存字段值和字段的关系
* @param fieldValueBizId * @param fieldValueBizId
...@@ -69,30 +92,363 @@ public class ApiRelFieldValueServiceImpl implements ApiRelFieldValueService { ...@@ -69,30 +92,363 @@ public class ApiRelFieldValueServiceImpl implements ApiRelFieldValueService {
/** /**
* 根据字段ID列表获取字段值列表 * 根据字段ID列表获取字段值列表
* @param request
* @return * @return
*/ */
@Override @Override
public Result<List<GetFieldListResponse>> getFieldList(GetFieldListRequest request) { public Result<List<GetFieldListResponse>> getFieldList(GetFieldListRequest request) {
List<GetFieldListResponse> typeListResponseList = new ArrayList<>(); List<GetFieldListResponse> resultList = new ArrayList<>();
// 检查字段ID列表是否为空 // 检查字段ID列表是否为空
if (CollectionUtils.isEmpty(request.getFieldBizIdList())) { if (CollectionUtils.isEmpty(request.getFieldBizIdList())) {
return Result.success(typeListResponseList); return Result.success(resultList);
}
// 1. 根据字段ID列表查询fvq_setting配置
Map<String, FvqSetting> fvqSettingMap = getFvqSettingsByFieldIds(request.getFieldBizIdList());
// 2. 分离有配置和无配置的字段ID
List<String> configuredFieldIds = new ArrayList<>();
List<String> unconfiguredFieldIds = new ArrayList<>();
for (String fieldBizId : request.getFieldBizIdList()) {
if (fvqSettingMap.containsKey(fieldBizId) &&
fvqSettingMap.get(fieldBizId).getStatus() == 1) {
configuredFieldIds.add(fieldBizId);
} else {
unconfiguredFieldIds.add(fieldBizId);
}
}
// 3. 处理有配置的字段(通过接口获取)
Map<String, GetFieldListResponse> configuredFieldsMap = processConfiguredFields(configuredFieldIds, fvqSettingMap);
// 4. 处理无配置的字段(默认查询方式)
Map<String, GetFieldListResponse> unconfiguredFieldsMap = processUnconfiguredFields(unconfiguredFieldIds);
// 5. 按照请求字段ID的顺序合并结果
for (String fieldBizId : request.getFieldBizIdList()) {
if (configuredFieldsMap.containsKey(fieldBizId)) {
resultList.add(configuredFieldsMap.get(fieldBizId));
} else if (unconfiguredFieldsMap.containsKey(fieldBizId)) {
resultList.add(unconfiguredFieldsMap.get(fieldBizId));
} else {
// 对于既无配置也无默认数据的字段,返回空结构
resultList.add(createEmptyFieldResponse(fieldBizId));
}
}
return Result.success(resultList);
}
/**
* 根据字段ID列表查询fvq_setting配置
* @param fieldBizIdList
* @return
*/
private Map<String, FvqSetting> getFvqSettingsByFieldIds(List<String> fieldBizIdList) {
Map<String, FvqSetting> resultMap = new HashMap<>();
try {
List<FvqSetting> fvqSettings = iFvqSettingService.queryList(fieldBizIdList);
if (!CollectionUtils.isEmpty(fvqSettings)) {
resultMap = fvqSettings.stream()
.collect(Collectors.toMap(FvqSetting::getFieldBizId, setting -> setting));
}
} catch (Exception e) {
log.error("查询fvq_setting配置失败", e);
}
return resultMap;
}
/**
* 处理有配置的字段(通过接口获取字段值)
* @param configuredFieldIds
* @param fvqSettingMap
* @return
*/
private Map<String, GetFieldListResponse> processConfiguredFields(
List<String> configuredFieldIds, Map<String, FvqSetting> fvqSettingMap) {
Map<String, GetFieldListResponse> resultMap = new HashMap<>();
if (CollectionUtils.isEmpty(configuredFieldIds)) {
return resultMap;
}
// 根据字段ID列表查询字段基本信息
List<Field> fieldList = iFieldService.queryList(
FieldDto.builder().fieldBizIdList(configuredFieldIds).build());
List<ApiRelFieldValueResponse> fieldBaseInfos = fieldList.stream().map(dto -> {
ApiRelFieldValueResponse response = new ApiRelFieldValueResponse();
BeanUtils.copyProperties(dto,response);
return response;
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(fieldBaseInfos)) {
return resultMap;
}
// 按字段ID分组
Map<String, List<ApiRelFieldValueResponse>> fieldGroupMap = fieldBaseInfos.stream()
.collect(Collectors.groupingBy(ApiRelFieldValueResponse::getFieldBizId));
for (String fieldBizId : configuredFieldIds) {
FvqSetting setting = fvqSettingMap.get(fieldBizId);
if (setting == null) {
continue;
}
List<ApiRelFieldValueResponse> fieldValues = fieldGroupMap.get(fieldBizId);
if (CollectionUtils.isEmpty(fieldValues)) {
continue;
}
ApiRelFieldValueResponse firstValue = fieldValues.get(0);
// 构建字段响应对象
GetFieldListResponse fieldResponse = new GetFieldListResponse();
fieldResponse.setFieldBizId(firstValue.getFieldBizId());
fieldResponse.setFieldCode(firstValue.getFieldCode());
fieldResponse.setFieldCnName(firstValue.getFieldCnName());
fieldResponse.setFieldEnName(firstValue.getFieldEnName());
fieldResponse.setTextBoxType(firstValue.getTextBoxType());
try {
// 通过配置的接口获取字段值
List<GetFieldValueListResponse> remoteValues = fetchFieldValuesFromRemote(setting);
fieldResponse.setFieldValueListResponseList(remoteValues);
} catch (Exception e) {
log.error("通过接口获取字段值失败, fieldBizId: {}, url: {}",
fieldBizId, setting.getReqUrl(), e);
// 接口调用失败时,返回空列表
fieldResponse.setFieldValueListResponseList(new ArrayList<>());
}
resultMap.put(fieldBizId, fieldResponse);
} }
// 根据字段表唯一业务ID列表查询字段列表信息 return resultMap;
}
/**
* 从远程接口获取字段值(支持token传递)
* @param setting
* @return
* @throws Exception
*/
private List<GetFieldValueListResponse> fetchFieldValuesFromRemote(FvqSetting setting) throws Exception {
String url = setting.getReqUrl();
HttpMethod method = HttpMethod.resolve(setting.getReqMethod());
if (method == null) {
method = HttpMethod.GET; // 默认GET请求
}
// 构建请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// 添加token到请求头
String token = TokenUtils.getCurrentToken();
if (StringUtils.isNotBlank(token)) {
// 如果token以Bearer开头,直接使用;否则添加Bearer前缀
if (token.startsWith("Bearer ")) {
headers.set("Authorization", token);
} else {
headers.set("Authorization", "Bearer " + token);
}
} else {
throw new BusinessException("token不能为空");
}
// 构建请求参数
HttpEntity<String> requestEntity;
if (StringUtils.isNotBlank(setting.getReqParam())) {
requestEntity = new HttpEntity<>(setting.getReqParam(), headers);
} else {
requestEntity = new HttpEntity<>(headers);
}
// 发送请求
log.debug("调用远程接口获取字段值,URL: {}, Method: {}, Headers: {}",
url, method, headers);
ResponseEntity<String> responseEntity;
try {
responseEntity = restTemplate.exchange(
url, method, requestEntity, String.class);
} catch (Exception e) {
log.error("调用远程接口失败: {}", e.getMessage(), e);
throw new RuntimeException("调用远程接口失败: " + e.getMessage(), e);
}
// 处理响应状态
if (!responseEntity.getStatusCode().is2xxSuccessful()) {
log.error("远程接口返回错误状态码: {}, 响应体: {}",
responseEntity.getStatusCode(), responseEntity.getBody());
throw new RuntimeException("远程接口返回错误状态码: " + responseEntity.getStatusCode());
}
// 解析响应并根据映射规则提取字段值
return parseRemoteResponse(responseEntity.getBody(), setting.getResParamMapping());
}
/**
* 解析远程响应并映射为字段值列表(增强版)
* @param responseBody
* @param resParamMapping
* @return
* @throws Exception
*/
private List<GetFieldValueListResponse> parseRemoteResponse(
String responseBody, String resParamMapping) throws Exception {
List<GetFieldValueListResponse> result = new ArrayList<>();
if (StringUtils.isBlank(resParamMapping)) {
log.warn("res_param_mapping为空,无法解析响应");
return result;
}
// 解析响应映射配置
Map<String, String> mapping = objectMapper.readValue(
resParamMapping, new TypeReference<Map<String, String>>() {});
// 获取映射配置
String listPath = mapping.getOrDefault("listPath", "data.records");
String fieldValueBizIdKey = mapping.get("fieldValueBizId");
String fieldValueCodeKey = mapping.get("fieldValueCode");
String valueKey = mapping.get("value");
if (StringUtils.isAnyBlank(fieldValueBizIdKey, valueKey)) {
log.error("res_param_mapping配置不完整,缺少必要字段映射");
return result;
}
// 解析响应数据
Map<String, Object> responseMap = objectMapper.readValue(
responseBody, new TypeReference<Map<String, Object>>() {});
// 检查响应状态
Object codeObj = responseMap.get("code");
if (codeObj != null && !"200".equals(codeObj.toString()) && !"0".equals(codeObj.toString())) {
log.error("远程接口返回错误码: {}, 消息: {}",
codeObj, responseMap.get("msg"));
return result;
}
// 根据listPath获取数据列表
List<Map<String, Object>> dataList = getDataListByPath(responseMap, listPath);
if (!CollectionUtils.isEmpty(dataList)) {
for (Map<String, Object> item : dataList) {
GetFieldValueListResponse valueResponse = new GetFieldValueListResponse();
// 根据映射规则设置字段值
String fieldValueBizId = getValueByKey(item, fieldValueBizIdKey);
String fieldValueCode = getValueByKey(item, fieldValueCodeKey);
String value = getValueByKey(item, valueKey);
// 如果fieldValueCodeKey未配置,则使用fieldValueBizId或value作为code
if (StringUtils.isBlank(fieldValueCode) && StringUtils.isNotBlank(fieldValueBizIdKey)) {
fieldValueCode = fieldValueBizId;
}
valueResponse.setFieldValueBizId(fieldValueBizId);
valueResponse.setFieldValueCode(fieldValueCode);
valueResponse.setValue(value);
result.add(valueResponse);
}
}
return result;
}
/**
* 根据路径获取数据列表
*/
private List<Map<String, Object>> getDataListByPath(Map<String, Object> dataMap, String path) {
if (StringUtils.isBlank(path)) {
return Collections.emptyList();
}
String[] keys = path.split("\\.");
Object current = dataMap;
try {
for (String key : keys) {
if (current instanceof Map) {
current = ((Map<?, ?>) current).get(key);
} else {
return Collections.emptyList();
}
}
if (current instanceof List) {
@SuppressWarnings("unchecked")
List<Map<String, Object>> result = (List<Map<String, Object>>) current;
return result;
}
} catch (Exception e) {
log.error("解析listPath失败: {}", path, e);
}
return Collections.emptyList();
}
/**
* 根据key获取值(支持嵌套路径)
*/
private String getValueByKey(Map<String, Object> item, String key) {
if (StringUtils.isBlank(key)) {
return null;
}
String[] keys = key.split("\\.");
Object current = item;
try {
for (String k : keys) {
if (current instanceof Map) {
current = ((Map<?, ?>) current).get(k);
} else {
return null;
}
}
return current != null ? current.toString() : null;
} catch (Exception e) {
log.error("获取字段值失败: {}", key, e);
return null;
}
}
/**
* 处理无配置的字段(默认查询方式)
* @param unconfiguredFieldIds
* @return
*/
private Map<String, GetFieldListResponse> processUnconfiguredFields(List<String> unconfiguredFieldIds) {
Map<String, GetFieldListResponse> resultMap = new HashMap<>();
if (CollectionUtils.isEmpty(unconfiguredFieldIds)) {
return resultMap;
}
// 根据字段表唯一业务ID列表查询字段列表信息(默认方式)
List<ApiRelFieldValueResponse> responses = iRelFieldValueService.list( List<ApiRelFieldValueResponse> responses = iRelFieldValueService.list(
RelFieldValueDto.builder().fieldBizIdList(request.getFieldBizIdList()).build()); RelFieldValueDto.builder().fieldBizIdList(unconfiguredFieldIds).build());
if (CollectionUtils.isEmpty(responses)) { if (CollectionUtils.isEmpty(responses)) {
return Result.success(typeListResponseList); return resultMap;
} }
// 按字段ID分组 // 按字段ID分组
Map<String, List<ApiRelFieldValueResponse>> fieldGroupMap = responses.stream() Map<String, List<ApiRelFieldValueResponse>> fieldGroupMap = responses.stream()
.collect(Collectors.groupingBy(ApiRelFieldValueResponse::getFieldBizId)); .collect(Collectors.groupingBy(ApiRelFieldValueResponse::getFieldBizId));
for (String fieldBizId : request.getFieldBizIdList()) { for (String fieldBizId : unconfiguredFieldIds) {
List<ApiRelFieldValueResponse> fieldValues = fieldGroupMap.get(fieldBizId); List<ApiRelFieldValueResponse> fieldValues = fieldGroupMap.get(fieldBizId);
if (CollectionUtils.isEmpty(fieldValues)) { if (CollectionUtils.isEmpty(fieldValues)) {
...@@ -121,10 +477,21 @@ public class ApiRelFieldValueServiceImpl implements ApiRelFieldValueService { ...@@ -121,10 +477,21 @@ public class ApiRelFieldValueServiceImpl implements ApiRelFieldValueService {
.collect(Collectors.toList()); .collect(Collectors.toList());
fieldResponse.setFieldValueListResponseList(valueList); fieldResponse.setFieldValueListResponseList(valueList);
typeListResponseList.add(fieldResponse); resultMap.put(fieldBizId, fieldResponse);
} }
return Result.success(typeListResponseList); return resultMap;
}
/**
* 创建空的字段响应(用于没有数据的字段)
* @param fieldBizId
* @return
*/
private GetFieldListResponse createEmptyFieldResponse(String fieldBizId) {
GetFieldListResponse fieldResponse = new GetFieldListResponse();
fieldResponse.setFieldBizId(fieldBizId);
fieldResponse.setFieldValueListResponseList(new ArrayList<>());
return fieldResponse;
} }
} }
\ No newline at end of file
package com.yd.base.feign.client.fvqsetting;
import com.yd.base.feign.fallback.fvqsetting.ApiFvqSettingFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 基础数据服务-字段值查询配置信息Feign客户端
*/
@FeignClient(name = "yd-base-api", fallbackFactory = ApiFvqSettingFeignFallbackFactory.class)
public interface ApiFvqSettingFeignClient {
}
package com.yd.base.feign.fallback.fvqsetting;
import com.yd.base.feign.client.fvqsetting.ApiFvqSettingFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* 基础数据服务-字段值查询配置信息Feign降级处理
*/
@Slf4j
@Component
public class ApiFvqSettingFeignFallbackFactory implements FallbackFactory<ApiFvqSettingFeignClient> {
@Override
public ApiFvqSettingFeignClient create(Throwable cause) {
return null;
}
}
package com.yd.base.service.dao;
import com.yd.base.service.model.FvqSetting;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 字段值查询配置表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-12-23
*/
public interface FvqSettingMapper extends BaseMapper<FvqSetting> {
}
package com.yd.base.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 字段值查询配置表
* </p>
*
* @author zxm
* @since 2025-12-23
*/
@Getter
@Setter
@TableName("fvq_setting")
public class FvqSetting implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 字段值查询配置表唯一业务ID
*/
@TableField("fvq_setting_biz_id")
private String fvqSettingBizId;
/**
* 字段表唯一业务ID
*/
@TableField("field_biz_id")
private String fieldBizId;
/**
* 请求数据URL
*/
@TableField("req_url")
private String reqUrl;
/**
* 请求方式
*/
@TableField("req_method")
private String reqMethod;
/**
* 请求参数(JSON串)
*/
@TableField("req_param")
private String reqParam;
/**
* 返回参数映射(JSON串)
*/
@TableField("res_param_mapping")
private String resParamMapping;
/**
* 状态:0-禁用,1-启用
*/
@TableField("status")
private Integer status;
/**
* 字段说明备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识:0-正常,1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.base.service.service;
import com.yd.base.service.model.FvqSetting;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 字段值查询配置表 服务类
* </p>
*
* @author zxm
* @since 2025-12-23
*/
public interface IFvqSettingService extends IService<FvqSetting> {
List<FvqSetting> queryList(List<String> fieldBizIdList);
}
package com.yd.base.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.base.service.model.FvqSetting;
import com.yd.base.service.dao.FvqSettingMapper;
import com.yd.base.service.model.RelObjectCategory;
import com.yd.base.service.service.IFvqSettingService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* <p>
* 字段值查询配置表 服务实现类
* </p>
*
* @author zxm
* @since 2025-12-23
*/
@Service
public class FvqSettingServiceImpl extends ServiceImpl<FvqSettingMapper, FvqSetting> implements IFvqSettingService {
/**
* 查询列表
* @param fieldBizIdList
* @return
*/
@Override
public List<FvqSetting> queryList(List<String> fieldBizIdList) {
List<FvqSetting> list = baseMapper.selectList(new LambdaQueryWrapper<FvqSetting>()
.in(!CollectionUtils.isEmpty(fieldBizIdList),FvqSetting::getFieldBizId,fieldBizIdList)
);
return list;
}
}
...@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator { ...@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
}) })
.strategyConfig(builder -> { .strategyConfig(builder -> {
builder.addInclude( builder.addInclude(
"bank" "fvq_setting"
) )
.entityBuilder() .entityBuilder()
.enableLombok() .enableLombok()
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.base.service.dao.FvqSettingMapper">
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment