/**
   * 获取指定时间内某个命令某个客户端和实例的统计数据
   *
   * @param appId
   */
  @RequestMapping("/getAppClientInstanceCommandCost")
  public ModelAndView doGetAppClientInstanceCommandCost(
      HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
    final String costDistriDateFormat = "yyyy-MM-dd";
    long appId = NumberUtils.toLong(request.getParameter("appId"));
    // 时间转换
    String costDistriStartDate = request.getParameter("costDistriStartDate");
    String costDistriEndDate = request.getParameter("costDistriEndDate");
    Date startDate = DateUtil.parse(costDistriStartDate, costDistriDateFormat);
    Date endDate = DateUtil.parse(costDistriEndDate, costDistriDateFormat);
    long startTime = NumberUtils.toLong(DateUtil.formatDate(startDate, COLLECT_TIME_FORMAT));
    long endTime = NumberUtils.toLong(DateUtil.formatDate(endDate, COLLECT_TIME_FORMAT));

    String firstCommand = request.getParameter("firstCommand");
    long instanceId = NumberUtils.toLong(request.getParameter("instanceId"));
    String clientIp = request.getParameter("clientIp");

    // 客户端和实例统计
    List<AppClientCostTimeStat> clientInstanceChartStatList =
        clientReportCostDistriService.getAppCommandClientToInstanceStat(
            appId, firstCommand, instanceId, clientIp, startTime, endTime);
    // 缩减字段
    List<Map<String, Object>> clientInstanceStat = new ArrayList<Map<String, Object>>();
    for (AppClientCostTimeStat appClientCostTimeStat : clientInstanceChartStatList) {
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("timeStamp", appClientCostTimeStat.getTimeStamp());
      map.put("count", appClientCostTimeStat.getCount());
      map.put("mean", appClientCostTimeStat.getMean());
      map.put("median", appClientCostTimeStat.getMedian());
      map.put("max90", appClientCostTimeStat.getNinetyPercentMax());
      map.put("max99", appClientCostTimeStat.getNinetyNinePercentMax());
      map.put("max100", appClientCostTimeStat.getHundredMax());
      clientInstanceStat.add(map);
    }
    // 生成数据map json
    Map<String, Object> resultMap = new HashMap<String, Object>();
    resultMap.put("clientInstanceStat", clientInstanceStat);
    sendMessage(response, JSONObject.toJSONString(resultMap));
    return null;
  }
  /** 应用客户端耗时统计 */
  @RequestMapping("/costDistribute")
  public ModelAndView doCostDistribute(
      HttpServletRequest request, HttpServletResponse response, Model model) {
    // 1.应用信息
    Long appId = NumberUtils.toLong(request.getParameter("appId"));
    if (appId <= 0) {
      return new ModelAndView("");
    }
    AppDesc appDesc = appService.getByAppId(appId);
    model.addAttribute("appDesc", appDesc);
    model.addAttribute("appId", appId);

    // 2.获取时间区间
    TimeBetween timeBetween = new TimeBetween();
    try {
      timeBetween = fillWithCostDateFormat(request, model);
    } catch (ParseException e) {
      logger.error(e.getMessage(), e);
    }
    long startTime = timeBetween.getStartTime();
    long endTime = timeBetween.getEndTime();
    Date startDate = timeBetween.getStartDate();

    // 3.所有命令和第一个命令
    List<String> allCommands =
        clientReportCostDistriService.getAppDistinctCommand(appId, startTime, endTime);
    model.addAttribute("allCommands", allCommands);

    // 4.所有客户端和实例对应关系
    List<AppInstanceClientRelation> appInstanceClientRelationList =
        appInstanceClientRelationService.getAppInstanceClientRelationList(appId, startDate);
    model.addAttribute("appInstanceClientRelationList", appInstanceClientRelationList);

    String firstCommand = request.getParameter("firstCommand");
    if (StringUtils.isBlank(firstCommand) && CollectionUtils.isNotEmpty(allCommands)) {
      firstCommand = allCommands.get(0);
      model.addAttribute("firstCommand", firstCommand);
    } else {
      model.addAttribute("firstCommand", firstCommand);
    }

    // 5.1 应用下客户端和实例的全局耗时统计列表
    List<AppClientCostTimeTotalStat> appChartStatList =
        clientReportCostDistriService.getAppClientCommandTotalStat(
            appId, firstCommand, startTime, endTime);
    Map<String, Object> resultMap = new HashMap<String, Object>();

    // 5.2 简化字段
    List<Map<String, Object>> app = new ArrayList<Map<String, Object>>();
    for (AppClientCostTimeTotalStat appClientCostTimeTotalStat : appChartStatList) {
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("timeStamp", appClientCostTimeTotalStat.getTimeStamp());
      map.put("count", appClientCostTimeTotalStat.getTotalCount());
      map.put("mean", appClientCostTimeTotalStat.getMean());
      map.put("median", appClientCostTimeTotalStat.getMedian());
      map.put("max90", appClientCostTimeTotalStat.getNinetyPercentMax());
      map.put("max99", appClientCostTimeTotalStat.getNinetyNinePercentMax());
      map.put("max100", appClientCostTimeTotalStat.getHundredMax());
      map.put(
          "maxInst",
          appClientCostTimeTotalStat.getMaxInstanceHost()
              + ":"
              + appClientCostTimeTotalStat.getMaxInstancePort());
      map.put("maxClient", appClientCostTimeTotalStat.getMaxClientIp());
      app.add(map);
    }

    resultMap.put("app", app);
    model.addAttribute("appChartStatListJson", JSONObject.toJSONString(resultMap));

    return new ModelAndView("client/clientCostDistribute");
  }