package com.pqs9200.utils;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.TextAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFStyle;
import org.apache.poi.xwpf.usermodel.XWPFStyles;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTString;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyle;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STStyleType;

import com.njcn.pojo.commons.EventEigDetail;
import com.njcn.pojo.commons.EventInfoDetail;
import com.njcn.pojo.commons.WaveData;
import com.njcn.utils.echarts.EchartsUtil;
import com.njcn.utils.echarts.FreemarkerUtil;

import freemarker.template.TemplateException;
import net.sf.json.JSONArray;
import sun.misc.BASE64Decoder;

public class WordUtil {
	private Map<Integer, List<byte[]>> listShunPic = new HashMap<>();
	private Map<Integer, List<byte[]>> listRmsPic = new HashMap<>();
	private XWPFDocument document;
	private Map<Integer, List<EventEigDetail>> eventDetailEigenvalue = new HashMap<>();
	private Map<Integer, EventInfoDetail> eventInfoList = new HashMap<>();

	public void setEventInfoList(Integer index, EventInfoDetail eventInfoList) {
		EventInfoDetail tmp = eventInfoList == null ? new EventInfoDetail() : eventInfoList;
		this.eventInfoList.put(index, tmp);
	}

	public void setEventDetailEigenvalue(Integer index, List<EventEigDetail> eventDetailEigenvalue) {
		List<EventEigDetail> tmp = eventDetailEigenvalue == null ? new ArrayList<>() : eventDetailEigenvalue;
		this.eventDetailEigenvalue.put(index, tmp);
	}

	public XWPFDocument getDocument() {
		return document;
	}

	public WordUtil() {
		this.document = new XWPFDocument();
	}

	public void translateShun(Integer index, List<String> strPic) {
		BASE64Decoder decoder = new BASE64Decoder();
		List<byte[]> tmp = new ArrayList<>();
		
		for (int i = 0; i < strPic.size(); i++) {
			try {
				byte[] buffer = decoder.decodeBuffer(strPic.get(i));
				tmp.add(buffer);
			} catch (Exception e) {
			}
		}
		listShunPic.put(index, tmp);
	}

	public void translateRms(Integer index, List<String> strPic) {
		BASE64Decoder decoder = new BASE64Decoder();
		List<byte[]> tmp = new ArrayList<>();
		
		for (int i = 0; i < strPic.size(); i++) {
			try {
				byte[] buffer = decoder.decodeBuffer(strPic.get(i));
				tmp.add(buffer);
			} catch (Exception e) {
			}
		}
		listRmsPic.put(index, tmp);
	}
	
	public void createReport(Integer length) throws IOException, InvalidFormatException {
		setHeadingStyle(this.document);

		// 添加标题
		XWPFParagraph titleParagraph = getCenterParagraph(this.document);
		addLine(titleParagraph, 11);
		// 设置段落居中
		XWPFRun titleParagraphBigRun = titleParagraph.createRun();
		addParagraph(titleParagraphBigRun, "宋体", 28, "000000", "暂降事件报告", true);
		addLine(titleParagraph, 17);
		XWPFRun titleParagraphDateRun = titleParagraph.createRun();
//		addParagraph(titleParagraphDateRun, "宋体", 16, "000000", "南京灿能电力自动化股份有限公司", false);
		addLine(titleParagraph, 1);
		titleParagraphDateRun = titleParagraph.createRun();
		addParagraph(titleParagraphDateRun, "宋体", 14, "000000", "生成时间：" + getRightNow(), false);
		addLine(titleParagraph, 8);
		titleParagraph = getLeftParagraph(this.document);
		titleParagraphDateRun = titleParagraph.createRun();
//		addParagraph(titleParagraphDateRun, "宋体", 10, "000000", "【申明】本公司保留对报告的修改权，恕不另行通知，敬请关注最新版本。", false);
		for (int m = 0; m < length; m++) {
			List<EventEigDetail> eventDetailEigenvaluetmp =  this.eventDetailEigenvalue.get(m);

			SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
			String time = sdfs.format(eventInfoList.get(m).getTimeID());
			createTitle(document, String.valueOf(m+1) + ". " +time, "标题 1", 0, 20);
			createTitle(document, String.valueOf(m+1) + "." +"1. 基本信息", "标题 2", 0, 15);
			XWPFParagraph introductionContentParagraph = getLeftParagraph(document);
			introductionContentParagraph.setIndentationFirstLine(200);
			XWPFRun introductionContentRun = introductionContentParagraph.createRun();
			addParagraph(introductionContentRun, "宋体", 11, "000000",
					eventInfoList.get(m).getGdName() + "，" + eventInfoList.get(m).getBdzName() + "，网络参数：" + eventInfoList.get(m).getIp()
							+ "，" + eventInfoList.get(m).getLineName() + "于" + time + "发生暂降事件，特征幅值："
							+ String.valueOf(eventInfoList.get(m).getEventValue()) + "%，持续时间：" + eventInfoList.get(m).getPersistTime()
							+ "s。",
					false);
			createTitle(document, String.valueOf(m+1) + "." +"2. 波形图", "标题 2", 0, 15);
			createTitle(document, String.valueOf(m+1) + "." +"2.1 瞬时波形图", "标题 3", 200, 11);
			for(int shun = 0;shun< listShunPic.get(m).size();shun++){
				createPic(document, "瞬时波形"+String.valueOf(shun), listShunPic.get(m).get(shun));
			}
			createTitle(document, String.valueOf(m+1) + "." +"2.2 RMS波形图", "标题 3", 200, 11);
			for(int rms = 0;rms< listRmsPic.get(m).size();rms++){
				createPic(document, "RMS波形"+String.valueOf(rms), listRmsPic.get(m).get(rms));
			}
			createTitle(document, String.valueOf(m+1) + "." +"3. 多特征值", "标题 2", 0, 15);

			XWPFParagraph value = getLeftParagraph(document);
			XWPFRun valuex = value.createRun();
			addParagraph(valuex, "宋体", 11, "000000", "事件总分段数：" + eventDetailEigenvaluetmp.size(), false);
			addLine(value, 1);

			if (eventDetailEigenvaluetmp.size() == 0) {
				continue;
			}
			valuex = value.createRun();
			addParagraph(valuex, "宋体", 11, "000000", "暂降原因：" + eventDetailEigenvaluetmp.get(0).getSagReason(), false);
			addLine(value, 1);

			for (int i = 0; i < eventDetailEigenvaluetmp.size(); i++) {
				valuex = value.createRun();
				addParagraph(valuex, "宋体", 11, "000000", "分段" + (i + 1) + "多特征值", true);
				addLine(value, 1);
				valuex = value.createRun();
				addParagraph(valuex, "宋体", 11, "000000",
						"波形起始点相位(°)：" + (eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "A" : "AB") + "相"
								+ eventDetailEigenvaluetmp.get(i).getPow_a() + "   "
								+ (eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "B" : "BC") + "相"
								+ eventDetailEigenvaluetmp.get(i).getPow_b() + "   "
								+ ((eventDetailEigenvaluetmp.get(0).getPttype() == 2) ? ""
										: ((eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "C" : "CA") + "相"
												+ eventDetailEigenvaluetmp.get(i).getPow_c())),
						false);
				addLine(value, 1);
				valuex = value.createRun();
				addParagraph(valuex, "宋体", 11, "000000",
						"跳变段电压变化率(V/ms)：" + (eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "A" : "AB") + "相"
								+ eventDetailEigenvaluetmp.get(i).getVoltagechange_Va() + "   "
								+ (eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "B" : "BC") + "相"
								+ eventDetailEigenvaluetmp.get(i).getVoltagechange_Vb() + "   "
								+ ((eventDetailEigenvaluetmp.get(0).getPttype() == 2) ? ""
										: ((eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "C" : "CA") + "相"
												+ eventDetailEigenvaluetmp.get(i).getVoltagechange_Vc())),
						false);
				addLine(value, 1);
				valuex = value.createRun();
				addParagraph(valuex, "宋体", 11, "000000",
						"相位跳变(°)：" + (eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "A" : "AB") + "相"
								+ eventDetailEigenvaluetmp.get(i).getAngle_diff_ap() + "   "
								+ (eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "B" : "BC") + "相"
								+ eventDetailEigenvaluetmp.get(i).getAngle_diff_bp() + "   "
								+ ((eventDetailEigenvaluetmp.get(0).getPttype() == 2) ? ""
										: ((eventDetailEigenvaluetmp.get(0).getPttype() == 0 ? "C" : "CA") + "相"
												+ eventDetailEigenvaluetmp.get(i).getAngle_diff_cp())),
						false);
				/*
				 * addLine(value, 1); valuex = value.createRun();
				 * addParagraph(valuex, "宋体", 11, "000000", "特征幅值(V)：A相" +
				 * this.eventDetailEigenvalue.get(i).getUa_min() + "   B相" +
				 * this.eventDetailEigenvalue.get(i).getUb_min() + "   C相" +
				 * this.eventDetailEigenvalue.get(i).getUc_min(), false);
				 */
				/*
				 * addLine(value, 1); valuex = value.createRun();
				 * addParagraph(valuex, "宋体", 11, "000000", "持续时间(ms)：" +
				 * this.eventDetailEigenvalue.get(i).getHold_time_dq(), false);
				 */
				addLine(value, 1);
				valuex = value.createRun();
				addParagraph(valuex, "宋体", 11, "000000",
						"不平衡度(%)：" + eventDetailEigenvaluetmp.get(i).getBph_max_value(), false);
				addLine(value, 1);
				valuex = value.createRun();
				addParagraph(valuex, "宋体", 11, "000000", "暂降类型：" + eventDetailEigenvaluetmp.get(i).getSagType(),
						false);
				addLine(value, 1);
			}
		}
	}

	public void createPic(XWPFDocument document, String name, byte[] base64Info)
			throws IOException, InvalidFormatException {
		XWPFParagraph picParagraph = getCenterParagraph(document);
		XWPFRun createRun = picParagraph.createRun();
		InputStream in = new ByteArrayInputStream(base64Info);
		createRun.addPicture(in, 5, name, Units.toEMU(410), Units.toEMU(170));
	}

	public void createTitle(XWPFDocument document, String message, String style, int line, int fontSize) {
		XWPFParagraph summaeTableParagraph = getLeftParagraph(document);
		summaeTableParagraph.setStyle(style);
		summaeTableParagraph.setIndentationFirstLine(line);
		XWPFRun summaeTableRun = summaeTableParagraph.createRun();
		addParagraph(summaeTableRun, "宋体", fontSize, "000000", message, false);
	}

	public void setParagraphStyle(XWPFParagraph paragraph) {
		paragraph.setSpacingBefore(100);
		paragraph.setSpacingAfter(100);
	}

	/**
	 * 返回指定格式的段落 居中型
	 *
	 * @param document
	 *            文档对象
	 */
	public XWPFParagraph getCenterParagraph(XWPFDocument document) {
		XWPFParagraph paragraph = document.createParagraph();
		setParagraphStyle(paragraph);
		paragraph.setAlignment(ParagraphAlignment.CENTER);
		paragraph.setVerticalAlignment(TextAlignment.CENTER);
		return paragraph;
	}

	/**
	 * 返回指定格式的段落 居左型
	 *
	 * @param document
	 *            文档对象
	 */
	public XWPFParagraph getLeftParagraph(XWPFDocument document) {
		XWPFParagraph paragraph = document.createParagraph();
		setParagraphStyle(paragraph);
		paragraph.setAlignment(ParagraphAlignment.LEFT);
		return paragraph;
	}

	/**
	 * 添加换行符
	 *
	 * @param paragraph
	 *            指定段落
	 * @param amount
	 *            行数
	 */
	public void addLine(XWPFParagraph paragraph, Integer amount) {
		XWPFRun run = paragraph.createRun();
		run.setFontSize(11);
		for (int i = 0; i < amount; i++) {
			run.addCarriageReturn();
		}
	}

	/**
	 * 添加段落文本
	 *
	 * @param run
	 *            文本执行对象
	 * @param fontFamily
	 *            字体类型
	 * @param fontSize
	 *            字体大小
	 * @param backgroundColor
	 *            字体颜色
	 * @param bold
	 *            是否加粗
	 */
	public void addParagraph(XWPFRun run, String fontFamily, Integer fontSize, String backgroundColor, String message,
			boolean bold) {
		run.setText(message);
		run.setColor(backgroundColor);
		run.setFontSize(fontSize);
		run.setFontFamily(fontFamily);
		run.setBold(bold);
	}

	/**
	 * 增加自定义标题样式。这里用的是stackoverflow的源码
	 *
	 * @param docxDocument
	 *            目标文档
	 * @param strStyleId
	 *            样式名称
	 * @param headingLevel
	 *            样式级别
	 */
	public void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) {

		CTStyle ctStyle = CTStyle.Factory.newInstance();
		ctStyle.setStyleId(strStyleId);

		CTString styleName = CTString.Factory.newInstance();
		styleName.setVal(strStyleId);
		ctStyle.setName(styleName);

		CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
		indentNumber.setVal(BigInteger.valueOf(headingLevel));

		// lower number > style is more prominent in the formats bar
		ctStyle.setUiPriority(indentNumber);

		CTOnOff onoffnull = CTOnOff.Factory.newInstance();
		ctStyle.setUnhideWhenUsed(onoffnull);

		// style shows up in the formats bar
		ctStyle.setQFormat(onoffnull);

		// style defines a heading of the given level
		CTPPr ppr = CTPPr.Factory.newInstance();
		ppr.setOutlineLvl(indentNumber);
		ctStyle.setPPr(ppr);

		XWPFStyle style = new XWPFStyle(ctStyle);

		// is a null op if already defined
		XWPFStyles styles = docxDocument.createStyles();

		style.setType(STStyleType.PARAGRAPH);
		styles.addStyle(style);

	}

	/**
	 * 设置文档中标题格式
	 */
	public void setHeadingStyle(XWPFDocument document) {
		addCustomHeadingStyle(document, "标题 1", 1);
		addCustomHeadingStyle(document, "标题 2", 2);
		addCustomHeadingStyle(document, "标题 3", 3);
		addCustomHeadingStyle(document, "标题 4", 4);
		addCustomHeadingStyle(document, "标题 5", 5);
		addCustomHeadingStyle(document, "标题 6", 6);
		addCustomHeadingStyle(document, "标题 7", 7);
	}

	/**
	 * 给表格添加一行数据
	 *
	 * @param paragraph
	 *            段落对象
	 * @param row
	 *            行对象
	 * @param data
	 *            不定长度的数据
	 */
	public void setExcelContent(XWPFParagraph paragraph, XWPFTableRow row, String... data) {
		for (int i = 0; i < data.length; i++) {
			XWPFRun run = paragraph.createRun();
			run.setFontFamily("宋体");
			run.setText(data[i]);
			row.getCell(i).setParagraph(paragraph);
			paragraph.removeRun(0);
		}
	}

	/**
	 * 添加表头标题一行数据
	 *
	 * @param paragraph
	 *            段落对象
	 * @param row
	 *            行对象
	 * @param data
	 *            不定长度的数据
	 */
	public void setExcelHeadContent(XWPFParagraph paragraph, XWPFTableRow row, String... data) {
		XWPFRun run = paragraph.createRun();
		run.setFontFamily("宋体");
		run.setBold(true);
		run.setText(data[0]);
		row.getCell(0).setParagraph(paragraph);
		paragraph.removeRun(0);
		for (int i = 1; i < data.length; i++) {
			XWPFRun run1 = paragraph.createRun();
			run1.setFontFamily("宋体");
			run1.setBold(true);
			run1.setText(data[i]);
			row.addNewTableCell().setParagraph(paragraph);
			paragraph.removeRun(0);
		}
	}

	/**
	 * 获取当前的日期
	 *
	 * @return
	 */
	public String getRightNow() {
		Calendar rightNow = Calendar.getInstance();
		Integer year = rightNow.get(Calendar.YEAR);
		Integer month = rightNow.get(Calendar.MONTH) + 1;
		Integer day = rightNow.get(rightNow.DAY_OF_MONTH);
		return year + "年" + month + "月" + day + "日";
	}

	public String createWave(WaveData waveData) throws Exception {
		HashMap<String, Object> datas = new HashMap<>();
		List<List<Float>> sunData = waveData.getSunData();
		int iphasic =waveData.getiPhasic();
		float pt = waveData.getPt() / 1000;
		float ifmax = 0f, ifmin = 0f;
		List<List<Float>> adata = new ArrayList<>();
		List<List<Float>> bdata = new ArrayList<>();
		List<List<Float>> cdata = new ArrayList<>();

		if (sunData.size() > 0) {
			ifmax = sunData.get(0).get(1) * pt;
			ifmin = sunData.get(0).get(1) * pt;
		}
		List<String> colors =new ArrayList<>();

		for (int i = 0; i < sunData.size(); i++) {
			float x = sunData.get(i).get(0);
			if(iphasic==1){
				float shunFirstA = sunData.get(i).get(1) * pt;
				List<Float> a = new ArrayList() {
					{
						add(x);
						add(shunFirstA);
					}
				};
				adata.add(a);
				ifmax = ifmax > shunFirstA ? ifmax : shunFirstA;
				ifmin = ifmin < shunFirstA ? ifmin : shunFirstA;
				colors.add("#DAA520");
				colors.add("#fff");
				colors.add("#fff");

				datas.put("a", waveData.getA());
				datas.put("b", "");
				datas.put("c", "");
			}else if(iphasic==2){
				float shunFirstA = sunData.get(i).get(1) * pt;
				float shunFirstB = sunData.get(i).get(2) * pt;
				List<Float> a = new ArrayList() {
					{
						add(x);
						add(shunFirstA);
					}
				};
				adata.add(a);

				List<Float> b = new ArrayList() {
					{
						add(x);
						add(shunFirstB);
					}
				};
				bdata.add(b);

				ifmax = getMaxTwo(ifmax, shunFirstA, shunFirstB);
				ifmin = getMinTwo(ifmin, shunFirstA, shunFirstB);

				colors.add("#DAA520");
				colors.add("#2E8B57");
				colors.add("#fff");

				datas.put("a", waveData.getA());
				datas.put("b", waveData.getB());
				datas.put("c", "");

			}else if(iphasic==3){
				float shunFirstA = sunData.get(i).get(1) * pt;
				float shunFirstB = sunData.get(i).get(2) * pt;
				float shunFirstC = sunData.get(i).get(3) * pt;
				List<Float> a = new ArrayList() {
					{
						add(x);
						add(shunFirstA);
					}
				};
				adata.add(a);

				List<Float> b = new ArrayList() {
					{
						add(x);
						add(shunFirstB);
					}
				};
				bdata.add(b);

				List<Float> c = new ArrayList() {
					{
						add(x);
						add(shunFirstC);
					}
				};
				cdata.add(c);
				ifmax = getMax(ifmax, shunFirstA, shunFirstB, shunFirstC);
				ifmin = getMin(ifmin, shunFirstA, shunFirstB, shunFirstC);

				colors.add("#DAA520");
				colors.add("#2E8B57");
				colors.add("#A52a2a");

				datas.put("a", waveData.getA());
				datas.put("b", waveData.getB());
				datas.put("c", waveData.getC());
			}


		}

		String time = waveData.getTime();
		time = time.replace(" ", "%20");
		float severity = waveData.getYzd();
		String strSeverity = String.valueOf(severity);
		String type = waveData.getWaveType();

		if (severity < 0) {
			strSeverity = "/";
			type = "/";
		}

		String title = "监测点名称：" + waveData.getLineName() + "%20发生时刻：" + time + "%20特征幅值：" + waveData.getEventValue()
				+ "%25%20持续时间：" + waveData.getPersistTime() + "s";


		datas.put("title", title);
		datas.put("adata", JSONArray.fromObject(adata).toString());
		datas.put("bdata", JSONArray.fromObject(bdata).toString());
		datas.put("cdata", JSONArray.fromObject(cdata).toString());
		datas.put("unit", "kV");
		datas.put("max", String.valueOf(ifmax));
		datas.put("min", String.valueOf(ifmin));
		datas.put("colors", JSONArray.fromObject(colors).toString());
		datas.put("cshow", Boolean.toString(!waveData.getOpenTri()));


		String option = FreemarkerUtil.generateString("wave.ftl", "com/pqs9200/template", datas);
		return EchartsUtil.generateEchartsBase64(option, "3003");
	}

	public String createRms(WaveData waveData) throws IOException, TemplateException {
		List<List<Float>> rmsData = waveData.getRmsData();
		HashMap<String, Object> datas = new HashMap<>();
		int iphasic =waveData.getiPhasic();
		float pt = waveData.getPt() / 1000;
		List<List<Float>> adata = new ArrayList<>();
		List<List<Float>> bdata = new ArrayList<>();
		List<List<Float>> cdata = new ArrayList<>();

		List<String> colors =new ArrayList<>();
		for (int i = 0; i < rmsData.size(); i++) {
			float x = rmsData.get(i).get(0);
			if(iphasic==1){
				float rmsFirstA = rmsData.get(i).get(1) * pt;
				List<Float> a = new ArrayList() {
					{
						add(x);
						add(rmsFirstA);
					}
				};
				adata.add(a);

				colors.add("#DAA520");
				colors.add("#fff");
				colors.add("#fff");

				datas.put("a", waveData.getA());
				datas.put("b", "");
				datas.put("c", "");
			}else if(iphasic==2){
				float rmsFirstA = rmsData.get(i).get(1) * pt;
				float rmsFirstB = rmsData.get(i).get(2) * pt;
				List<Float> a = new ArrayList() {
					{
						add(x);
						add(rmsFirstA);
					}
				};
				adata.add(a);

				List<Float> b = new ArrayList() {
					{
						add(x);
						add(rmsFirstB);
					}
				};
				bdata.add(b);

				colors.add("#DAA520");
				colors.add("#2E8B57");
				colors.add("#fff");

				datas.put("a", waveData.getA());
				datas.put("b", waveData.getB());
				datas.put("c", "");
			}else if(iphasic==3){
				float rmsFirstA = rmsData.get(i).get(1) * pt;
				float rmsFirstB = rmsData.get(i).get(2) * pt;
				float rmsFirstC = rmsData.get(i).get(3) * pt;

				List<Float> a = new ArrayList() {
					{
						add(x);
						add(rmsFirstA);
					}
				};
				adata.add(a);

				List<Float> b = new ArrayList() {
					{
						add(x);
						add(rmsFirstB);
					}
				};
				bdata.add(b);

				List<Float> c = new ArrayList() {
					{
						add(x);
						add(rmsFirstC);
					}
				};
				cdata.add(c);

				colors.add("#DAA520");
				colors.add("#2E8B57");
				colors.add("#A52a2a");

				datas.put("a", waveData.getA());
				datas.put("b", waveData.getB());
				datas.put("c", waveData.getC());
			}


		}

		String time = waveData.getTime();
		time = time.replace(" ", "%20"); // 时分秒
		float severity = waveData.getYzd();
		String strSeverity = String.valueOf(severity);
		String type = waveData.getWaveType();

		if (severity < 0) {
			strSeverity = "/";
			type = "/";
		}

		String title = "监测点名称：" + waveData.getLineName() + "%20发生时刻：" + time + "%20特征幅值：" + waveData.getEventValue()
				+ "%25%20持续时间：" + waveData.getPersistTime() + "s";


		datas.put("title", title);
		datas.put("adata", JSONArray.fromObject(adata).toString());
		datas.put("bdata", JSONArray.fromObject(bdata).toString());
		datas.put("cdata", JSONArray.fromObject(cdata).toString());
		datas.put("unit", "kV");
		datas.put("colors", JSONArray.fromObject(colors).toString());
		datas.put("cshow", Boolean.toString(!waveData.getOpenTri()));

		String option = FreemarkerUtil.generateString("rms.ftl", "com/pqs9200/template", datas);
		return EchartsUtil.generateEchartsBase64(option, "3003");
	}

	private float getMin(float temp, float tempA, float tempB, float tempC) {
		temp = temp < tempA ? temp : tempA;
		temp = temp < tempB ? temp : tempB;
		temp = temp < tempC ? temp : tempC;
		return temp;
	}

	private float getMinTwo(float temp, float tempA, float tempB) {
		temp = temp < tempA ? temp : tempA;
		temp = temp < tempB ? temp : tempB;
		return temp;
	}

	private float getMax(float temp, float tempA, float tempB, float tempC) {
		temp = temp > tempA ? temp : tempA;
		temp = temp > tempB ? temp : tempB;
		temp = temp > tempC ? temp : tempC;
		return temp;
	}

	private float getMaxTwo(float temp, float tempA, float tempB) {
		temp = temp > tempA ? temp : tempA;
		temp = temp > tempB ? temp : tempB;
		return temp;
	}
}
