GetSqlService.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package com.kingdee.eas.custom.dataconfig.utils.service;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  5. import com.kingdee.bos.metadata.entity.EntityObjectInfo;
  6. import com.kingdee.bos.metadata.entity.FilterInfo;
  7. import com.kingdee.bos.sql.ParserException;
  8. import com.kingdee.eas.common.EASBizException;
  9. import com.kingdee.eas.custom.dataconfig.utils.NativeSqlJoinOptimizer;
  10. import com.kingdee.eas.custom.dataconfig.utils.SqlUtils;
  11. import com.kingdee.eas.custom.entryconfig.*;
  12. import com.kingdee.eas.custom.entryconfig.enumlist.RelationshipEnum;
  13. import java.util.Map;
  14. /**
  15. * SQL生成服务类
  16. * 实现IHRMsfService接口,用于处理SQL查询语句的构建逻辑
  17. */
  18. public class GetSqlService implements IHRMsfService {
  19. /**
  20. * 处理方法,根据输入参数构建SQL查询语句
  21. *
  22. * @param context 上下文对象,用于获取系统环境信息和服务实例
  23. * @param map 输入参数集合,包含构建SQL所需的参数
  24. * @return 构建完成的SQL语句字符串(以StringBuilder形式返回)
  25. * @throws EASBizException EAS业务异常,处理业务逻辑错误
  26. * @throws BOSException BOS框架异常,处理框架层面错误
  27. */
  28. @Override
  29. public Object process(Context context, Map map) throws EASBizException, BOSException {
  30. // 从输入参数中获取"number"键对应的值,该值为数据配置的编号
  31. Object o = map.get("number");
  32. // 检查number参数是否为空
  33. if (o == null) {
  34. // 若为空则抛出运行时异常,提示number参数不可为空
  35. throw new RuntimeException("number参数不能为空!");
  36. }
  37. // 将number参数转换为字符串类型
  38. String number = o.toString();
  39. // 实例化SQL工具类,用于处理SQL构建相关的工具方法
  40. SqlUtils sqlUtils = new SqlUtils();
  41. // 根据number编号查询对应的数据配置信息
  42. // 此处SQL查询条件为number字段等于输入的编号,查询数据配置主信息及关联的条目信息
  43. DataConfigInfo dataConfigInfo = DataConfigFactory.getLocalInstance(context)
  44. .getDataConfigInfo("select *,entrys.* where number = '" + number + "' order by entrys.seq ");
  45. // 获取数据配置中包含的实体条目集合(如关联的表/实体信息)
  46. DataConfigEntryCollection entrys = dataConfigInfo.getEntrys();
  47. if(entrys.size()<1){
  48. return "";
  49. }
  50. // 获取数据配置中包含的字段条目集合(如需要查询的字段信息)
  51. DataConfigFieldEntryCollection fieldEntry = dataConfigInfo.getFieldEntry();
  52. // 创建StringBuilder对象用于拼接SQL语句
  53. StringBuilder sql = new StringBuilder();
  54. // 拼接SQL的SELECT部分,{{filed}}为字段占位符,后续需替换为实际字段
  55. sql.append("select ").append("\n").append("{{filed}} ").append("\n").append("from").append("\n");
  56. // 获取当前索引对应的实体条目信息
  57. DataConfigEntryInfo dataConfigEntryInfo = entrys.get(0);
  58. // 获取当前实体的全路径(如实体的完整类名或唯一标识)
  59. String entryFull = dataConfigEntryInfo.getEntryFull();
  60. // 获取当前实体在SQL中的别名
  61. String alias = dataConfigEntryInfo.getAlias();
  62. // 根据实体全路径和上下文获取实体的元信息(包含实体结构、字段等信息)
  63. EntityObjectInfo entryInfo = sqlUtils.getEntryInfo(entryFull, context);
  64. // 调用工具类方法,向SQL中拼接当前实体的表名、别名等信息(作为主表,isMain参数为true)
  65. sqlUtils.getSql(sql, entryInfo, alias, context, true, null);
  66. // 循环处理实体条目集合,构建FROM及关联部分
  67. for (int i = 1; i < entrys.size(); i++) {
  68. // 获取下一个实体条目信息
  69. DataConfigEntryInfo dataConfigEntryInfo1 = entrys.get(i);
  70. // 获取下一个实体的全路径
  71. String entryFull1 = dataConfigEntryInfo1.getEntryFull();
  72. // 获取下一个实体在SQL中的别名
  73. String alias1 = dataConfigEntryInfo1.getAlias();
  74. // 根据下一个实体的全路径和上下文获取其元信息
  75. EntityObjectInfo entryInfo1 = sqlUtils.getEntryInfo(entryFull1, context);
  76. // 获取当前实体与下一个实体的关联关系(如内连接、左连接等)
  77. RelationshipEnum relationship = dataConfigEntryInfo1.getRelationship();
  78. // 获取当前实体与下一个实体的关联字段(用于拼接ON条件)
  79. String relationFeild = dataConfigEntryInfo1.getRelationFeild();
  80. // 向SQL中拼接关联关键字(如INNER JOIN、LEFT JOIN等)
  81. sql.append(relationship.getValue()).append("\t");
  82. // 调用工具类方法,向SQL中拼接下一个实体的表名、别名及关联条件(作为关联表,isMain参数为false)
  83. try {
  84. FilterInfo filter = new FilterInfo(relationFeild);
  85. sqlUtils.getSql(sql, entryInfo1, alias1, context, false, filter.toSql());
  86. } catch (ParserException e) {
  87. throw new RuntimeException(e);
  88. }
  89. }
  90. // 返回构建完成的SQL语句
  91. return sql;
  92. }
  93. }