public List<Map<String, Object>> total(
      AirlineQueryModel aqm, List<Map<String, Object>> thisYearDateResult, Map<String, Object> segs)
      throws Exception {
    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

    // 经停航线。处理方式
    if (StringUtils.equals(aqm.getAirlineType(), "1")) {
      dealTotal(aqm, thisYearDateResult, segs, fce3, someE3TableField, result);
    }
    // 航段。处理方式
    else if (StringUtils.equals(aqm.getAirlineType(), "2")) {
      dealTotal(aqm, thisYearDateResult, segs, fce4, someE4TableField, result);
    }
    return result;
  }
 /**
  * 获取时间限定sql语句。。。该函数还会顺北将参数设置到 params列表中。。 要求是表别名必须是 t !!!!!
  *
  * @param aqm
  * @param thisYearDateResult
  * @param flightDateFieldName 飞行日期 e3为 lcl_dpt_dt e4为 flight_date
  * @param aiplanTypeFieldName 机型 e3为plane_model e4为aircraft_type
  * @return
  * @throws Exception
  */
 public static String limitSqlString(
     AirlineQueryModel aqm,
     List<Map<String, Object>> thisYearDateResult,
     Map<String, String> fieldName,
     List<Object> params)
     throws Exception {
   // 1 为时间段 2 为时间点。
   String dateType = thisYearDateResult.get(0).get("dateType").toString();
   StringBuffer result = new StringBuffer(" on t.client_id = '" + aqm.getClientId() + "'");
   // StringBuffer result = new StringBuffer(" on 1 = 1 ");
   if (StringUtils.equals(dateType, "1")) {
     result.append(" and (");
     for (Map<String, Object> m : thisYearDateResult) {
       String beginDt = m.get("beginDate").toString();
       String endDt = m.get("endDate").toString();
       result.append(
           " t."
               + fieldName.get("flightDate")
               + " between to_date(?, 'yyyy/MM/dd') and to_date(?, 'yyyy/MM/dd') or");
       params.add(beginDt);
       params.add(endDt);
     }
     result.append(" 1=2)");
   } else if (StringUtils.equals(dateType, "2")) {
     String dt = thisYearDateResult.get(0).get("searchDate").toString();
     String[] dtL = dt.split(",");
     result.append(
         " and to_char(t."
             + fieldName.get("flightDate")
             + ",'yyyy/MM/dd') in ("
             + Stringer.formatStr(Statics.gson.toJson(dtL))
             + ")");
   }
   if (aqm.getWeeks().length() > 2) {
     result.append(
         " and t." + fieldName.get("week") + " in (" + Stringer.formatStr(aqm.getWeeks()) + ")");
   }
   if (aqm.getCompany().length() > 2) {
     result.append(
         " and t."
             + fieldName.get("company")
             + " in ("
             + Stringer.formatStr(aqm.getCompany())
             + ")");
   }
   if (aqm.getAirplaneType().length() > 2) {
     result.append(
         " and t."
             + fieldName.get("airlineType")
             + " in ("
             + Stringer.formatStr(aqm.getAirplaneType())
             + ")");
   }
   return result.toString();
 }
  /**
   * @param aqm
   * @param thisYearDateResult
   * @param segs
   * @param fc 指标 表的配置信息
   * @param tableField 指标表对应父表的 一些字段。
   * @param result
   * @throws Exception
   * @throws IllegalAccessException
   * @throws InvocationTargetException
   */
  protected void dealTotal(
      AirlineQueryModel aqm,
      List<Map<String, Object>> thisYearDateResult,
      Map<String, Object> segs,
      BaseFlagConfig fc,
      Map<String, String> tableField,
      List<Map<String, Object>> result)
      throws Exception, IllegalAccessException, InvocationTargetException {
    // 遍历航线。如: 成都-北京首都-成都 CTU-PEK_PEK-CTU
    Set<String> keys = segs.keySet();
    for (String k : keys) {
      params.clear();
      String airlineLst = (String) segs.get(k);
      String airlines = Statics.gson.toJson(airlineLst.split("_"));

      // 获取父表名字 e0301_flt 或者 E0401_AIRLINE
      String tableName = tableField.get("tableName");

      // 年份 、航线字节码,航线中文翻译。
      StringBuffer sql =
          new StringBuffer(
              "select '" + thisYearDateResult.get(0).get("year").toString() + "' YEAR,");
      sql.append(" '" + airlineLst + "' AIRLINE,");
      sql.append(" '" + k + "' AIRLINEREF,");
      sql.append("c.DT,");
      // sum string (" sum(c.A) A,");
      sql.append(fieldJoint("c", true, true, fc));

      // 开始拼接子表。
      sql.append(" from (select ");

      // 日期维度 字段DT。
      sql.append(switchDateTypeToSqlString(thisYearDateResult, tableField.get("flightDate")));

      // 拼接指标表字段。.(" tableAlias.fieldName Alias,");
      sql.append(fieldJoint(fc.tableAlias, false, false, fc));

      // 连接指标表和父表
      sql.append(" from " + tableName + " t inner join " + fc.tableName + " " + fc.tableAlias);

      // 条件 子句拼接。
      // 日期、周、公司、机型限定。
      sql.append(limitSqlString(aqm, thisYearDateResult, tableField, params));
      // 经停航线
      if (tableName.equals(someE3TableField.get("tableName"))) {
        // 限定航线 air_line 限定air_seg_nbr为0.
        sql.append(
            " and t.air_line in (" + Stringer.formatStr(airlines) + ") and t.air_seg_nbr = 0");
      }
      // 直达航线。
      else {
        // 限定经停标识。
        sql.append(
            " and t.airline_stop_flag in ('"
                + aqm.getIncludeGoto()
                + "','"
                + aqm.getIncludeStop()
                + "')");
        // 连接离港和到达地两个字段 (离港-到达地) 限定,
        sql.append(
            " and t.dpt_airpt_cd||'-'||t.arr_airpt_cd in (" + Stringer.formatStr(airlines) + ")");
      }
      sql.append(" and t.id = " + fc.tableAlias + "." + fc.foreignFieldName);

      // 年份(已被日期限定。)、航线(已被限定)、时间维度分组。
      sql.append(" ) c group by c.DT");

      List<Map<String, Object>> listMap = super.executeSql(sql.toString(), params);
      result.addAll(listMap);

      // 非全年需要小计一次。
      String dimensionality = thisYearDateResult.get(0).get("dimensionality").toString();
      if (!dimensionality.contains("全年")) {
        subTotal(fc, result, listMap, "DT");
      }
    }
  }
  protected void dealDetailFlt(
      AirlineQueryModel aqm,
      List<Map<String, Object>> thisYearDateResult,
      List<String> segResult,
      BaseFlagConfig fc,
      Map<String, String> tableField,
      List<Map<String, Object>> result)
      throws Exception, IllegalAccessException, InvocationTargetException {
    String selectedAirline = segResult.get(0);
    String selectedAirlineRef = segResult.get(1);
    // 获取父表名字 e0301_flt 或者 E0401_AIRLINE
    String tableName = tableField.get("tableName");
    params.clear();

    // 年份 航线中文翻译。
    StringBuffer sql = new StringBuffer("select '" + aqm.getYears() + "' YEAR,");
    sql.append(" '" + selectedAirlineRef + "' AIRLINEREF,");
    sql.append("c.DT,");
    sql.append("c.FLTNO,");
    sql.append("c.FLTTM,");
    sql.append(" (case when sum(c.STOP) = 1 then 'Y' else 'N' end) STOP,");
    // sum string (" sum(c.A) A,");
    sql.append(fieldJoint("c", true, true, fc));

    // 开始拼接子表 。 年份 ,航线中文翻译。
    sql.append(" from (select ");

    // 获取日期维度DT字段。
    sql.append(switchDateTypeToSqlString(thisYearDateResult, tableField.get("flightDate")));
    // 航班号、航班时间、经停标志
    sql.append(" t.cmp_2cd||t.flt_nbr||t.flt_nbr_sfx FLTNO,");
    sql.append(" to_char(t.lcl_dpt_tm,'hh:mm') FLTTM,");
    sql.append(" t.air_stop_flag STOP,");
    // 拼接指标表字段。.(" tableAlias.fieldName Alias,");
    sql.append(fieldJoint(fc.tableAlias, false, false, fc));

    // 连接指标表和父表
    sql.append(" from " + tableName + " t inner join " + fc.tableName + " " + fc.tableAlias);

    // 条件 子句拼接。
    // 日期、周、公司、机型限定。
    sql.append(limitSqlString(aqm, thisYearDateResult, tableField, params));
    // 经停航线
    if (selectedAirline.length() == 11) {
      // 限定航线 air_line 限定air_seg_nbr为0.
      sql.append(" and t.air_line = '" + selectedAirline + "' and t.air_seg_nbr = 0");
    }
    // 直达航线。
    else {
      sql.append(" and t.dpt_airpt_cd||'-'||t.arrv_airpt_cd = '" + selectedAirline + "'");
      // 是从航段列表过来的请求
      if (StringUtils.equals(aqm.getAirlineType(), "2"))
        sql.append(
            " and t.air_stop_flag in ('"
                + aqm.getIncludeGoto()
                + "','"
                + aqm.getIncludeStop()
                + "')");
    }
    sql.append(" and t.id = " + fc.tableAlias + "." + fc.foreignFieldName);
    // 年份(已被日期限定。)、时间维度分组、航班号、航班时间。
    sql.append(" ) c group by c.DT,c.FLTNO,c.FLTTM");

    result.addAll(super.executeSql(sql.toString(), params));
  }
  protected void dealDetail(
      AirlineQueryModel aqm,
      List<Map<String, Object>> thisYearDateResult,
      List<Map<String, Object>> segResult,
      Map<String, String> tableField,
      BaseFlagConfig fc,
      String k,
      Map<String, Object> m,
      List<Map<String, Object>> result)
      throws Exception {
    params.clear();
    // 获取父表名字 e0301_flt 或者 E0401_AIRLINE
    String tableName = tableField.get("tableName");

    // 年份 、航线字节码,航线中文翻译。
    StringBuffer sql =
        new StringBuffer("select '" + thisYearDateResult.get(0).get("year").toString() + "' YEAR,");
    sql.append(" '" + k + "' AIRLINE,");
    sql.append(" '" + m.get(k) + "' AIRLINEREF,");
    sql.append("c.DT,");
    sql.append("c.COMPANY,");
    // sum string (" sum(c.A) A,");
    sql.append(fieldJoint("c", true, true, fc));

    // 开始拼接子表。
    sql.append(" from (select ");

    // 获取日期维度DT 字段。
    sql.append(switchDateTypeToSqlString(thisYearDateResult, tableField.get("flightDate")));

    // 公司字段。
    sql.append(" t." + tableField.get("company") + " COMPANY,");

    // 拼接指标表字段。.(" tableAlias.fieldName Alias,");
    sql.append(fieldJoint(fc.tableAlias, false, false, fc));

    // 连接指标表和父表
    sql.append(" from " + tableName + " t inner join " + fc.tableName + " " + fc.tableAlias);

    // 条件 子句拼接。
    // 日期、周、公司、机型限定。
    sql.append(limitSqlString(aqm, thisYearDateResult, tableField, params));
    // 经停航线
    if (tableName.equals(someE3TableField.get("tableName"))) {
      // 限定航线 air_line 限定air_seg_nbr为0.
      sql.append(" and t.air_line in ('" + k + "') and t.air_seg_nbr = 0");
    }
    // 直达航线。
    else {
      sql.append(" and t.dpt_airpt_cd = '" + k.substring(0, 3) + "'");
      sql.append(" and t.arr_airpt_cd = '" + k.substring(4, 7) + "'");
      // 限定经停标识。 从航段列表过来的请求添加额外限定 。
      if (StringUtils.equals(aqm.getAirlineType(), "2"))
        sql.append(
            " and t.airline_stop_flag in ('"
                + aqm.getIncludeGoto()
                + "','"
                + aqm.getIncludeStop()
                + "')");
    }
    sql.append(" and t.id = " + fc.tableAlias + "." + fc.foreignFieldName);

    // 年份(已被日期限定。)、航线(已被限定)、时间维度分组。
    sql.append(" ) c group by c.DT,c.COMPANY");

    List<Map<String, Object>> listMap = super.executeSql(sql.toString(), params);
    result.addAll(listMap);

    // 小计一次。
    subTotal(fc, result, listMap, "COMPANY");
  }