diff --git a/README.md b/README.md
index 26851b8..8c7ed7f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
-# open-JSD-6602
+# open-JSD-6602 热力图
-JSD-6602 热力图
\ No newline at end of file
+JSD-6602 热力图\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/lib/finekit-10.0.jar b/lib/finekit-10.0.jar
new file mode 100644
index 0000000..19d504a
Binary files /dev/null and b/lib/finekit-10.0.jar differ
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..656cbd8
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,19 @@
+
+
+ com.fr.plugin.third.party.jsdggac
+
+ yes
+ 0.6
+ 10.0
+ 2019-01-01
+ fr.open
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/third/party/jsdggac/CustomChartConfig.java b/src/main/java/com/fr/plugin/third/party/jsdggac/CustomChartConfig.java
new file mode 100644
index 0000000..93b5437
--- /dev/null
+++ b/src/main/java/com/fr/plugin/third/party/jsdggac/CustomChartConfig.java
@@ -0,0 +1,396 @@
+package com.fr.plugin.third.party.jsdggac;
+
+import com.fanruan.api.report.chart.BaseChartWithData;
+import com.fanruan.api.util.AssistKit;
+import com.fanruan.api.util.IOKit;
+import com.fanruan.api.util.StringKit;
+import com.fr.base.chart.cross.FormulaProcessor;
+import com.fr.base.chart.result.WebChartIDInfo;
+import com.fr.chart.ChartWebPara;
+import com.fr.chart.ChartWebParaProvider;
+import com.fr.chartx.data.field.ColumnField;
+import com.fr.general.GeneralUtils;
+import com.fr.json.JSONArray;
+import com.fr.json.JSONObject;
+import com.fr.plugin.context.PluginContexts;
+import com.fr.plugin.third.party.jsdggac.data.CustomGanttColumnFieldCollection;
+import com.fr.stable.xml.XMLPrintWriter;
+import com.fr.stable.xml.XMLableReader;
+import com.fr.web.core.SessionPoolManager;
+import com.fr.web.core.TemplateSessionIDInfo;
+
+import java.awt.*;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CustomChartConfig extends BaseChartWithData {
+ private static final String ID = "CUSTOM_HEAT_MAP_CHART_JSDGGAC";
+
+ private double originX = 0;
+ private double originY = 0;
+
+ private double originDiagonalX = 0;
+ private double originDiagonalY = 0;
+
+ public double getOriginX() {
+ return originX;
+ }
+
+ public void setOriginX(double originX) {
+ this.originX = originX;
+ }
+
+ public double getOriginY() {
+ return originY;
+ }
+
+ public void setOriginY(double originY) {
+ this.originY = originY;
+ }
+
+ public double getOriginDiagonalX() {
+ return originDiagonalX;
+ }
+
+ public void setOriginDiagonalX(double originDiagonalX) {
+ this.originDiagonalX = originDiagonalX;
+ }
+
+ public double getOriginDiagonalY() {
+ return originDiagonalY;
+ }
+
+ public void setOriginDiagonalY(double originDiagonalY) {
+ this.originDiagonalY = originDiagonalY;
+ }
+
+ @Override
+ protected Image designImage(int width, int height, int resolution, ChartWebParaProvider chartWebPara) {
+ return IOKit.readImageWithCache("com/fr/plugin/third/party/jsdggac/images/chart_type_demo.png");
+ }
+
+ @Override
+ protected Image exportImage(int width, int height, int resolution, ChartWebParaProvider chartWebPara) {
+ return null;
+ }
+
+ @Override
+ public CustomChartConfig clone() throws CloneNotSupportedException {
+ CustomChartConfig result = (CustomChartConfig) super.clone();
+ result.setOriginX(this.getOriginX());
+ result.setOriginY(this.getOriginY());
+ result.setOriginDiagonalX(this.getOriginDiagonalX());
+ result.setOriginDiagonalY(this.getOriginDiagonalY());
+ return result;
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() + AssistKit.hashCode(this.getOriginX()) + AssistKit.hashCode(this.getOriginY()) + AssistKit.hashCode(this.getOriginDiagonalX())
+ + AssistKit.hashCode(this.getOriginDiagonalY())
+ ;
+ }
+
+ @Override
+ public boolean equals(Object ob) {
+ return super.equals(ob)
+ && ob instanceof CustomChartConfig
+ && AssistKit.equals(this.getOriginX(), ((CustomChartConfig) ob).getOriginX())
+ && AssistKit.equals(this.getOriginY(), ((CustomChartConfig) ob).getOriginY())
+ && AssistKit.equals(this.getOriginDiagonalX(), ((CustomChartConfig) ob).getOriginDiagonalX())
+ && AssistKit.equals(this.getOriginDiagonalY(), ((CustomChartConfig) ob).getOriginDiagonalY())
+ ;
+ }
+
+ @Override
+ public JSONObject createAttributeConfig(ChartWebParaProvider chartWebPara) {
+ JSONObject jsonObject = super.createAttributeConfig(chartWebPara);
+ jsonObject.put("dataStatus", false);
+ if (!PluginContexts.currentContext().isAvailable()) {
+ return jsonObject;
+ }
+ if (isDatasEmpty()) {
+ return jsonObject;
+ }
+
+ JSONObject mapConfigJson = new JSONObject();
+ mapConfigJson.put("originX", getOriginX());
+ mapConfigJson.put("originY", getOriginY());
+ mapConfigJson.put("originDiagonalX", getOriginDiagonalX());
+ mapConfigJson.put("originDiagonalY", getOriginDiagonalY());
+ jsonObject.put("mapConfig", mapConfigJson);
+
+ //jsonObject.put("coordinates", createCoordinatesContent());
+ jsonObject.put("datas", createDatas());
+ jsonObject.put("dataStatus", true);
+ return jsonObject;
+ }
+
+
+ @Override
+ public void dealFormula(FormulaProcessor formulaProcessor) {
+ super.dealFormula(formulaProcessor);
+ }
+
+ @Override
+ public String getID() {
+ return ID;
+ }
+
+ @Override
+ public void readAttr(XMLableReader xmLableReader) {
+ super.readAttr(xmLableReader);
+ setOriginX(xmLableReader.getAttrAsDouble("originX", 10));
+ if (getOriginX() <= 0) {
+ setOriginX(10);
+ }
+ setOriginY(xmLableReader.getAttrAsDouble("originY", 0));
+ setOriginDiagonalX(xmLableReader.getAttrAsDouble("originDiagonalX", 0));
+ setOriginDiagonalY(xmLableReader.getAttrAsDouble("originDiagonalY", 0));
+ }
+
+ @Override
+ public void writeAttr(XMLPrintWriter xmlPrintWriter) {
+ super.writeAttr(xmlPrintWriter);
+ xmlPrintWriter.attr("originX", getOriginX());
+ xmlPrintWriter.attr("originY", getOriginY());
+ xmlPrintWriter.attr("originDiagonalX", getOriginDiagonalX());
+ xmlPrintWriter.attr("originDiagonalY", getOriginDiagonalY());
+ }
+
+
+ private String createCoordinatesContent() {
+ /*
+ [[[[0, 0],[1200, 0],[1200, 800],[0, 800]]]]
+ */
+ String content = "[[[[" + getOriginX() + ", " + getOriginY() + "],[" + getOriginDiagonalX() + "," + getOriginY() + "],[" + getOriginDiagonalX() + ", " + getOriginDiagonalY() + "],[" + getOriginX() + ", " + getOriginDiagonalY() + "]]]]";
+ return content;
+ }
+
+ private JSONArray createDatas() {
+ JSONArray datasJson = new JSONArray();
+ if (isDatasEmpty()) {
+ return datasJson;
+ }
+
+ CustomGanttColumnFieldCollection columnFieldCollection = getFieldCollection(CustomGanttColumnFieldCollection.class);
+ if (columnFieldCollection == null) {
+ return datasJson;
+ }
+
+ List