Browse Source

多数据源

master
han\hanst 6 months ago
parent
commit
3e4bd07a16
  1. 12
      src/main/java/com/gaotao/modules/base/entity/ReportFamilyList.java
  2. 100
      src/main/java/com/gaotao/modules/base/service/Impl/DataSourceServiceImpl.java
  3. 44
      src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java
  4. 4
      src/main/resources/mapper/base/BaseMapper.xml

12
src/main/java/com/gaotao/modules/base/entity/ReportFamilyList.java

@ -11,12 +11,14 @@ import java.io.Serializable;
@Data
@TableName("report_family_list")
public class ReportFamilyList implements Serializable {
private String name; // 标签类型
private String site; // 工厂
private String viewSql; // 视图名称
private String ifsViewSql; // IFS视图名称
// 其他字段根据实际表结构添加
}
}

100
src/main/java/com/gaotao/modules/base/service/Impl/DataSourceServiceImpl.java

@ -2,12 +2,14 @@ package com.gaotao.modules.base.service.Impl;
import com.gaotao.modules.base.service.BaseService;
import com.gaotao.modules.base.service.DataSourceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
@Slf4j
@Service
public class DataSourceServiceImpl implements DataSourceService {
@ -20,33 +22,67 @@ public class DataSourceServiceImpl implements DataSourceService {
public List<Map<String, Object>> getViewFieldsByLabelType(String labelType, String site) {
List<Map<String, Object>> fields = new ArrayList<>();
try {
// 根据标签类型获取对应的视图名称
String viewName = getViewNameByLabelType(labelType);
if (viewName != null) {
// 查询视图的字段信息
String sql = "SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE " +
"FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_NAME = ? " +
"ORDER BY ORDINAL_POSITION";
List<Map<String, Object>> columns = jdbcTemplate.queryForList(sql, viewName);
for (Map<String, Object> column : columns) {
Map<String, Object> field = new HashMap<>();
field.put("fieldName", column.get("COLUMN_NAME"));
field.put("fieldType", column.get("DATA_TYPE"));
field.put("isRequired", "NO".equals(column.get("IS_NULLABLE")));
field.put("fieldDescription", ""); // 初始为空后续可以从配置表获取
fields.add(field);
// 根据标签类型获取对应的视图信息
Map<String, String> viewInfo = getViewInfoByLabelType(labelType);
String mainViewName = viewInfo.get("viewSql");
String ifsViewName = viewInfo.get("ifsViewSql");
// 查询主视图的字段信息
if (mainViewName != null && !mainViewName.trim().isEmpty()) {
List<Map<String, Object>> mainViewFields = getViewFields(mainViewName, "主视图");
fields.addAll(mainViewFields);
}
// 查询IFS视图的字段信息自动添加_ifs后缀
if (ifsViewName != null && !ifsViewName.trim().isEmpty()) {
List<Map<String, Object>> ifsViewFields = getViewFields(ifsViewName, "IFS视图");
// 给所有IFS视图字段添加_ifs后缀
for (Map<String, Object> field : ifsViewFields) {
String originalFieldName = field.get("fieldName").toString();
field.put("fieldName", originalFieldName + "_ifs");
}
} else {
// 如果没有找到对应的视图使用模拟数据
fields.addAll(ifsViewFields);
}
// 如果两个视图都没有找到使用模拟数据
if (fields.isEmpty()) {
fields = getCCLLabel(labelType, site);
}
// 获取已保存的字段描述
loadFieldDescriptions(labelType, site, fields);
} catch (Exception e) {
log.error("获取视图字段失败: labelType={}, error={}", labelType, e.getMessage());
}
return fields;
}
/**
* 获取指定视图的字段信息
*/
private List<Map<String, Object>> getViewFields(String viewName, String viewSource) {
List<Map<String, Object>> fields = new ArrayList<>();
try {
String sql = "SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE " +
"FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_NAME = ? " +
"ORDER BY ORDINAL_POSITION";
List<Map<String, Object>> columns = jdbcTemplate.queryForList(sql, viewName);
for (Map<String, Object> column : columns) {
Map<String, Object> field = new HashMap<>();
field.put("fieldName", column.get("COLUMN_NAME"));
field.put("fieldType", column.get("DATA_TYPE"));
field.put("isRequired", "NO".equals(column.get("IS_NULLABLE")));
field.put("fieldDescription", ""); // 初始为空后续可以从配置表获取
field.put("viewSource", viewSource); // 标识字段来源
fields.add(field);
}
} catch (Exception e) {
log.error("获取视图字段失败: viewName={}, viewSource={}, error={}", viewName, viewSource, e.getMessage());
}
return fields;
}
@ -99,9 +135,27 @@ public class DataSourceServiceImpl implements DataSourceService {
}
}
private String getViewNameByLabelType(String labelType) {
List<java.util.Map<String, Object>> viewMapping = baseService.getLabelTypeList(null,labelType);
return viewMapping.isEmpty()?null:(viewMapping.getFirst().get("viewSql")!=null?viewMapping.getFirst().get("viewSql").toString():null);
private Map<String, String> getViewInfoByLabelType(String labelType) {
Map<String, String> viewInfo = new HashMap<>();
List<java.util.Map<String, Object>> viewMapping = baseService.getLabelTypeList(null, labelType);
if (!viewMapping.isEmpty()) {
java.util.Map<String, Object> mapping = viewMapping.getFirst();
// 获取主视图SQL
Object viewSql = mapping.get("viewSql");
if (viewSql != null) {
viewInfo.put("viewSql", viewSql.toString());
}
// 获取IFS视图SQL
Object ifsViewSql = mapping.get("ifsViewSql");
if (ifsViewSql != null) {
viewInfo.put("ifsViewSql", ifsViewSql.toString());
}
}
return viewInfo;
}
private void loadFieldDescriptions(String labelType, String site, List<Map<String, Object>> fields) {

44
src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java

@ -17,11 +17,7 @@ import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@ -1243,16 +1239,42 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
}
String viewSql = familyInfo.getViewSql();
log.info("获取到视图SQL名称: {}", viewSql);
String ifsViewSql = familyInfo.getIfsViewSql();
log.info("获取到主视图SQL名称: {}", viewSql);
log.info("获取到IFS视图SQL名称: {}", ifsViewSql);
// 3. 执行视图查询获取真实数据
java.util.Map<String, Object> realDataMap = baseService.getViewData(viewSql, reportId);
if (realDataMap == null || realDataMap.isEmpty()) {
log.warn("视图查询未返回数据,使用空数据映射");
realDataMap = new java.util.HashMap<>();
java.util.Map<String, Object> realDataMap = new java.util.HashMap<>();
// 3.1 查询主视图数据
java.util.Map<String, Object> mainViewData = new java.util.HashMap<>();
if (viewSql != null && !viewSql.trim().isEmpty()) {
mainViewData = baseService.getViewData(viewSql, reportId);
if (mainViewData != null && !mainViewData.isEmpty()) {
realDataMap.putAll(mainViewData);
log.info("获取到主视图数据,字段数: {}", mainViewData.size());
}
}
// 3.2 查询IFS视图数据并添加_ifs后缀
if (ifsViewSql != null && !ifsViewSql.trim().isEmpty()) {
java.util.Map<String, Object> ifsViewData = baseService.getViewData(ifsViewSql, reportId);
if (ifsViewData != null && !ifsViewData.isEmpty()) {
// 给所有IFS字段添加_ifs后缀
for (Map.Entry<String, Object> entry : ifsViewData.entrySet()) {
String originalFieldName = entry.getKey();
String ifsFieldName = originalFieldName + "_ifs";
realDataMap.put(ifsFieldName, entry.getValue());
}
log.info("获取到IFS视图数据并添加_ifs后缀,字段数: {}", ifsViewData.size());
}
}
if (realDataMap.isEmpty()) {
log.warn("两个视图查询都未返回数据,使用空数据映射");
}
log.info("获取到真实数据,字段数: {}", realDataMap.size());
log.info("合并后的真实数据,总字段数: {}", realDataMap.size());
// 4. 使用真实数据生成ZPL
return generateZplWithData(elements, realDataMap, labelSetting);

4
src/main/resources/mapper/base/BaseMapper.xml

@ -455,7 +455,7 @@
<!-- 获取标签类型列表 -->
<select id="getLabelTypeList" resultType="java.util.Map">
SELECT name as label, name as value,view_sql as viewSql
SELECT name as label, name as value, view_sql as viewSql, ifs_view_sql as ifsViewSql
FROM report_family_list
<where>
<if test="labelType != null and labelType != ''">
@ -473,7 +473,7 @@
<!-- 根据ReportFamily获取视图SQL名称 -->
<select id="getReportFamilyByName" resultType="ReportFamilyList">
SELECT name, view_sql as viewSql
SELECT name, view_sql as viewSql, ifs_view_sql as ifsViewSql
FROM report_family_list
WHERE name = #{name}
</select>

Loading…
Cancel
Save