@Override
  public boolean save(MessageHeader header, ArrayList<ProductBean> lstBeans, String filename) {
    // TODO Auto-generated method stub

    String dataType = header.getProductType();
    String source = header.getSource();
    String yyyymmdd = header.getYyyymmdd();
    String batchID = header.getBatchID();

    StationFileHeader head = new StationFileHeader(CityType.NONE_6H);

    String title;
    String dateTimeStamp;
    String reportTime;

    long baseTime = header.getBaseTime();
    Date date = new Date(baseTime);
    reportTime = String.format("%02d", date.getHours());

    dateTimeStamp = yyyymmdd + reportTime;

    int stationCnt = lstBeans.size() / 28;

    head.init(source, dataType, dateTimeStamp, stationCnt);

    StationFileBody body = new StationFileBody();

    // 根据list bean添加站点数据
    for (ProductBean bean : lstBeans) {
      if (dataType.equals("SCMOC") && bean instanceof SCMOCBean) {
        SCMOCBean pb = (SCMOCBean) bean;

        String stationID = pb.getStation();
        String forecastTime = String.format("%d", pb.getMinutesValid() / 60);

        ForecastTimeLine line = new ForecastTimeLine(forecastTime);
        line.addDataValue(pb.getTemperature());
        line.addDataValue(pb.getHumidity()); // 相对湿度
        line.addDataValue(pb.getWindDirection());
        line.addDataValue(pb.getWindSpeed());
        line.addDataValue(pb.getAirPressure());
        line.addDataValue(pb.getPrecipitation()); // 降水量
        line.addDataValue(pb.getCloud()); // 总云量
        line.addDataValue(pb.getlCloud()); // 低运量
        line.addDataValue(pb.getWeather()); // 天气现象
        line.addDataValue(pb.getVisibility()); // 能见度
        line.addDataValue(pb.gettMax()); // 最高温度
        line.addDataValue(pb.gettMin()); // 最低温度
        line.addDataValue(pb.gethMax()); // 最大相对湿度
        line.addDataValue(pb.gethMin()); // 最小相对湿度
        line.addDataValue(pb.getPrecipitation24H()); // 24小时降水量
        line.addDataValue(pb.getrProbability12H()); // 12小时降水量
        line.addDataValue(pb.getCloud12H());
        line.addDataValue(pb.getlCloud12H());
        line.addDataValue(pb.getWeather12H());
        line.addDataValue(pb.getWindDirection12H());
        line.addDataValue(pb.getWindSpeed12H());

        if (stations.containsKey(stationID)) {
          MetaStation inf = stations.get(stationID);

          body.addStation(stationID, inf.getLon(), inf.getLat(), inf.getHeight(), line, 21);
        } else {
          body.addStation(stationID, -99.9f, -99.9f, -99.9f, line, 21);
        }

      } else if (dataType.equals("SPCC") && bean instanceof SPCCBean) {
        SPCCBean pb = (SPCCBean) bean;

        String stationID = pb.getStation();
        String forecastTime = String.format("%d", pb.getMinutesValid() / 60);

        ForecastTimeLine line = new ForecastTimeLine(forecastTime);
        line.addDataValue(999.9f);
        line.addDataValue(999.9f); // 相对湿度
        line.addDataValue(pb.getWindDirection());
        line.addDataValue(pb.getWindLevel());
        line.addDataValue(999.9f);
        line.addDataValue(999.9f); // 降水量
        line.addDataValue(999.9f); // 总云量
        line.addDataValue(999.9f); // 低运量
        line.addDataValue(pb.getWeather()); // 天气现象
        line.addDataValue(999.9f); // 能见度
        line.addDataValue(pb.getTMax()); // 最高温度
        line.addDataValue(pb.getTMin()); // 最低温度
        line.addDataValue(999.9f); // 最大相对湿度
        line.addDataValue(999.9f); // 最小相对湿度
        line.addDataValue(999.9f); // 24小时降水量
        line.addDataValue(999.9f); // 12小时降水量
        line.addDataValue(999.9f);
        line.addDataValue(999.9f);
        line.addDataValue(999.9f);
        line.addDataValue(999.9f);
        line.addDataValue(999.9f);

        if (stations.containsKey(stationID)) {
          MetaStation inf = stations.get(stationID);

          body.addStation(stationID, inf.getLon(), inf.getLat(), inf.getHeight(), line, 21);
        } else {
          body.addStation(stationID, -99.9f, -99.9f, -99.9f, line, 21);
        }
      }
    }

    // 计算站点数量和替换filename的[FFF]pattern
    int lineCntPerStaion = 0;
    String maxFFF = "";
    for (Map.Entry<String, StationObject> entry : body.getStationMap().entrySet()) {
      lineCntPerStaion = entry.getValue().getForecastLineCnt();
      int size = entry.getValue().getForecastLineList().size();
      maxFFF = entry.getValue().getForecastLineList().get(size - 1).getForecastTime();
      break;
    }
    // 站点数量
    stationCnt = lstBeans.size() / lineCntPerStaion;
    head.init(source, dataType, dateTimeStamp, stationCnt);

    // filename的[FFF]pattern
    int i_fff = Integer.valueOf(maxFFF);
    maxFFF = String.format("%03d", i_fff);
    filename = filename.replace("[FFF]", maxFFF);

    Date currentTime = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
    String stamp = formatter.format(currentTime);
    filename = filename.replace("yyyymmddhhmiss", stamp);

    StationFileObj obj = new StationFileObj(head, body);
    StationWriter writer = new StationWriter(obj, filename);

    if (!writer.save()) {
      return false;
    }

    return true;
  }