GetSqlService.java 4.6 KB

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