From 3b3a2815feec0d2f436749ef450bb1a6eb4f12ca Mon Sep 17 00:00:00 2001
From: czt <czt18638530771@163.com>
Date: 星期二, 09 十二月 2025 14:28:01 +0800
Subject: [PATCH] 粮情检测提交

---
 fzzy-igdss-core/src/main/java/com/fzzy/igds/request/GrainReqData.java           |   33 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1.png           |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java              |    7 
 fzzy-igdss-web/src/main/resources/static/grain/grain-style.css                  |  618 +++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder.java        |   43 
 fzzy-igdss-web/src/main/resources/templates/grain/grain-check1.html             |  575 +++
 fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/grain/GrainController.java |  315 ++
 fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainExportBuilder.java |  346 ++
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2.png           |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5-h.png         |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg7.png             |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/OrderRespEnum.java         |   51 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/LogOperationService.java    |   38 
 fzzy-igdss-web/src/main/resources/static/grain/grainPoint1.js                   | 1348 ++++++++
 fzzy-igdss-web/src/main/resources/static/img/web/grain/qt-bg4.png               |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg6.png             |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-swt.png               |    0 
 fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/RemoteGrainService.java    |   29 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4-h.png         |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainRow.java                  |   31 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_02.png        |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainData.java                 |   30 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder01.java      |  169 +
 fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java     |   19 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ThReqData.java              |   16 
 fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainManager.java       |  498 +++
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4.png           |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/oil-all.png              |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg5.png             |    0 
 fzzy-igdss-io/src/main/java/com/fzzy/igds/io/order/ExeOrderService.java         |  341 ++
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1-h.png         |    0 
 fzzy-igdss-web/src/main/resources/static/grain/PrintBuilder-lay.js              |  576 +++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/LayPage.java                   |  175 +
 fzzy-igdss-web/src/main/resources/static/img/web/grain/cpc-pic.png              |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3.png           |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilderLay01.java   |  171 +
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg4.png             |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/PrintModeData.java             |   31 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java              |    8 
 fzzy-igdss-io/pom.xml                                                           |   75 
 fzzy-igdss-web/src/main/resources/templates/grain/grain-check4.html             |  566 +++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainLay.java                  |   47 
 fzzy-igdss-web/src/main/resources/static/grain/grain-check1.js                  |  718 ++++
 fzzy-igdss-web/pom.xml                                                          |    7 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder03.java      |  168 +
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg3.png             |    0 
 pom.xml                                                                         |    1 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java            |   34 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6.png           |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg2.png             |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_03.png        |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/img-dnxb.png             |    0 
 fzzy-igdss-web/src/main/resources/static/grain/grain-export.js                  |  130 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/LogOperation.java            |   52 
 fzzy-igdss-io/src/main/java/com/fzzy/igds/io/manager/RemoteManager.java         |   49 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/response/BaseResponse.java          |   40 
 fzzy-igdss-web/src/main/resources/templates/grain/order-list.html               |  263 +
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder04.java      |  175 +
 fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ExeBaseRequest.java         |   63 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainDataBuilder.java         |  636 ++++
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3-h.png         |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainPoint.java                |   35 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5.png           |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ReqStatus.java              |   31 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg1.png             |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GrainService.java           |   65 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-color_03.png          |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2-h.png         |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/LogOperationMapper.java      |   10 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.png           |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6-h.png         |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainParam.java                |   40 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GrainMapper.java             |   12 
 fzzy-igdss-web/src/main/resources/static/grain/grainPoint4.js                   |  633 ++++
 fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.gif           |    0 
 fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-li-bg.png             |    0 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/response/GrainResponse.java         |   18 
 77 files changed, 9,336 insertions(+), 0 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java
index 608a66d..8619237 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java
@@ -176,4 +176,11 @@
      * 缂撳瓨-鍏ュ簱ID
      */
     public static final String CACHE_RECORD_ID = "RECORD_ID";
+
+    //-绮俯澶囩敤鐐�
+    public static final double ERROR_TEMP = -100;
+    //-绮俯鏁呴殰鐐�
+    public static final double FAULT_TEMP = -101;
+    //-绮俯琛ュ伩鐐�-閽堝閿ュ舰浠撹ˉ鐐逛娇鐢�
+    public static final double ADD_TEMP = -102;
 }
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/OrderRespEnum.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/OrderRespEnum.java
new file mode 100644
index 0000000..857effd
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/OrderRespEnum.java
@@ -0,0 +1,51 @@
+package com.fzzy.igds.constant;
+
+/**
+ * 鎿嶄綔鍝嶅簲鐮�
+ * 
+ * @author Andy
+ *
+ */
+public enum OrderRespEnum {
+
+	ORDER_SUCCESS("ORDER_SUCCESS", "鍛戒护鍙戦�佹垚鍔�"),
+	ORDER_ERROR("ORDER_ERROR", "鍛戒护鍙戦�佸嚭鐜板紓甯�"),
+	ORDER_INORDER("ORDER_INORDER","鍛戒护鎵ц鎺掗槦涓�"),
+	
+	ORDER_INPROGRESS("ORDER_INPROGRESS","鍛戒护缁х画鎵ц涓�"),
+
+	NO_PROTOCOL("NO_PROTOCOL", "褰撳墠鍗忚鏈疄鐜�"),
+	NO_SIGN("NO_SIGN", "杩炴帴寮傚父锛屾病鏈夎幏鍙栧埌杩炴帴"),
+	NO_FUNCTION("NO_FUNCTION", "缁堢鏆備笉鏀寔璇ュ姛鑳�"),
+
+	MSG_SUCCESS("MSG_SUCCESS", "淇℃伅瑙f瀽鎴愬姛"),
+	MSG_ERROR("MSG_ERROR", "淇℃伅瑙f瀽寮傚父"),
+	MSG_TIMEOUT("MSG_TIMEOUT", "瑙f瀽瓒呮椂"),
+	LOGOUT("LOGOUT", "绂荤嚎")
+	;
+
+	private String code;
+	private String msg;
+
+	OrderRespEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainData.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainData.java
new file mode 100644
index 0000000..94035e5
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainData.java
@@ -0,0 +1,30 @@
+package com.fzzy.igds.data;
+
+import com.bstek.dorado.annotation.PropertyDef;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.domain.Grain;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/12/9 9:47
+ */
+@Data
+public class GrainData extends Grain implements Serializable {
+
+    private List<GrainPoint> listPoints;
+
+    @PropertyDef(label = "鍚勫眰绮俯", description = "鍏崇郴瀛楁")
+    private List<GrainLay> listLays;
+
+    @PropertyDef(label = "鍚勮娓╁害", description = "鍏崇郴瀛楁")
+    private List<GrainRow> listRows;
+
+    @PropertyDef(label = "浠撴埧淇℃伅", description = "鍏崇郴瀛楁")
+    private Depot depotData;
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainLay.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainLay.java
new file mode 100644
index 0000000..f2df0c2
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainLay.java
@@ -0,0 +1,47 @@
+package com.fzzy.igds.data;
+
+import lombok.Data;
+
+/**
+ * 绮儏鏁版嵁瑙f瀽瀵硅薄-灞備俊鎭�
+ */
+
+@Data
+public class GrainLay {
+
+    private int fz;  //鎵�鍦ㄥ眰
+
+    private int z;  //鎵�鍦ㄥ眰
+
+    private Double tempMin;  //灞傛渶浣庢俯
+
+    private Double tempMax;  //灞傛渶楂樻俯
+
+    private Double tempAve = 0.0;  //灞傚钩鍧囨俯
+
+    private Double tempAveIn = 0.0;  //鍐呭湀骞冲潎娓╁害
+
+    private Double tempAveOut = 0.0;  //澶栧湀骞冲潎娓╁害
+
+    private int sumNum;//褰撳墠灞傛�绘暟
+    
+    private int sumInNum;//鍐呭湀涓暟
+    
+    private int sumOutNum;//澶栧湀涓暟
+    
+    private double sumTemp;//灞傛�绘俯搴�
+    
+    private double sumInTemp;
+    
+    private double sumOutTemp;
+
+	public GrainLay() {
+		super();
+	}
+
+	public GrainLay(int fz, int z) {
+		super();
+		this.fz = fz;
+		this.z = z;
+	}
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainParam.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainParam.java
new file mode 100644
index 0000000..55c789c
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainParam.java
@@ -0,0 +1,40 @@
+package com.fzzy.igds.data;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * @Description 绮儏涓氬姟鍙傛暟鍙傛暟瀹氫箟
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class GrainParam extends IgdsBaseParam {
+
+	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	private Date checkDate;// 妫�娴嬫棩鏈� yyyy-MM-dd
+
+	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM", timezone = "GMT+8")
+	private Date checkMonth;// 妫�娴嬫棩鏈�
+
+	private int checkHour;//妫�娴嬫椂闂村皬鏃讹紝0涓嶇畻
+
+	private String batchId;// 鎵规鍙�
+
+	private String extBatchId;// 闇�瑕佽鎺掗櫎鎵规鍙�
+
+	private String depotIds;// 浠ラ�楀彿闅斿紑鐨勪粨搴撶紪鐮侊紝澶氫釜浠撳簱缂栫爜
+
+	private boolean tagUpdate = true;// 鏄惁鏇存柊灞傛暟鎹拰琛屾暟鎹�
+
+	private String cableRule;//甯冪嚎瑙勫垯
+
+	private String cableCir;//绛掍粨灞傚竷绾胯鍒�
+
+	private String depotType;//浠撳簱绫诲瀷
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainPoint.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainPoint.java
new file mode 100644
index 0000000..9242090
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainPoint.java
@@ -0,0 +1,35 @@
+package com.fzzy.igds.data;
+
+import lombok.Data;
+
+/**
+ * 绮儏鏁版嵁瑙f瀽瀵硅薄-閲囬泦鐐瑰璞′俊鎭紝XYZ琛ㄧず鐨勫垪琛屽眰锛屾暟鍊间粠1寮�濮嬨��
+ * 
+ */
+@Data
+public class GrainPoint {
+
+    private int z;  // 鎵�鍦ㄥ眰
+
+    private int fz;  // 鎵�鍦ㄥ眰
+
+    private int x;  //鎵�鍦ㄥ垪锛岀瓛浠撴墍鍦ㄥ湀鏁�
+
+    private int y;  //鎵�鍦ㄨ锛岀瓛浠撴牴鍙凤紝鎬绘牴鍙�
+
+    private Double temp = 0.0;  //閲囬泦鐐规俯搴�
+
+	public GrainPoint() {
+		super();
+	}
+
+	public GrainPoint(Double temp, int x, int y, int z, int fz) {
+		super();
+		this.z = z;
+		this.x = x;
+		this.y = y;
+		this.fz = fz;
+		this.temp = temp;
+	}
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainRow.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainRow.java
new file mode 100644
index 0000000..35a44cf
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainRow.java
@@ -0,0 +1,31 @@
+package com.fzzy.igds.data;
+
+import lombok.Data;
+
+/**
+ * 绮儏鏁版嵁瑙f瀽瀵硅薄-鍒椾俊鎭�
+ */
+@Data
+public class GrainRow {
+
+	private int y;  //鎵�鍦ㄨ,鏁版嵁浠�0寮�濮嬶紝濡傛灉鏄瓛浠撶殑璇濓紝鐢ㄤ簬璁板綍绛掍粨鐨勬牴鏁�
+
+	private Double tempMin;  //灞傛渶浣庢俯
+
+	private Double tempMax;  //灞傛渶楂樻俯
+
+	private Double tempAve = 0.0;  //灞傚钩鍧囨俯
+
+	private int sumNum;// 褰撳墠灞傛�绘暟
+
+	private double sumTemp;// 灞傛�绘俯搴�
+
+	public GrainRow() {
+		super();
+	}
+
+	public GrainRow(int y) {
+		super();
+		this.y = y;
+	}
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/LayPage.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/LayPage.java
new file mode 100644
index 0000000..1ea874f
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/LayPage.java
@@ -0,0 +1,175 @@
+package com.fzzy.igds.data;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description 瀵筆age<E>缁撴灉杩涜鍖呰   涔嬫墍浠ヨ繘琛屽皝瑁呮槸鍥犱负LayUI涓笉绠″垎椤典笌鍚﹁幏鍙栨暟鎹紝閮介渶瑕佷竴涓畬鏁寸殑鏍煎紡杩斿洖銆� LAYUI涓姹傛煡璇㈡暟鎹繀椤诲皝瑁呬负锛歿code:0,msg:"",count:1000,data:[] }
+ * @Author CZT
+ * @Date 2025/11/29 10:56
+ */
+public class LayPage<T> implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	// 褰撳墠椤�
+	private long curr;
+	// 姣忛〉鐨勬暟閲�
+	private long limit;
+	// 鎬昏褰曟暟
+	private long count;
+	// 鎬婚〉鏁�
+	private int pages;
+	// 缁撴灉闆�
+	private List<T> data;
+	// 鏄惁涓虹涓�椤�
+	private boolean isFirstPage = false;
+	// 鏄惁涓烘渶鍚庝竴椤�
+	private boolean isLastPage = false;
+
+	// LayUI涓殑蹇呴』杩斿洖鐨勭粨鏋滅紪鐮� 0琛ㄧず鎴愬姛銆�
+	private int code = 0;
+	// LayUI涓紓甯镐俊鎭��
+	private String msg;
+
+	public LayPage() {
+		super();
+		this.count = 0;
+		this.curr = 1;
+		this.code = 0;
+		this.msg ="鏃犳暟鎹�";
+	}
+
+	/**
+	 * 鍖呰Page瀵硅薄
+	 *
+	 * @param list
+	 */
+	public LayPage(List<T> list) {
+		super();
+		if (null == list || list.isEmpty()) {
+			this.count = 0;
+			this.curr = 1;
+			this.code = 0;
+			this.msg ="鏃犳暟鎹�";
+		}
+		if (list instanceof Collection) {
+			this.curr = 1;
+			this.limit = list.size();
+
+			this.pages = 1;
+			this.data = list;
+			this.count = list.size();
+		}
+		if (list instanceof Collection) {
+			// 鍒ゆ柇椤甸潰杈圭晫
+			judgePageBoudary();
+		}
+	}
+
+	public LayPage(Page<T> page) {
+		this.curr = page.getCurrent();
+		this.limit = page.getSize();
+
+		this.pages = (int)page.getPages();
+		this.data = (List<T>) page.getRecords();
+		this.count = page.getTotal();
+	}
+
+	/**
+	 * 鍒ゅ畾椤甸潰杈圭晫
+	 */
+	private void judgePageBoudary() {
+		isFirstPage = curr == 1;
+		isLastPage = curr == pages;
+	}
+
+	public long getPageNum() {
+		return curr;
+	}
+
+	public void setPageNum(int pageNum) {
+		this.curr = pageNum;
+	}
+
+	public long getLimit() {
+		return limit;
+	}
+
+	public void setLimit(int limit) {
+		this.limit = limit;
+	}
+
+	public long getCount() {
+		return count;
+	}
+
+	public void setCount(long count) {
+		this.count = count;
+	}
+
+	public int getPages() {
+		return pages;
+	}
+
+	public void setPages(int pages) {
+		this.pages = pages;
+	}
+
+	public List<T> getData() {
+		return data;
+	}
+
+	public void setData(List<T> data) {
+		this.data = data;
+	}
+
+	public boolean isIsFirstPage() {
+		return isFirstPage;
+	}
+
+	public void setIsFirstPage(boolean isFirstPage) {
+		this.isFirstPage = isFirstPage;
+	}
+
+	public boolean isIsLastPage() {
+		return isLastPage;
+	}
+
+	public void setIsLastPage(boolean isLastPage) {
+		this.isLastPage = isLastPage;
+	}
+
+	@Override
+	public String toString() {
+		final StringBuffer sb = new StringBuffer("PageInfo{");
+		sb.append("curr=").append(curr);
+		sb.append(", limit=").append(limit);
+		sb.append(", count=").append(count);
+		sb.append(", pages=").append(pages);
+		sb.append(", data=").append(data);
+		sb.append(", isFirstPage=").append(isFirstPage);
+		sb.append(", isLastPage=").append(isLastPage);
+		sb.append(", navigatepageNums=");
+		sb.append('}');
+		return sb.toString();
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/PrintModeData.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/PrintModeData.java
new file mode 100644
index 0000000..7c15d18
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/PrintModeData.java
@@ -0,0 +1,31 @@
+package com.fzzy.igds.data;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * @Description 鐢ㄤ簬灏佽妯℃澘绮儏妯℃澘淇℃伅
+ * @Author CZT
+ * @Date 2025/11/29 11:02
+ */
+@Data
+public class PrintModeData implements Serializable {
+
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 5679268829597439794L;
+
+    private String companyId;  //缁勭粐缂栫爜
+
+    private String depotType; //浠撳簱绫诲瀷
+
+    private String model; //妯℃澘鍐呭
+
+    private String modelType = "COMMON"; //妯℃澘绫诲瀷,閫氱敤妯℃澘=COMMON锛岃瑙勫垯妯℃澘=ROW
+
+    private String msg; //寮傚父淇℃伅
+
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/LogOperation.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/LogOperation.java
new file mode 100644
index 0000000..715147d
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/LogOperation.java
@@ -0,0 +1,52 @@
+package com.fzzy.igds.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bstek.dorado.annotation.PropertyDef;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description 鎿嶄綔鏃ュ織锛屼粎浠呰〃绀轰笟鍔′笂鐨勬搷浣滄棩蹇椼��
+ * @Author CZT
+ * @Date 2025/11/25 17:20
+ */
+@Data
+@Entity
+@Table(name = "d_log_operation")
+@TableName("d_log_operation")
+@EqualsAndHashCode(callSuper = false)
+public class LogOperation extends BizBaseEntity implements Serializable {
+
+	@Id
+	@Column(name = "id", unique = true, length = 40)
+	@PropertyDef(label = "id")
+	private String id;
+
+	@Column(name = "dept_id", columnDefinition = "varchar(40) COMMENT '鎵�灞炲簱鍖�'")
+	@TableField("dept_id")
+	private String deptId;
+
+	@Column(name = "biz_type", columnDefinition = "varchar(40) COMMENT '涓氬姟绫诲瀷'")
+	@TableField("biz_type")
+	private String bizType = "sys";
+
+	@Column(name = "operate_time", columnDefinition = "datetime COMMENT '鎵ц鏃堕棿'")
+	@TableField("operate_time")
+	private Date operateTime;
+
+	@Column(name = "operate_user", columnDefinition = "varchar(40) COMMENT '鎵ц浜�'")
+	@TableField("operate_user")
+	private String operateUser;
+
+	@Column(name = "operate_info", columnDefinition = "varchar(1000) COMMENT '鎵ц鍐呭'")
+	@TableField("operate_info")
+	private String operateInfo;
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GrainMapper.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GrainMapper.java
new file mode 100644
index 0000000..a67464b
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GrainMapper.java
@@ -0,0 +1,12 @@
+package com.fzzy.igds.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fzzy.igds.domain.Grain;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/12/9 10:00
+ */
+public interface GrainMapper extends BaseMapper<Grain> {
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/LogOperationMapper.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/LogOperationMapper.java
new file mode 100644
index 0000000..b83df79
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/LogOperationMapper.java
@@ -0,0 +1,10 @@
+package com.fzzy.igds.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fzzy.igds.domain.LogOperation;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface LogOperationMapper extends BaseMapper<LogOperation> {
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ExeBaseRequest.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ExeBaseRequest.java
new file mode 100644
index 0000000..a4486e0
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ExeBaseRequest.java
@@ -0,0 +1,63 @@
+package com.fzzy.igds.request;
+
+import com.fzzy.igds.utils.ContextUtil;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+@Data
+public class ExeBaseRequest<T> {
+
+    private String requestId;//鑷畾涔夊懡浠D
+
+    private String companyId;//缁勭粐缂栫爜
+
+    private String deptId;//鍒嗗簱缂栫爜
+
+    private String depotId;//浠撳簱缂栧彿
+
+    private String depotName;//浠撳簱鍚嶇О
+
+    private String bizType;//涓氬姟绫诲瀷
+
+    private String serId = "0";//鍒嗘満缂栧彿
+
+    private String serName = "鏃�";//鍒嗘満鍚嶇О
+
+    private String sn = "0";//鍒嗘満搴忓垪鍙�
+
+    private String ip; //鍒嗘満IP
+
+    private Integer port;//鍒嗘満绔彛鍙�
+
+    private String protocol;//褰撳墠鍛戒护鐨勫崗璁�
+
+    private Date exeTime = new Date();//鎵ц鏃堕棿
+
+    private String exeUser;// 鍙戣捣浜�
+
+    private boolean repeatTag = false;//鏄惁鏀寔閲嶅鎵ц锛屽嵆鍦ㄤ笂涓懡浠ゆ湭鍝嶅簲鐨勬椂鍊欙紝鍏佽鎵ц绗簩閬�
+
+    private boolean addLogTag = true;//鏄惁娣诲姞鏃ュ織
+
+    private boolean addCacheTag = true;//鏄惁娣诲姞鍔熻兘缂撳瓨
+
+    private String exeMsg = null;//鎵ц淇℃伅
+
+    private String errorMsg = null;//寮傚父淇℃伅
+
+    private boolean isSave = true;//鏄惁淇濆瓨鍒版暟鎹簱
+
+    private String status = ReqStatus.IN_PROGRESS.getCode();
+
+    private T reqData = null;//鍛戒护鎵ц鏁版嵁灏佽
+
+    public ExeBaseRequest() {
+        super();
+        this.requestId = ContextUtil.getTimeId(1000, 9999);
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/GrainReqData.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/GrainReqData.java
new file mode 100644
index 0000000..d005fc2
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/GrainReqData.java
@@ -0,0 +1,33 @@
+package com.fzzy.igds.request;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+
+/**
+ * @Description 绮儏妫�娴嬭姹�
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class GrainReqData implements Serializable {
+
+    private int cableStart;//鐢电紗寮�濮�
+
+    private int cableEnd;//鐢电紗鎴嚦
+
+    private String cableRule;
+
+    private String thSerId;//浠撴俯浠撴箍浣跨敤鐨勫垎鏈�
+
+    private String thConf;//浠撴俯婀块�氶亾
+
+    private String isMoreDepot;//澶氫粨骞跺彂锛氶拡瀵笷ZZY-TCP-V6鍗忚浣跨敤
+
+    public GrainReqData() {
+        super();
+    }
+
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ReqStatus.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ReqStatus.java
new file mode 100644
index 0000000..806287b
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ReqStatus.java
@@ -0,0 +1,31 @@
+package com.fzzy.igds.request;
+
+/**
+ * @Description 鎵ц鍛戒护鐨勭姸鎬侊紝濡傛灉鐘舵�佹墽琛屼腑锛岄偅涔堜笉鍏佽閲嶅鎵ц鍚屼竴涓被鍨嬬殑鍛戒护
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+public enum ReqStatus {
+    INIT("INIT", "鍒濆鍖栫姸鎬�"),
+    IN_PROGRESS("IN_PROGRESS", "鎵ц涓�"),
+    SEND_ERROR("SEND_ERROR", "鍙戦�佸紓甯�"),
+    ANALYSIS_ERROR("ANALYSIS_ERROR", "瑙f瀽寮傚父"),
+    TIMEOUT_ERROR("TIMEOUT_ERROR", "澶勭悊瓒呮椂"),
+    COMPLETE("COMPLETE", "瀹屾垚");
+
+    private String code;
+    private String msg;
+
+    ReqStatus(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ThReqData.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ThReqData.java
new file mode 100644
index 0000000..766227c
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ThReqData.java
@@ -0,0 +1,16 @@
+package com.fzzy.igds.request;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Description 浠撴俯浠撴箍璇锋眰
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+@Data
+public class ThReqData implements Serializable {
+
+    private String thConf;//浠撴俯婀块�氶亾
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/response/BaseResponse.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/response/BaseResponse.java
new file mode 100644
index 0000000..c6b46e5
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/response/BaseResponse.java
@@ -0,0 +1,40 @@
+package com.fzzy.igds.response;
+
+import com.fzzy.igds.constant.OrderRespEnum;
+import lombok.Data;
+
+/**
+ * @Description 鍝嶅簲鏁版嵁灏佽锛屽懡浠ょ殑璇锋眰鍒嗕负涓や釜闃舵锛屽彂閫佸拰鍝嶅簲
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Data
+public class BaseResponse {
+
+    //鎵ц楠岃瘉鎴愬姛
+    public static final String CHECK_SUCCESS ="0000";
+    //鎵ц楠岃瘉澶辫触锛屽叿浣撳け璐ュ師鍥犳剰鑷畾涔�
+    public static final String CHECK_ERROR ="1111";
+
+
+    private String code;//璇锋眰浠g爜
+
+    private String msg;//璇锋眰杩斾俊鎭�
+
+    private String orderId;
+
+    public BaseResponse() {
+    }
+
+    public BaseResponse(String code, String msg) {
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public BaseResponse(OrderRespEnum orderRespEnum) {
+        this.msg = orderRespEnum.getMsg();
+        this.code = orderRespEnum.getCode();
+    }
+
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/response/GrainResponse.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/response/GrainResponse.java
new file mode 100644
index 0000000..ddb1279
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/response/GrainResponse.java
@@ -0,0 +1,18 @@
+package com.fzzy.igds.response;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Description 绮儏妫�娴嬪搷搴旂粨鏋滀俊鎭�
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class GrainResponse extends BaseResponse {
+
+	public GrainResponse(String code, String msg) {
+		super(code,msg);
+	}
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java
index cdbe480..c6c9507 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java
@@ -178,6 +178,38 @@
     }
 
     /**
+     * 鑾峰彇涓存椂璺緞
+     * @param companyId
+     * @return
+     */
+    public String getTempFilePath(String companyId) {
+
+        String basePath = FrameworkConfig.getProfile() + "TEMP/";
+        if (org.apache.commons.lang3.StringUtils.isNotEmpty(companyId)) {
+            basePath += companyId + "/";
+        }
+        File file = new File(basePath);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        return basePath;
+    }
+
+    /**
+     * 鑾峰彇妯℃澘璺緞
+     * @return
+     */
+    public String getConfPath() {
+
+        String basePath = FrameworkConfig.getProfile() + "CONF/";
+        File file = new File(basePath);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        return basePath;
+    }
+
+    /**
      * 鍘嬬缉鍥剧墖
      *
      * @param filePath   鍘嬬缉鍓嶈矾寰�
@@ -201,4 +233,6 @@
         ImageIO.write(compressedImage, "jpg", new File(outputPath));
     }
 
+
+
 }
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GrainService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GrainService.java
new file mode 100644
index 0000000..24520e5
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GrainService.java
@@ -0,0 +1,65 @@
+package com.fzzy.igds.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fzzy.igds.data.GrainParam;
+import com.fzzy.igds.domain.Grain;
+import com.fzzy.igds.mapper.GrainMapper;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.DateUtil;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/12/9 10:00
+ */
+@Slf4j
+@Service
+public class GrainService {
+
+    @Resource
+    private GrainMapper grainMapper;
+
+    /**
+     * 鏌ヨ鏁版嵁
+     * @param param
+     */
+    public List<Grain> listData(GrainParam param) {
+        if(StringUtils.isBlank(param.getCompanyId())){
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+        if(StringUtils.isBlank(param.getDeptId())){
+            param.setDeptId(ContextUtil.subDeptId(null));
+        }
+
+        QueryWrapper<Grain> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(param.getCompanyId())) {
+            queryWrapper.eq("company_id", param.getCompanyId());
+        }
+        if (StringUtils.isNotBlank(param.getDeptId())) {
+            queryWrapper.eq("dept_id", param.getDeptId());
+        }
+        if (StringUtils.isNotBlank(param.getDepotId())) {
+            queryWrapper.eq("depot_id", param.getDepotId());
+        }
+        if (StringUtils.isNotBlank(param.getBatchId())) {
+            queryWrapper.eq("batch_id", param.getBatchId());
+        }
+        if (null != param.getStart()) {
+            queryWrapper.ge("receive_date", DateUtil.getCurZero(param.getStart()));
+        }
+        if (null != param.getEnd()) {
+            queryWrapper.le("receive_date", DateUtil.getNextZero(param.getEnd()));
+        }
+        queryWrapper.orderByDesc("batch_id");
+        return grainMapper.selectList(queryWrapper);
+    }
+
+
+
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/LogOperationService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/LogOperationService.java
new file mode 100644
index 0000000..7a3addc
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/LogOperationService.java
@@ -0,0 +1,38 @@
+package com.fzzy.igds.service;
+
+import com.fzzy.igds.domain.LogOperation;
+import com.fzzy.igds.mapper.LogOperationMapper;
+import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.utils.StringUtils;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @Description 鏃ュ織
+ * @Author CZT
+ * @Date 2025/11/26 17:48
+ */
+@Service
+public class LogOperationService {
+
+    @Resource
+    private LogOperationMapper logOperationMapper;
+
+    /**
+     *
+     * @param data
+     * @return
+     */
+    public void addLog(LogOperation data) {
+        if (StringUtils.isBlank(data.getId())) {
+            data.setId(ContextUtil.generateId());
+        }
+        data.setCreateBy(ContextUtil.getLoginUserName());
+        data.setCreateTime(new Date());
+        data.setUpdateBy(ContextUtil.getLoginUserName());
+        data.setUpdateTime(new Date());
+        logOperationMapper.insert(data);
+    }
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
index c23c9e4..a25b518 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
@@ -170,4 +170,12 @@
     public static String getCompanyIdBySn(String sn) {
         return contextSnCompanyIdMap.get(sn);
     }
+
+    public static String getTimeId() {
+        return DateFormatUtils.format(new Date(), "yyyyMMddHHmmss");
+    }
+
+    public static String getTimeId(int start, int end) {
+        return DateFormatUtils.format(new Date(), "yyyyMMddHHmmss") + RandomUtils.nextInt(start, end);
+    }
 }
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainDataBuilder.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainDataBuilder.java
new file mode 100644
index 0000000..51003af
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainDataBuilder.java
@@ -0,0 +1,636 @@
+package com.fzzy.igds.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.constant.DepotType;
+import com.fzzy.igds.data.GrainData;
+import com.fzzy.igds.data.GrainLay;
+import com.fzzy.igds.data.GrainPoint;
+import com.fzzy.igds.data.GrainRow;
+import com.fzzy.igds.domain.DepotConf;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import java.util.*;
+
+/**
+ * @Description 绮儏鏁版嵁鍚勪釜绫诲瀷鐨勮浆鎹㈡帶鍒�
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+@Slf4j
+public class GrainDataBuilder {
+
+    /**
+     * 鏍规嵁鍗曚釜绮儏鐨勬暟鎹俊鎭紝鍖呮嫭閲囬泦鐐瑰拰灞備俊鎭�
+     *
+     * @param result
+     * @param depotConf
+     * @param depotType
+     */
+    public static void updateGrainData(GrainData result, DepotConf depotConf, String depotType) {
+
+        if (null == depotType || null == depotConf) {
+            return;
+        }
+
+        List<GrainPoint> listPoints = new ArrayList<>();
+        List<GrainLay> listLays = new ArrayList<>();
+        List<GrainRow> listRows = new ArrayList<>();
+
+        // 鏍规嵁浠撳簱绫诲瀷涓嶅悓杩涜涓嶅悓璋冩暣
+        if (DepotType.TYPE_02.getCode().equals(depotType)) {// 娴呭渾浠�
+            result = buildLLaysAndRows2(listPoints, listLays, listRows, result, depotConf);
+
+        } else if (DepotType.TYPE_03.getCode().equals(depotType)) {
+
+            result = buildLLaysAndRows3(listPoints, listLays, listRows, result, depotConf);
+
+        } else if (DepotType.TYPE_04.getCode().equals(depotType)) {
+            result = buildLLaysAndRows2(listPoints, listLays, listRows, result, depotConf);
+
+        } else {
+            result = buildLLaysAndRows1(listPoints, listLays, listRows, result, depotConf);
+        }
+
+        result.setListLays(listLays);
+        result.setListRows(listRows);
+        result.setListPoints(listPoints);
+
+        log.debug("---------{}", JSONObject.toJSONString(result));
+    }
+
+    /**
+     * 骞虫柟浠� 璺熸柊灞傛暟鎹拰琛屾暟鎹�
+     *
+     * @param listPoints
+     * @param listLays
+     * @param listRows
+     * @param result
+     * @param depotConf
+     * @return
+     */
+    public static GrainData buildLLaysAndRows1(List<GrainPoint> listPoints,
+                                               List<GrainLay> listLays, List<GrainRow> listRows,
+                                               GrainData result, DepotConf depotConf) {
+
+        String points = result.getPoints();
+        String cable = result.getCable();
+        // 鑾峰彇甯冪嚎瑙勫垯
+        if (StringUtils.isEmpty(cable)) {
+            return result;
+        }
+        if (StringUtils.isEmpty(points)) {
+            return result;
+        }
+
+        String[] attr = cable.split("-");
+        int cableZ = Integer.valueOf(attr[0]);
+        int cableY = Integer.valueOf(attr[1]);
+        int cableX = Integer.valueOf(attr[2]);
+
+        // 鏍规嵁灞傛洿鏂板眰鍒楄〃淇℃伅
+        updateListLays(listLays, cableX, cableY, cableZ);
+
+        // 鏇存柊琛屾暟鎹殑鍒楄〃
+        updateListRows(listRows, cableX, cableY, cableZ);
+
+        attr = points.split(",");
+
+        GrainPoint point;
+        Double tempT;
+        GrainLay lay;
+        GrainRow row;
+        List<Integer> listErrorTag = new ArrayList<>();// 鏁呴殰鎴栬�呴敊璇殑鐐�
+        Double sumAll = 0.0;
+
+        Double sumAllTemp = 0.0;
+
+        int sumAllNum = 0;
+        int tempT2;
+        int x = 0, y = 0, z = 0, fz = 0;
+        for (int i = 0; i < attr.length; i++) {
+            z = i % cableZ;
+            fz = z + 1;
+            x = i / (cableZ * cableY);
+            y = x * (cableZ * cableY);
+            y = (i - y) / cableZ;
+
+            // 鍊掕浆X杞�
+            x = cableX - 1 - x;
+
+            tempT = Double.valueOf(attr[i]);
+            point = new GrainPoint(tempT, x, y, z, fz);
+
+            // 缁熻姣忓眰鏁版嵁 --鍒濆鍖栨暟鎹�
+            lay = listLays.get(z);
+
+            // 寮�濮嬪皝瑁呰鏁版嵁淇℃伅
+            row = listRows.get(y);
+
+            if (tempT <= Constant.ERROR_TEMP) {
+                listErrorTag.add(i);
+
+                lay.setSumNum(lay.getSumNum() - 1);
+
+                row.setSumNum(row.getSumNum() - 1);
+
+                if (x == (cableX - 1) || y == (cableY - 1) || x == 0 || y == 0) {
+                    lay.setSumOutNum(lay.getSumOutNum() - 1);
+                } else {
+                    lay.setSumInNum(lay.getSumInNum() - 1);
+                }
+            } else {
+                sumAllTemp += tempT;
+                // 楂樻俯浼樺寲鐨勫惎鐢ㄨ姹�1-澶勭悊鍗曚釜楂樻俯鐐�
+                if (null != depotConf
+                        && null != depotConf.getTempMax()
+                        && Constant.YN_Y.equals(depotConf.getGrainAuto())) {
+
+                    if (tempT > depotConf.getTempMax()) {
+                        tempT2 = (int) (tempT - depotConf.getTempMax()) + 1;
+                        tempT = NumberUtil.keepPrecision(tempT - tempT2, 1);
+                        result.setRemark("绮俯妫�娴嬫甯�");
+                        log.debug("--鍘熷��={},--宸��={},--缁撴灉={}", point.getTemp(),
+                                tempT2, tempT);
+                    }
+                    if (result.getTempMax() > depotConf.getTempMax()) {
+                        tempT2 = (int) (result.getTempMax() - depotConf
+                                .getTempMax()) + 1;
+                        result.setTempMax(NumberUtil.keepPrecision(
+                                result.getTempMax() - tempT2, 1));
+                    }
+                    if (tempT > result.getTempMax()) {
+                        result.setTempMax(tempT);
+                    }
+                }
+
+                // 灞傝鍒楄ˉ鍏�
+                lay.setSumTemp(lay.getSumTemp() + tempT);
+                lay.setSumTemp(NumberUtil.keepPrecision(lay.getSumTemp(), 1));
+
+                row.setSumTemp(row.getSumTemp() + tempT);
+                row.setSumTemp(NumberUtil.keepPrecision(row.getSumTemp(), 1));
+
+                if (x == (cableX - 1) || y == (cableY - 1) || x == 0 || y == 0) {
+                    lay.setSumOutTemp(lay.getSumOutTemp() + tempT);
+                } else {
+                    lay.setSumInTemp(lay.getSumInTemp() + tempT);
+                }
+
+                // 灞傛渶楂樻渶浣�
+                if (tempT > lay.getTempMax()) {
+                    lay.setTempMax(tempT);
+                }
+                if (tempT < lay.getTempMin()) {
+                    lay.setTempMin(tempT);
+                }
+
+                // 琛屾渶楂樻渶浣�
+                if (tempT > row.getTempMax()) {
+                    row.setTempMax(tempT);
+                }
+                if (tempT < row.getTempMin()) {
+                    row.setTempMin(tempT);
+                }
+
+                // log.info("----娓╁害鐐�={}",tempT);
+                sumAll += tempT;
+                sumAllNum = sumAllNum + 1;
+                point.setTemp(tempT);
+            }
+            point.setTemp(NumberUtil.keepPrecision(point.getTemp(), 1));
+            listPoints.add(point);
+        }
+
+        // 璋冩暣灞備俊鎭�
+        for (GrainLay detail : listLays) {
+            if (0 != detail.getSumNum()) {
+                detail.setTempAve(detail.getSumTemp() / detail.getSumNum());
+                detail.setTempAve(NumberUtil.keepPrecision(detail.getTempAve(),
+                        1));
+            }
+
+            if (0 != detail.getSumInNum()) {
+                detail.setTempAveIn(detail.getSumInTemp()
+                        / detail.getSumInNum());
+                detail.setTempAveIn(NumberUtil.keepPrecision(
+                        detail.getTempAveIn(), 1));
+            }
+
+            if (0 != detail.getSumOutNum()) {
+                detail.setTempAveOut(detail.getSumOutTemp()
+                        / detail.getSumOutNum());
+                detail.setTempAveOut(NumberUtil.keepPrecision(
+                        detail.getTempAveOut(), 1));
+            }
+            //杩囨护鎺夋瘮杈冪殑鏈�澶ф渶灏忕殑鍊�50鍜�-50
+            if (detail.getTempMax() == -50) {
+                detail.setTempMax(0.0);
+            }
+            if (detail.getTempMin() == 50) {
+                detail.setTempMin(0.0);
+            }
+        }
+
+        // 璋冩暣琛屼俊鎭�
+        for (GrainRow detail : listRows) {
+            if (0 != detail.getSumNum()) {
+                detail.setTempAve(detail.getSumTemp() / detail.getSumNum());
+                detail.setTempAve(NumberUtil.keepPrecision(detail.getTempAve(),
+                        1));
+            }
+            //杩囨护鎺夋瘮杈冪殑鏈�澶ф渶灏忕殑鍊�50鍜�-50
+            if (detail.getTempMax() == -50) {
+                detail.setTempMax(0.0);
+            }
+            if (detail.getTempMin() == 50) {
+                detail.setTempMin(0.0);
+            }
+        }
+        Random random = new Random();
+        Double randomValue;
+        if (null != depotConf && Constant.YN_Y.equals(depotConf.getGrainAuto())) {
+            if (listErrorTag.size() > 0) {
+                for (Integer integer : listErrorTag) {
+                    point = listPoints.get(integer);
+                    // 鑾峰彇褰撳墠灞傜殑淇℃伅
+                    lay = listLays.get(point.getZ());
+                    randomValue = lay.getTempMin() + (lay.getTempMax() - lay.getTempMin()) * random.nextDouble();
+                    point.setTemp(NumberUtil.keepPrecision(randomValue, 1));
+                    attr[integer] = NumberUtil.keepPrecision(randomValue, 1) + "";
+                    listPoints.set(integer, point);
+                }
+            }
+
+        }
+
+        if (null != depotConf && Constant.YN_Y.equals(depotConf.getGrainAuto())) {
+            {
+                log.debug("---鍘熷钩鍧�={},鍚庢�绘俯={},--鍚庢�讳釜鏁�={},鍚庡钩鍧�={},鍘熸�绘俯={}",
+                        result.getTempAve(), sumAll, sumAllNum, sumAll / sumAllNum,
+                        sumAllTemp);
+                result.setTempAve(NumberUtil.keepPrecision((sumAll / sumAllNum), 1));
+            }
+        }
+
+        result.setPoints(StringUtils.join(attr, ","));
+        return result;
+    }
+
+    /**
+     * 鍦嗙瓛浠� 鏇存柊灞曠ず鏁堟灉鏁版嵁
+     *
+     * @param listPoints
+     * @param listLays
+     * @param listRows
+     * @param result
+     * @param depotConf
+     * @return
+     */
+    private static GrainData buildLLaysAndRows2(List<GrainPoint> listPoints,
+                                                List<GrainLay> listLays, List<GrainRow> listRows,
+                                                GrainData result, DepotConf depotConf) {
+
+        String points = result.getPoints();
+        String cableRule = result.getCable();
+        String cableCir = result.getCableCir();
+
+        if (StringUtils.isEmpty(points)) {
+            return result;
+        }
+
+        // 鑾峰彇甯冪嚎瑙勫垯
+        if (StringUtils.isEmpty(cableRule) || StringUtils.isEmpty(cableCir)) {
+            return result;
+        }
+        // 姣忎竴鍦堝垪鏁�
+        String[] cableRuleAtt = result.getCable().split("-");
+        // 姣忎竴鍦堝眰鏁�
+        String[] cableCirAtt = result.getCableCir().split("-");
+
+        if (cableRuleAtt.length != cableCirAtt.length) {
+            log.error("褰撳墠浠撳簱锛歿}锛屽竷绾胯鍒欎笉姝g‘锛屾棤娉曡В鏋愮伯鎯呬俊鎭�︹��", depotConf.getDepotId());
+            return result;
+        }
+
+        // 鑾峰彇鏈�澶х殑灞傞厤缃�--榛樿姣忎竴鍦堥兘涓�鏍�
+        int layMax = Integer.valueOf(cableCirAtt[0]);
+        for (int i = 0; i < cableCirAtt.length; i++) {
+            if (Integer.valueOf(cableCirAtt[i]) >= layMax) layMax = Integer.valueOf(cableCirAtt[i]);
+        }
+        if (null == depotConf.getCableCone() || depotConf.getCableCone().isEmpty()) {
+            depotConf.setCableCone(Constant.CABLE_CONE_0);
+        }
+
+        // 鏍规嵁灞傛洿鏂板眰鍒楄〃淇℃伅
+        updateListLaysCir(listLays, cableRuleAtt, cableCirAtt, layMax, depotConf.getCableCone());
+
+        String[] attr = points.split(",");
+
+        GrainPoint point;
+        Double tempT;
+        GrainLay lay;
+        int x = 0, y = 0, z = 1, fz = 0;// x=鎵�鍦ㄥ湀锛屼粠0寮�濮嬶紱y浠h〃鐢电紗鏍瑰彿浠�0寮�濮嬶紝z=浠h〃鎵�鍦ㄥ眰浠�1寮�濮�
+        List<Integer> listErrorTag = new ArrayList<>();// 鏁呴殰鎴栬�呴敊璇殑鐐�
+        List<Integer> listHighTag = new ArrayList<>();// 楂樻俯鐐�
+
+        int layNum = layMax;// 褰撳墠鍦堢殑灞傛暟
+        int rowNum = 1;// 褰撳墠鍦堢殑鏍规暟
+        int index = 0;// 褰撳墠娓╁害鐐圭殑浣嶇疆
+        int startRow = 0;//褰撳墠绮儏鐢电紗鏍瑰彿
+        for (int i = 0; i < cableRuleAtt.length; i++) {
+            x = i;
+            rowNum = Integer.valueOf(cableRuleAtt[i]);// 鏍规暟
+            for (int k = 0; k < rowNum; k++) {
+                y = k;
+                for (int j = 0; j < layNum; j++) {
+                    z = j;
+                    fz = j + 1;
+                    tempT = Double.valueOf(attr[index]);
+                    index++;
+
+                    point = new GrainPoint(tempT, x, startRow, z, fz);
+
+                    // 缁熻姣忓眰鏁版嵁 --鍒濆鍖栨暟鎹�
+                    lay = listLays.get(z);
+                    point.setTemp(tempT);
+                    listPoints.add(point);
+
+                    if (tempT <= Constant.ERROR_TEMP) {
+                        if (tempT != Constant.ADD_TEMP) {
+                            lay.setSumNum(lay.getSumNum() - 1);
+                        }
+                    } else {
+
+                        //鍒ゆ柇鏄惁楂樻俯浼樺寲
+                        if (null != depotConf
+                                && null != depotConf.getTempMax()
+                                && Constant.YN_Y.equals(depotConf.getGrainAuto())) {
+                            if (tempT > depotConf.getTempMax()) {
+                                //璁板綍楂樻俯鐐圭殑浣嶇疆
+                                listHighTag.add(listPoints.size() - 1);
+                            } else {
+                                lay.setSumTemp(lay.getSumTemp() + tempT);
+                                // 灞傛渶楂樻渶浣�
+                                if (tempT > lay.getTempMax()) {
+                                    lay.setTempMax(tempT);
+                                }
+                                if (tempT < lay.getTempMin()) {
+                                    lay.setTempMin(tempT);
+                                }
+                            }
+                        } else {
+                            lay.setSumTemp(lay.getSumTemp() + tempT);
+                            // 灞傛渶楂樻渶浣�
+                            if (tempT > lay.getTempMax()) {
+                                lay.setTempMax(tempT);
+                            }
+                            if (tempT < lay.getTempMin()) {
+                                lay.setTempMin(tempT);
+                            }
+                        }
+                    }
+                    if (tempT == Constant.ERROR_TEMP || tempT == Constant.FAULT_TEMP) {
+                        listErrorTag.add(listPoints.size() - 1);
+                    }
+                }
+
+                startRow++;
+            }
+
+        }
+
+        Double maxTemp = -50.0; //姣旇緝鏈�楂樻俯
+        // 璋冩暣灞備俊鎭�
+        for (GrainLay detail : listLays) {
+            if (0 != detail.getSumNum()) {
+                detail.setTempAve(detail.getSumTemp() / detail.getSumNum());
+                detail.setTempAve(NumberUtil.keepPrecision(detail.getTempAve(),
+                        1));
+            }
+
+            if (0 != detail.getSumInNum()) {
+                detail.setTempAveIn(detail.getSumInTemp()
+                        / detail.getSumInNum());
+                detail.setTempAveIn(NumberUtil.keepPrecision(
+                        detail.getTempAveIn(), 1));
+            }
+
+            if (0 != detail.getSumOutNum()) {
+                detail.setTempAveOut(detail.getSumOutTemp()
+                        / detail.getSumOutNum());
+                detail.setTempAveOut(NumberUtil.keepPrecision(
+                        detail.getTempAveOut(), 1));
+            }
+            //杩囨护鎺夋瘮杈冪殑鏈�澶ф渶灏忕殑鍊�50鍜�-50
+            if (detail.getTempMax() == -50) {
+                detail.setTempMax(0.0);
+            }
+            if (detail.getTempMin() == 50) {
+                detail.setTempMin(0.0);
+            }
+            if (listHighTag.size() > 0) {
+                if (detail.getTempMax() > maxTemp) {
+                    maxTemp = detail.getTempMax();
+                }
+            }
+        }
+        Random random = new Random();
+        Double randomValue;
+        //楂樻俯鐐规浛鎹负灞傚钩鍧囧��
+        if (null != depotConf && Constant.YN_Y.equals(depotConf.getGrainAuto())) {
+            if (listHighTag.size() > 0) {
+                for (Integer integer : listHighTag) {
+                    point = listPoints.get(integer);
+                    // 鑾峰彇褰撳墠灞傜殑淇℃伅
+                    lay = listLays.get(point.getZ());
+                    randomValue = lay.getTempMin() + (lay.getTempMax() - lay.getTempMin()) * random.nextDouble();
+                    point.setTemp(NumberUtil.keepPrecision(randomValue, 1));
+                    attr[integer] = NumberUtil.keepPrecision(randomValue, 1) + "";
+                    listPoints.set(integer, point);
+                }
+                //璁剧疆鏈�楂樻俯
+                result.setTempMax(maxTemp);
+            }
+        }
+        // 鏈�鍚庢牴鎹叏灞�鍙傛暟鍒ゆ柇鏄惁闇�瑕佽皟鏁村紓甯哥偣鏁版嵁杩涜璋冩暣
+        if (null != depotConf && Constant.YN_Y.equals(depotConf.getGrainAuto())) {
+            if (listErrorTag.size() > 0) {
+                for (Integer integer : listErrorTag) {
+                    point = listPoints.get(integer);
+                    // 鑾峰彇褰撳墠灞傜殑淇℃伅
+                    lay = listLays.get(point.getZ());
+                    point.setTemp(lay.getTempAve());
+
+                    listPoints.set(integer, point);
+                }
+            }
+        }
+
+        result.setListPoints(listPoints);
+        result.setListLays(listLays);
+        result.setPoints(StringUtils.join(attr, ","));
+        return result;
+    }
+
+
+    /**
+     * 娌圭瓛浠撹В鏋愶紝鏇存柊灞曠ず鏁堟灉鏁版嵁锛岃В鏋愭柟寮忓悓鏅�氱瓛浠撲俊鎭�
+     *
+     * @param listPoints
+     * @param listLays
+     * @param listRows
+     * @param result
+     * @param depotConf
+     * @return
+     */
+    private static GrainData buildLLaysAndRows3(List<GrainPoint> listPoints,
+                                                List<GrainLay> listLays, List<GrainRow> listRows,
+                                                GrainData result, DepotConf depotConf) {
+        if (StringUtils.isEmpty(result.getOilHeight())) {
+            result.setOilHeight("0.0-0.0");
+            log.warn("娌规《浠�={} 瑙f瀽杩囩▼涓病鏈夎幏鍙栧埌娌归潰楂樺害淇℃伅锛岄粯璁ゆ樉绀轰负0", depotConf.getDepotId());
+        } else {
+            if (result.getOilHeight().indexOf("-") == -1) {
+                result.setOilHeight(result.getOilHeight() + "-"
+                        + result.getOilHeight());
+                log.warn("娌规《浠�={} 瑙f瀽涓病鏈夎幏鍙栧缓绛戠墿鐨勯珮搴︿俊鎭紝榛樿寤虹瓚鐗╅珮搴︾瓑浜庢恫浣嶉珮搴�",
+                        depotConf.getDepotId());
+            }
+        }
+
+        return buildLLaysAndRows2(listPoints, listLays, listRows, result, depotConf);
+    }
+
+    /**
+     * @param listLays
+     * @param cableX
+     * @param cableY
+     * @param cableZ
+     */
+    private static void updateListLays(List<GrainLay> listLays, int cableX,
+                                       int cableY, int cableZ) {// 灞備粠1寮�濮�
+        GrainLay lay;
+        for (int i = 1; i <= cableZ; i++) {
+            lay = new GrainLay(i, i - 1);
+            lay.setSumNum(cableY * cableX);
+            lay.setSumInNum((cableY - 2) * (cableX - 2));
+            lay.setSumOutNum(2 * cableY + 2 * cableX - 4);
+            lay.setTempMin(50.0);
+            lay.setTempMax(-50.0);
+            listLays.add(lay);
+        }
+    }
+
+    /**
+     * @param listRows
+     * @param cableX
+     * @param cableY
+     * @param cableZ
+     */
+    private static void updateListRows(List<GrainRow> listRows, int cableX,
+                                       int cableY, int cableZ) {// 浠�0寮�濮�
+        GrainRow row;
+        for (int i = 0; i < cableY; i++) {
+            row = new GrainRow(i);
+            row.setSumNum(cableZ * cableX);
+            row.setTempMin(50.0);
+            row.setTempMax(-50.0);
+            listRows.add(row);
+        }
+    }
+
+    /**
+     * 鍦嗙瓛浠�--浠撴俯搴﹁В鏋�
+     *
+     * @param listLays
+     * @param cableRuleAtt
+     * @param cableCirAtt
+     * @param layMax
+     * @param cableCone
+     */
+    private static void updateListLaysCir(List<GrainLay> listLays,
+                                          String[] cableRuleAtt, String[] cableCirAtt, int layMax, String cableCone) {
+        GrainLay lay;
+
+        Map<String, GrainLay> layMap = new HashMap<>();
+        for (int j = 0; j < cableRuleAtt.length; j++) {
+
+            for (int i = 1; i <= layMax; i++) {
+                if (layMap.containsKey(i + "")) {
+                    lay = layMap.get(i + "");
+                } else {
+                    lay = new GrainLay(i, i);
+                }
+                int sumNum = lay.getSumNum();
+
+                if (cableCone.equals(Constant.CABLE_CONE_2)) {
+                    if (Integer.parseInt(cableCirAtt[j]) >= i) {
+                        sumNum += Integer.parseInt(cableRuleAtt[j]);
+                    }
+                } else {
+                    if (layMax - Integer.parseInt(cableCirAtt[j]) < i) {
+                        sumNum += Integer.parseInt(cableRuleAtt[j]);
+                    }
+                }
+                lay.setSumNum(sumNum);
+                lay.setSumInNum(1);
+                lay.setSumOutNum(1);
+                lay.setTempMin(50.0);
+                lay.setTempMax(-50.0);
+                layMap.put(i + "", lay);
+            }
+        }
+        for (int i = 1; i <= layMax; i++) {
+            listLays.add(layMap.get(i + ""));
+        }
+    }
+
+    /**
+     * 鍦嗙瓛浠�--浠撴俯搴﹁В鏋�
+     *
+     * @param listLays
+     * @param cableRuleAtt
+     * @param cableCirAtt
+     * @param layMax
+     */
+    private static void updateListLaysCir(List<GrainLay> listLays,
+                                          String[] cableRuleAtt, String[] cableCirAtt, int layMax) {
+        GrainLay lay;
+        for (int i = 1; i <= layMax; i++) {
+            lay = new GrainLay(i, i);
+            int sumNum = 0;
+
+            for (int j = 0; j < cableRuleAtt.length; j++) {
+                if (Integer.valueOf(cableCirAtt[j]) >= i) {
+                    sumNum += Integer.valueOf(cableRuleAtt[j]);
+                }
+            }
+
+            lay.setSumNum(sumNum);
+            lay.setSumInNum(1);
+            lay.setSumOutNum(1);
+            lay.setTempMin(50.0);
+            lay.setTempMax(-50.0);
+            listLays.add(lay);
+        }
+    }
+
+    /**
+     * 鏍规嵁绮儏娓╁害锛屽垽鏂槸鍚﹁鍛婂�硷紝鐒跺悗杞崲涓洪〉闈㈤渶瑕佹覆鏌撶殑鍊硷紝涓昏澶囩敤鍜屾晠闅滅殑鍊肩殑璋冩暣
+     *
+     * @param temp
+     * @return
+     */
+    public static String renderTempValue(Double temp) {
+
+
+        if (temp > 45) return "鏁呴殰";
+
+        if (temp == Constant.ERROR_TEMP) return "澶囩敤";
+        if (temp == Constant.FAULT_TEMP) return "鏁呴殰";
+        if (temp == Constant.ADD_TEMP) return "--";
+
+        return temp + "";
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder.java
new file mode 100644
index 0000000..f96b3d0
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder.java
@@ -0,0 +1,43 @@
+package com.fzzy.igds.utils;
+
+import com.fzzy.igds.constant.DepotType;
+import com.fzzy.igds.data.GrainParam;
+import com.fzzy.igds.data.PrintModeData;
+
+/**
+ * @Description 绮儏鎵撳嵃妯℃澘鍚庡彴璁捐锛屽綋鍓嶄负妯℃澘璁捐鍏ュ彛
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+public class GrainPrintBuilder {
+
+    /**
+     * 鑾峰彇鎵撳嵃妯℃澘
+     *
+     * @param param
+     * @return
+     */
+    public static PrintModeData buildPrintModel(GrainParam param) {
+        String depotType = param.getDepotType();
+        //骞虫柟浠�
+        if (DepotType.TYPE_01.getCode().equals(depotType)) {
+            return GrainPrintBuilder01.buildModel(param);
+        }
+        //绛掍粨
+        if (DepotType.TYPE_02.getCode().equals(depotType)) {
+           return GrainPrintBuilder04.buildModel(param);
+        }
+
+        //娌圭綈浠�
+        if (DepotType.TYPE_03.getCode().equals(depotType)) {
+            return GrainPrintBuilder03.buildModel(param);
+        }
+
+        //绔嬪悓浠�
+        if (DepotType.TYPE_04.getCode().equals(depotType)) {
+            return GrainPrintBuilder04.buildModel(param);
+        }
+        //骞虫柟浠�
+        return GrainPrintBuilder01.buildModel(param);
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder01.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder01.java
new file mode 100644
index 0000000..1933f71
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder01.java
@@ -0,0 +1,169 @@
+package com.fzzy.igds.utils;
+
+import com.fzzy.igds.data.GrainParam;
+import com.fzzy.igds.data.PrintModeData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @Description 骞虫柟浠撴墦鍗版ā鏉�-閫氱敤
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Slf4j
+public class GrainPrintBuilder01 {
+
+    /**
+     * 骞充粨浠撴墦鍗版ā鏉�
+     **/
+    public static PrintModeData buildModel(GrainParam param) {
+        PrintModeData result = new PrintModeData();
+        result.setCompanyId(param.getCompanyId());
+        result.setDepotType(param.getDepotType());
+
+        if (StringUtils.isEmpty(param.getCableRule())) {
+            result.setMsg("褰撳墠绮儏娌℃湁鑾峰彇鍒扮伯鎯呭竷绾胯鍒欓厤缃紝鏃犳硶鐢熸垚鎶ヨ〃锛�");
+            return result;
+        }
+
+        String[] attr = param.getCableRule().split("-");
+        int cableZ = Integer.valueOf(attr[0]);
+        int cableY = Integer.valueOf(attr[1]);
+        int cableX = Integer.valueOf(attr[2]);
+
+        StringBuilder sb = new StringBuilder();
+        //妯℃澘澶�
+        sb.append("<!DOCTYPE html><html lang=\"zh-cn\"><head><meta http-equiv=\"Content-Type\"content=\"text/html; charset=UTF-8\"><title>骞虫柟浠撴姤琛�</title></head><body>");
+
+        sb.append("<div id=\"print_main\" style=\"margin: 20px;\">");
+
+        //鏍峰紡琛紝涓嶈兘缂╄繘
+        sb.append("<style>");
+        sb.append("table,table tr th,table tr td {border:1px solid #0d1021}");
+        sb.append("table {width:100%;line-height:23px;text-align:center;font-size:14px}");
+        sb.append(".table-2 {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 tr {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 td {border-top:0px solid #0d1021 !important}");
+        sb.append(".row-tr {border-left:0px !important;border-right:0px!important;border-top:0px !important}");
+        sb.append(".row-tr1 {border-left:0px !important;border-right:0px !important;border-top:0px !important;font-size:12px}");
+        sb.append(".row-fz {border:0px !important}");
+        sb.append(".row-fz1 {border:0px !important;font-size:12px}");
+        sb.append(".row-li1 {font-size:12px}");
+        sb.append(".link-top {width:100%;border-top:solid #0d1021 1px}");
+        sb.append("</style>");
+
+        sb.append("<div style=\"text-align: center\"><span style=\"font-size: 26px; font-weight: bold;\">companyName绮儏鎶ヨ〃</span>");
+        sb.append("<div class=\"link-top\"></div><div class=\"link-top\"></div>");
+        sb.append("<span style=\"font-size: 16px;\">depotName&nbsp;&nbsp;&nbsp;&nbsp;绮儏鎶ヨ〃</span></div>");
+
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">澶╂皵锛歸eather &nbsp;&nbsp;鏂瑰悜锛�</span><span style=\"float: right;\">妫�娴嬫椂闂达細checkDate</span></div>");
+
+        //<!--鍔ㄦ�佸潗鏍�-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\">");
+        sb.append("<tr>");
+
+        if (cableX > 18) {
+            sb.append("<td colspan=\"2\" class='row-li1'></td>");
+        } else {
+            sb.append("<td colspan=\"2\"></td>");
+        }
+
+        for (int i = 1; i <= cableX; i++) {
+            if (cableX > 18) {
+                sb.append("<td class='row-li1'>");
+            } else {
+                sb.append("<td>");
+            }
+
+            sb.append("绗�" + i + "鍒�");
+            sb.append("</td>");
+        }
+        sb.append("</tr>");
+
+        // <!-- 鍔ㄦ�佸湀-->
+        for (int y = 1; y <= cableY; y++) {
+            String className = "row-fz";
+            if (cableX > 18) className = "row-fz1";
+            for (int z = 1; z <= cableZ; z++) {
+                sb.append("<tr>");
+                if (z == cableZ) {
+                    className = "row-tr";
+                    if (cableX > 18) className = "row-tr1";
+                }
+                //琛�
+                if (z == 1) {
+                    sb.append("<td rowspan='");
+                    sb.append(cableZ);
+                    sb.append("' class='");
+                    if (cableX > 18) {
+                        sb.append("row-tr1");
+                    } else {
+                        sb.append("row-tr");
+                    }
+                    sb.append("'>");
+                    sb.append(y);
+                    sb.append("琛�</td>");
+                }
+                //灞�
+                sb.append("<td class='");
+                sb.append(className);
+                sb.append("'>" + z + "灞�</td>");
+
+                //娣诲姞鏁版嵁
+                for (int x = cableX; x >= 1; x--) {
+                    sb.append("<td class='");
+                    sb.append(className);
+                    sb.append("'>");
+                    sb.append(z + "_" + y + "_" + x);
+                    sb.append("</td>");
+                }
+            }
+
+            sb.append("<tr>");
+        }
+        sb.append("</table>");
+
+        // <!--鍔ㄦ�佸眰琛ㄦ牸-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\" class=\"table-2\"><tr><td width=\"200px\">绮儏鍒嗘瀽锛�</td><td colspan=\"5\">");
+        sb.append("remark</td></tr><tr><td></td><td width=\"16.6%\">鏈�楂�</td><td width=\"16.6%\">鏈�浣�</td><td width=\"16.6%\">骞冲潎</td><td width=\"16.6%\">鍛ㄥ潎</td><td width=\"16.6%\">鍐呭潎</td></tr>");
+        //灞備俊鎭�
+        for (int k = 1; k <= cableZ; k++) {
+            sb.append("<tr>\n<td>绗�");
+            sb.append(k);
+            sb.append("灞�</td>");
+            sb.append("<td>c_max_" + k + "</td>");
+            sb.append("<td>c_min_" + k + "</td>");
+            sb.append("<td>c_ave_" + k + "</td>");
+            sb.append("<td>c_out_ave_" + k + "</td>");
+            sb.append("<td>c_in_ave_" + k + "</td>");
+            sb.append("</tr>");
+        }
+
+        //鏁翠粨
+        sb.append("<tr><td>鏁�&nbsp;&nbsp;浠�</td>");
+        sb.append("<td>c_max_all</td>");
+        sb.append("<td>c_min_all</td>");
+        sb.append("<td>c_ave_all</td>");
+        sb.append("<td>c_out_ave_all</td>");
+        sb.append("<td>c_in_ave_all</td>");
+
+        //<!-- 鍥哄畾鏁版嵁-->
+        sb.append("<tr><td >浠撴俯锛歝_tIn</td><td >浠撴箍锛歝_hIn</td><td colspan=\"2\">姘旀俯锛歝_tOut</td><td colspan=\"2\">姘旀箍锛歝_hOut</td></tr>");
+        sb.append("<tr><td>浠撴埧绫诲瀷</td><td >c_depotType</td><td colspan=\"2\">鍏ヤ粨鏃ユ湡</td><td colspan=\"2\">c_storeDate</td></tr>");
+        sb.append("<tr><td>鏉傝川锛�%锛�</td><td>c_perImpurity</td><td colspan=\"2\">绮浜у湴</td><td colspan=\"2\">c_foodLocation</td></tr>");
+        sb.append("<tr><td>妫�娴嬩汉</td><td>c_checkUser</td><td colspan=\"2\">淇濈鍛�</td><td colspan=\"2\">c_storeKeeperName</td></tr>");
+        sb.append("</table>");
+
+        // <!--灏鹃儴淇℃伅 -->
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">娉細#琛ㄧず灞傛渶浣庢俯&nbsp;&nbsp;*琛ㄧず灞傛渶楂樻俯</span><span style=\"float: right;\">鍒惰〃鏃堕棿锛歝reateBillDate</span></div>");
+        sb.append("</div></body></html>");
+
+        log.debug("鑾峰彇鍒扮殑绮儏妯℃澘={}", sb.toString());
+
+
+        result.setModel(sb.toString());
+        return result;
+    }
+
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder03.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder03.java
new file mode 100644
index 0000000..25e439e
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder03.java
@@ -0,0 +1,168 @@
+package com.fzzy.igds.utils;
+
+import com.fzzy.igds.data.GrainParam;
+import com.fzzy.igds.data.PrintModeData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @Description 娌规《浠撴墦鍗版ā鏉� -閫氱敤
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Slf4j
+public class GrainPrintBuilder03 {
+
+    /**
+     * 娌圭綈浠�
+     **/
+    public static PrintModeData buildModel(GrainParam param) {
+        PrintModeData result = new PrintModeData();
+        result.setCompanyId(param.getCompanyId());
+        result.setDepotType(param.getDepotType());
+
+        if (StringUtils.isEmpty(param.getCableRule()) || StringUtils.isEmpty(param.getCableCir())) {
+            result.setMsg("褰撳墠绮儏娌℃湁鑾峰彇鍒扮伯鎯呭竷绾胯鍒欓厤缃紝鏃犳硶鐢熸垚鎶ヨ〃锛�");
+            return result;
+        }
+
+        //鑾峰彇灞傜殑鏈�楂樺��
+        int layMax = 1;
+        String[] arrLay = param.getCableCir().split("-");
+        for (String lay : arrLay) {
+            if (Integer.valueOf(lay) > layMax) layMax = Integer.valueOf(lay);
+        }
+
+        String[] arrRule = param.getCableRule().split("-");
+        int cirNum = arrRule.length;
+
+
+        StringBuilder sb = new StringBuilder();
+        //妯℃澘澶�
+        sb.append("<!DOCTYPE html><html lang=\"zh-cn\"><head><meta http-equiv=\"Content-Type\"content=\"text/html; charset=UTF-8\"><title>绛掍粨鎶ヨ〃</title></head><body>");
+
+        sb.append("<div id=\"print_main\" style=\"margin: 20px;\">");
+
+        //鏍峰紡琛紝涓嶈兘缂╄繘
+        sb.append("<style>");
+        sb.append("table,table tr th,table tr td {border:1px solid #0d1021}");
+        sb.append("table {width:100%;line-height:23px;text-align:center;font-size:14px}");
+        sb.append(".table-2 {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 tr {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 td {border-top:0px solid #0d1021 !important}");
+        sb.append(".row-tr {border-left:0px !important;border-right:0px!important;border-top:0px !important}");
+        sb.append(".row-tr1 {border-left:0px !important;border-right:0px !important;border-top:0px !important;font-size:12px}");
+        sb.append(".row-fz {border:0px !important}");
+        sb.append(".row-fz1 {border:0px !important;font-size:12px}");
+        sb.append(".row-li1 {font-size:12px}");
+        sb.append(".link-top {width:100%;border-top:solid #0d1021 1px}");
+        sb.append("</style>");
+
+        sb.append("<div style=\"text-align: center\"><span style=\"font-size: 26px; font-weight: bold;\">companyName绮儏鎶ヨ〃</span>");
+        sb.append("<div class=\"link-top\"></div><div class=\"link-top\"></div>");
+        sb.append("<span style=\"font-size: 16px;\">depotName&nbsp;&nbsp;&nbsp;&nbsp;绮儏鎶ヨ〃</span></div>");
+
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">澶╂皵锛歸eather &nbsp;&nbsp;鏂瑰悜锛�</span><span style=\"float: right;\">妫�娴嬫椂闂达細checkDate</span></div>");
+
+        //<!--鍔ㄦ�佸潗鏍�-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\">");
+        sb.append("<tr>");
+        sb.append("<td colspan=\"2\"></td>");
+        for (int i = 1; i <= layMax; i++) {
+            sb.append("<td>");
+            sb.append("绗�" + i + "灞�");
+            sb.append("</td>");
+        }
+        sb.append("</tr>");
+
+        // <!-- 鍔ㄦ�佸湀-->
+        for (int i = 1; i <= cirNum; i++) {
+            //姣忓湀鐨勬牴鏁�
+            int rootNum = Integer.valueOf(arrRule[i - 1]);
+            //姣忓湀灞傛暟
+            int curLayNum = Integer.valueOf(arrLay[i - 1]);
+
+            String className = "row-fz";
+            for (int j = 1; j <= rootNum; j++) {
+                if (j == rootNum) {
+                    className = "row-tr";
+                }
+                sb.append("<tr>");
+                if (j == 1) {
+                    sb.append("<td rowspan=\"");
+                    sb.append(rootNum);
+                    sb.append("\" class=\"");
+                    sb.append("row-tr");//鍥哄畾
+                    sb.append("\">");
+                    sb.append(i);
+                    sb.append("鍦�</td>");
+                }
+                //娣诲姞鏍规暟
+                sb.append("<td class=\"");
+                sb.append(className);
+                sb.append("\">");
+                sb.append(j);
+                sb.append("鏍�</td>");
+
+                //娣诲姞姣忔牴鐨勫�硷紝濡傛灉褰撳墠鏍规病鏈夐偅涔堝灞傦紝鍒欎笉娣诲姞鍊间繚鐣欑┖
+                for (int k = 1; k <= layMax; k++) {
+                    if (curLayNum < layMax) {
+                        sb.append("<td class=\"");
+                        sb.append(className);
+                        sb.append("\"></td>");
+                    } else {
+                        sb.append("<td class=\"");
+                        sb.append(className);
+                        sb.append("\">");
+                        sb.append(i + "_" + j + "_" + k);
+                        sb.append("</td>");
+                    }
+                }
+                sb.append("</tr>");
+            }
+
+        }
+        sb.append("</table>");
+
+        // <!--鍔ㄦ�佸眰琛ㄦ牸-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\" class=\"table-2\"><tr><td width=\"200px\">绮儏鍒嗘瀽锛�</td><td colspan=\"5\">");
+        sb.append("remark</td></tr><tr><td></td><td width=\"16.6%\">鏈�楂�</td><td width=\"16.6%\">鏈�浣�</td><td width=\"16.6%\">骞冲潎</td><td width=\"16.6%\">鍛ㄥ潎</td><td width=\"16.6%\">鍐呭潎</td></tr>");
+        //灞備俊鎭�
+        for (int k = 1; k <= layMax; k++) {
+            sb.append("<tr>\n<td>绗�");
+            sb.append(k);
+            sb.append("灞�</td>");
+            sb.append("<td>c_max_" + k + "</td>");
+            sb.append("<td>c_min_" + k + "</td>");
+            sb.append("<td>c_ave_" + k + "</td>");
+            sb.append("<td>c_out_ave_" + k + "</td>");
+            sb.append("<td>c_in_ave_" + k + "</td>");
+            sb.append("</tr>");
+        }
+
+        //鏁翠粨
+        sb.append("<tr><td>鏁�&nbsp;&nbsp;浠�</td>");
+        sb.append("<td>c_max_all</td>");
+        sb.append("<td>c_min_all</td>");
+        sb.append("<td>c_ave_all</td>");
+        sb.append("<td>c_out_ave_all</td>");
+        sb.append("<td>c_in_ave_all</td>");
+
+        //<!-- 鍥哄畾鏁版嵁-->
+        sb.append("<tr><td >浠撴俯锛歝_tIn</td><td >浠撴箍锛歝_hIn</td><td colspan=\"2\">姘旀俯锛歝_tOut</td><td colspan=\"2\">姘旀箍锛歝_hOut</td></tr>");
+        sb.append("<tr><td>娌圭綈楂樺害</td><td >c_depotHeight 绫�</td><td colspan=\"2\">娑蹭綅楂樺害</td><td colspan=\"2\">c_oilHeight 绫�</td></tr>");
+        sb.append("<tr><td>浠撴埧绫诲瀷</td><td >c_depotType</td><td colspan=\"2\">鍏ヤ粨鏃ユ湡</td><td colspan=\"2\">c_storeDate</td></tr>");
+        sb.append("<tr><td>鏉傝川锛�%锛�</td><td>c_perImpurity</td><td colspan=\"2\">绮浜у湴</td><td colspan=\"2\">c_foodLocation</td></tr>");
+        sb.append("<tr><td>妫�娴嬩汉</td><td>c_checkUser</td><td colspan=\"2\">淇濈鍛�</td><td colspan=\"2\">c_storeKeeperName</td></tr>");
+        sb.append("</table>");
+
+        // <!--灏鹃儴淇℃伅 -->
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">娉細#琛ㄧず灞傛渶浣庢俯&nbsp;&nbsp;*琛ㄧず灞傛渶楂樻俯</span><span style=\"float: right;\">鍒惰〃鏃堕棿锛歝reateBillDate</span></div>");
+        sb.append("</div></body></html>");
+
+        log.debug("鑾峰彇鍒扮殑绮儏妯℃澘={}", sb.toString());
+
+        result.setModel(sb.toString());
+        return result;
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder04.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder04.java
new file mode 100644
index 0000000..9e507b5
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder04.java
@@ -0,0 +1,175 @@
+package com.fzzy.igds.utils;
+
+import com.fzzy.igds.data.GrainParam;
+import com.fzzy.igds.data.PrintModeData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @Description 绛掍粨鎵撳嵃妯℃澘-鍖呮嫭鍦嗙瓛浠撳拰娴呭渾浠� -閫氱敤
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Slf4j
+public class GrainPrintBuilder04 {
+
+    public static PrintModeData buildModel(GrainParam param) {
+        PrintModeData result = new PrintModeData();
+        result.setCompanyId(param.getCompanyId());
+        result.setDepotType(param.getDepotType());
+
+        if (StringUtils.isEmpty(param.getCableRule()) || StringUtils.isEmpty(param.getCableCir())) {
+            result.setMsg("褰撳墠绮儏娌℃湁鑾峰彇鍒扮伯鎯呭竷绾胯鍒欓厤缃紝鏃犳硶鐢熸垚鎶ヨ〃锛�");
+            return result;
+        }
+
+        //鑾峰彇灞傜殑鏈�楂樺��
+        int layMax = 1;
+        String[] arrLay = param.getCableCir().split("-");
+        for (String lay : arrLay) {
+            if (Integer.valueOf(lay) > layMax) layMax = Integer.valueOf(lay);
+        }
+
+        String[] arrRule = param.getCableRule().split("-");
+        int cirNum = arrRule.length;
+
+
+        StringBuilder sb = new StringBuilder();
+        //妯℃澘澶�
+        sb.append("<!DOCTYPE html><html lang=\"zh-cn\"><head><meta http-equiv=\"Content-Type\"content=\"text/html; charset=UTF-8\"><title>绛掍粨鎶ヨ〃</title></head><body>");
+
+        sb.append("<div id=\"print_main\" style=\"margin: 20px;\">");
+
+        //鏍峰紡琛紝涓嶈兘缂╄繘
+        sb.append("<style>");
+        sb.append("table,table tr th,table tr td {border:1px solid #0d1021}");
+        sb.append("table {width:100%;line-height:23px;text-align:center;font-size:14px}");
+        sb.append(".table-2 {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 tr {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 td {border-top:0px solid #0d1021 !important}");
+        sb.append(".row-tr {border-left:0px !important;border-right:0px!important;border-top:0px !important}");
+        sb.append(".row-tr1 {border-left:0px !important;border-right:0px !important;border-top:0px !important;font-size:12px}");
+        sb.append(".row-fz {border:0px !important}");
+        sb.append(".row-fz1 {border:0px !important;font-size:12px}");
+        sb.append(".row-li1 {font-size:12px}");
+        sb.append(".link-top {width:100%;border-top:solid #0d1021 1px}");
+        sb.append("</style>");
+
+        sb.append("<div style=\"text-align: center\"><span style=\"font-size: 26px; font-weight: bold;\">companyName绮儏鎶ヨ〃</span>");
+        sb.append("<div class=\"link-top\"></div><div class=\"link-top\"></div>");
+        sb.append("<span style=\"font-size: 16px;\">depotName&nbsp;&nbsp;&nbsp;&nbsp;绮儏鎶ヨ〃</span></div>");
+
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">澶╂皵锛歸eather &nbsp;&nbsp;鏂瑰悜锛�</span><span style=\"float: right;\">妫�娴嬫椂闂达細checkDate</span></div>");
+
+        //<!--鍔ㄦ�佸潗鏍�-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\">");
+        //-----灞傛暟-----
+        sb.append("<tr>");
+        sb.append("<td colspan=\"2\"></td>");
+        for (int i = 1; i <= layMax; i++) {
+            sb.append("<td>");
+            sb.append(i + "灞�");
+            sb.append("</td>");
+        }
+        sb.append("</tr>");
+        //-----姣忓湀鍚勬牴鍏蜂綋鏁版嵁-----
+        int startGen = 0;
+        int endGen = 0;
+        int curGen = 0;
+        for (int i = 1; i <= cirNum; i++) {
+            //姣忓湀鐨勬牴鏁�
+            if(i==1){
+                startGen = 1;
+            }else {
+                startGen = endGen + 1;
+            }
+            curGen = Integer.valueOf(arrRule[i - 1]);
+            endGen += curGen;
+
+            //姣忓湀灞傛暟
+            int curLayNum = Integer.valueOf(arrLay[i - 1]);
+
+            String className = "row-fz";
+            for (int j = startGen; j <= endGen; j++) {
+                if (j == endGen) {
+                    className = "row-tr";
+                }
+                sb.append("<tr>");
+                if (j == startGen) {
+                    sb.append("<td rowspan=\"");
+                    sb.append(curGen);
+                    sb.append("\" class=\"");
+                    sb.append("row-tr");
+                    sb.append("\">");
+                    sb.append(i);
+                    sb.append("鍦�</td>");
+                }
+                //娣诲姞鏍规暟
+                sb.append("<td class=\"");
+                sb.append(className);
+                sb.append("\">");
+                sb.append(j);
+                sb.append("鏍�</td>");
+                //娣诲姞姣忔牴鐨勫�硷紝濡傛灉褰撳墠鏍规病鏈夐偅涔堝灞傦紝鍒欎笉娣诲姞鍊间繚鐣欑┖
+                for (int k = 1; k <= layMax; k++) {
+                        sb.append("<td class=\"");
+                        sb.append(className);
+                        sb.append("\">");
+                        sb.append(i + "_" + j + "_" + k);
+                        sb.append("</td>");
+                }
+                sb.append("</tr>");
+            }
+        }
+
+        //-----鍚勫眰鍒嗘瀽(鏈�楂樸�佸钩鍧囥�佹渶浣�)-----
+        String classNme1 = "row-fz";
+        String valueName = "";
+        for (int i = 1; i <= 3; i++) {
+            sb.append("<tr>");
+            if(i == 1){
+                valueName = "c_max_";
+                sb.append("<td rowspan=\"3\" class=\"row-tr\">鍚勫眰姹囨��</td>");
+                sb.append("<td class=\"row-fz\">鏈�楂�</td>");
+            }else if(i == 2){
+                valueName = "c_ave_";
+                sb.append("<td class=\"");
+                sb.append("classNme1");
+                sb.append("\">骞冲潎</td>");
+            }else {
+                classNme1 = "row-tr";
+                valueName = "c_min_";
+                sb.append("<td class=\"");
+                sb.append("classNme1");
+                sb.append("\">鏈�浣�</td>");
+            }
+            for (int k = 1; k <= layMax; k++) {
+                sb.append("<td ");
+                sb.append("class=\"");
+                sb.append(classNme1);
+                sb.append("\">");
+                sb.append(valueName);
+                sb.append(k);
+                sb.append("</td>");
+            }
+            sb.append("</tr>");
+        }
+        sb.append("</table>");
+
+        //浠撳簱鍩烘湰淇℃伅
+        sb.append("<table cellspacing=\"0\"cellpadding=\"0\"class=\"table-2\">");
+        sb.append("<tr><td colspan=\"8\">鏁翠粨鍒嗘瀽</td></tr><tr><td>浠撴俯</td><td>c_tIn</td><td>浠撴箍</td><td>c_hIn</td><td>姘旀俯</td><td>c_tOut</td><td>姘旀箍</td><td>c_hOut</td></tr>");
+        sb.append("<tr><td>灞傛渶楂�</td><td>c_max_all</td><td>灞傚钩鍧�</td><td>c_ave_all</td><td>灞傛渶浣�</td><td>c_min_all</td><td></td><td></td></tr>");
+        sb.append("<tr><td>浠撴埧绫诲瀷</td><td>c_depotType</td><td>鍏ヤ粨鏃ユ湡</td><td>c_storeDate</td><td>姘村垎(%)</td><td>c_perWet</td><td>鏉傝川(%)</td><td>c_perImpurity</td></tr>");
+        sb.append("<tr><td>绮鍝佺</td><td>c_foodVariety</td><td>绮浜у湴</td><td>c_foodLocation</td><td>瀹归噸(kg/m3)</td><td>c_bulkWeight</td><td>瀹為檯鍌ㄩ噺(鍚�)</td><td>c_storageReal</td></tr>");
+        sb.append("<tr><td colspan=\"2\">淇濈鍛�</td><td colspan=\"2\">c_storeKeeperName</td><td colspan=\"2\">妫�娴嬩汉</td><td colspan=\"2\">c_checkUser</td></tr>");
+        sb.append("</table>");
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">娉細#琛ㄧず灞傛渶浣庢俯&nbsp;&nbsp;*琛ㄧず灞傛渶楂樻俯</span><span style=\"float: right;\">鍒惰〃鏃堕棿锛歝reateBillDate</span></div>");
+        sb.append("</div></body></html>");
+
+        log.debug("鑾峰彇鍒扮殑绮儏妯℃澘={}", sb.toString());
+
+        result.setModel(sb.toString());
+        return result;
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilderLay01.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilderLay01.java
new file mode 100644
index 0000000..c69c2d3
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilderLay01.java
@@ -0,0 +1,171 @@
+package com.fzzy.igds.utils;
+
+import com.fzzy.igds.data.GrainParam;
+import com.fzzy.igds.data.PrintModeData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @Description 骞虫柟浠撴墦鍗版ā鏉�-妯悜閫氶妯℃澘
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Slf4j
+public class GrainPrintBuilderLay01 {
+
+    /**
+     * 骞充粨浠撴墦鍗版ā鏉�
+     **/
+    public static PrintModeData buildModel(GrainParam param) {
+        PrintModeData result = new PrintModeData();
+        result.setCompanyId(param.getCompanyId());
+        result.setDepotType(param.getDepotType());
+
+        if (StringUtils.isEmpty(param.getCableRule())) {
+            result.setMsg("褰撳墠绮儏娌℃湁鑾峰彇鍒扮伯鎯呭竷绾胯鍒欓厤缃紝鏃犳硶鐢熸垚鎶ヨ〃锛�");
+            return result;
+        }
+
+        String cableRule = param.getCableRule();
+        String[] attr = cableRule.split("-");
+        int cableZ = Integer.valueOf(attr[0]);
+        int cableY = Integer.valueOf(attr[1]);
+        int cableX = Integer.valueOf(attr[2]);
+
+        StringBuilder sb = new StringBuilder();
+        //妯℃澘澶�
+        sb.append("<!DOCTYPE html><html lang=\"zh-cn\"><head><meta http-equiv=\"Content-Type\"content=\"text/html; charset=UTF-8\"><title>骞虫柟浠撴姤琛�</title></head><body>");
+
+        sb.append("<div id=\"print_main\" style=\"margin: 20px;\">");
+
+        //鏍峰紡琛紝涓嶈兘缂╄繘
+        sb.append("<style>");
+        sb.append("table,table tr th,table tr td {border:1px solid #0d1021}");
+        sb.append("table {width:100%;line-height:23px;text-align:center;font-size:14px}");
+        sb.append(".table-2 {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 tr {border-top:0px solid #0d1021 !important}");
+        sb.append(".table-2 td {border-top:0px solid #0d1021 !important}");
+        sb.append(".row-tr {border-left:0px !important;border-right:0px!important;border-top:0px !important}");
+        sb.append(".row-tr1 {border-left:0px !important;border-right:0px !important;border-top:0px !important;font-size:12px}");
+        sb.append(".row-fz {border:0px !important}");
+        sb.append(".row-fz1 {border:0px !important;font-size:12px}");
+        sb.append(".row-li1 {font-size:12px}");
+        sb.append(".link-top {width:100%;border-top:solid #0d1021 1px}");
+        sb.append("</style>");
+
+        sb.append("<div style=\"text-align: center\"><span style=\"font-size: 26px; font-weight: bold;\">companyName绮儏鎶ヨ〃</span>");
+        sb.append("<div class=\"link-top\"></div><div class=\"link-top\"></div>");
+        sb.append("<span style=\"font-size: 16px;\">depotName&nbsp;&nbsp;&nbsp;&nbsp;绮儏鎶ヨ〃</span></div>");
+
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">澶╂皵锛歸eather &nbsp;&nbsp;鏂瑰悜锛�</span><span style=\"float: right;\">妫�娴嬫椂闂达細checkDate</span></div>");
+
+        //<!--鍔ㄦ�佸潗鏍�-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\">");
+        sb.append("<tr>");
+
+        if (cableX > 18) {
+            sb.append("<td colspan=\"2\" class='row-li1'></td>");
+        } else {
+            sb.append("<td colspan=\"2\"></td>");
+        }
+
+        for (int i = 1; i <= cableX; i++) {
+            if (cableX > 18) {
+                sb.append("<td class='row-li1'>");
+            } else {
+                sb.append("<td>");
+            }
+
+            sb.append("绗�" + i + "鍒�");
+            sb.append("</td>");
+        }
+        sb.append("</tr>");
+
+        // <!-- 鍔ㄦ�佸湀-->
+        for (int y = 1; y <= cableY; y++) {
+            String className = "row-fz";
+            if (cableX > 18) className = "row-fz1";
+            for (int z = 1; z <= cableZ; z++) {
+                sb.append("<tr>");
+                if (z == cableZ) {
+                    className = "row-tr";
+                    if (cableX > 18) className = "row-tr1";
+                }
+                //琛�
+                if (z == 1) {
+                    sb.append("<td rowspan='");
+                    sb.append(cableZ);
+                    sb.append("' class='");
+                    if (cableX > 18) {
+                        sb.append("row-tr1");
+                    } else {
+                        sb.append("row-tr");
+                    }
+                    sb.append("'>");
+                    sb.append(y);
+                    sb.append("琛�</td>");
+                }
+                //灞�
+                sb.append("<td class='");
+                sb.append(className);
+                sb.append("'>" + z + "灞�</td>");
+
+                //娣诲姞鏁版嵁
+                for (int x = cableX; x >= 1; x--) {
+                    sb.append("<td class='");
+                    sb.append(className);
+                    sb.append("'>");
+                    sb.append(z + "_" + y + "_" + x);
+                    sb.append("</td>");
+                }
+            }
+
+            sb.append("<tr>");
+        }
+        sb.append("</table>");
+
+        // <!--鍔ㄦ�佸眰琛ㄦ牸-->
+        sb.append("<table cellspacing=\"0\" cellpadding=\"0\" class=\"table-2\"><tr><td width=\"200px\">绮儏鍒嗘瀽锛�</td><td colspan=\"5\">");
+        sb.append("remark</td></tr><tr><td></td><td width=\"16.6%\">鏈�楂�</td><td width=\"16.6%\">鏈�浣�</td><td width=\"16.6%\">骞冲潎</td><td width=\"16.6%\">鍛ㄥ潎</td><td width=\"16.6%\">鍐呭潎</td></tr>");
+        //琛岃鍒欙紝娌℃湁鍛ㄨ绠�
+        for (int k = 1; k <= cableY; k++) {
+            sb.append("<tr>\n<td>绗�");
+            sb.append(k);
+            sb.append("琛�</td>");
+            sb.append("<td>c_max_" + k + "</td>");
+            sb.append("<td>c_min_" + k + "</td>");
+            sb.append("<td>c_ave_" + k + "</td>");
+            sb.append("<td></td>");
+            sb.append("<td></td>");
+            sb.append("</tr>");
+        }
+
+        //鏁翠粨
+        sb.append("<tr><td>鏁�&nbsp;&nbsp;浠�</td>");
+        sb.append("<td>c_max_all</td>");
+        sb.append("<td>c_min_all</td>");
+        sb.append("<td>c_ave_all</td>");
+        sb.append("<td>c_out_ave_all</td>");
+        sb.append("<td>c_in_ave_all</td>");
+
+        //<!-- 鍥哄畾鏁版嵁-->
+        sb.append("<tr><td >浠撴俯锛歝_tIn</td><td >浠撴箍锛歝_hIn</td><td colspan=\"2\">姘旀俯锛歝_tOut</td><td colspan=\"2\">姘旀箍锛歝_hOut</td></tr>");
+        sb.append("<tr><td>浠撴埧绫诲瀷</td><td >c_depotType</td><td colspan=\"2\">鍏ヤ粨鏃ユ湡</td><td colspan=\"2\">c_storeDate</td></tr>");
+        sb.append("<tr><td>鏉傝川锛�%锛�</td><td>c_perImpurity</td><td colspan=\"2\">绮浜у湴</td><td colspan=\"2\">c_foodLocation</td></tr>");
+        sb.append("<tr><td>妫�娴嬩汉</td><td>c_checkUser</td><td colspan=\"2\">淇濈鍛�</td><td colspan=\"2\">c_storeKeeperName</td></tr>");
+        sb.append("</table>");
+
+        // <!--灏鹃儴淇℃伅 -->
+        sb.append("<div style=\"margin-top: 5px;\"><span style=\"float: left;\">娉細#琛ㄧず灞傛渶浣庢俯&nbsp;&nbsp;*琛ㄧず灞傛渶楂樻俯</span><span style=\"float: right;\">鍒惰〃鏃堕棿锛歝reateBillDate</span></div>");
+        sb.append("</div></body></html>");
+
+        log.debug("鑾峰彇鍒扮殑绮儏妯℃澘={}", sb.toString());
+
+
+        result.setModelType("ROW");
+        result.setModel(sb.toString());
+        return result;
+    }
+
+
+}
diff --git a/fzzy-igdss-io/pom.xml b/fzzy-igdss-io/pom.xml
new file mode 100644
index 0000000..f3b72e8
--- /dev/null
+++ b/fzzy-igdss-io/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.fzzy</groupId>
+    <artifactId>fzzy-igdss-io</artifactId>
+    <version>${fzzy.igdss.version}</version>
+
+    <parent>
+        <artifactId>fzzy-igdss-parent</artifactId>
+        <groupId>com.fzzy</groupId>
+        <version>2.0.0</version>
+        <relativePath>../fzzy-igdss-parent/pom.xml</relativePath>
+    </parent>
+
+    <description>
+        io妯″潡
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.fzzy</groupId>
+            <artifactId>fzzy-igdss-core</artifactId>
+            <version>${fzzy.igdss.version}</version>
+        </dependency>
+
+        <!-- 寮曞叆IO鍖� -->
+        <dependency>
+            <groupId>com.ld.base.io</groupId>
+            <artifactId>base-io-netty</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+            <!--            <scope>system</scope>-->
+            <!--            <systemPath>${project.basedir}/src/main/resources/lib/base-io-netty-1.0.0-SNAPSHOT.jar</systemPath>-->
+        </dependency>
+
+        <dependency>
+            <groupId>com.ld.base.io</groupId>
+            <artifactId>base-io-api</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+            <!--            <scope>system</scope>-->
+            <!--            <systemPath>${project.basedir}/src/main/resources/lib/base-io-api-1.0.0-SNAPSHOT.jar</systemPath>-->
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <compilerArguments>
+                        <extdirs>src\main\webapp\WEB-INF\lib</extdirs>
+                    </compilerArguments>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.js</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+    </build>
+</project>
\ No newline at end of file
diff --git a/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/manager/RemoteManager.java b/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/manager/RemoteManager.java
new file mode 100644
index 0000000..4a568d2
--- /dev/null
+++ b/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/manager/RemoteManager.java
@@ -0,0 +1,49 @@
+package com.fzzy.igds.io.manager;
+
+import com.fzzy.igds.io.service.RemoteGrainService;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description 鎺ュ彛Api鎵�鏈夊崗璁殑鍗忚绫伙紝鏍规嵁涓嶅悓鐨勫崗璁厤缃皟鐢ㄤ笉鍚岀殑鍗忚瀹炵幇
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Component(RemoteManager.BEAN_ID)
+public class RemoteManager implements ApplicationContextAware {
+
+	public static final String BEAN_ID = "core.remoteManager";
+
+	/**
+	 * 鐢ㄤ簬瀛樻斁鎵�鏈塕emoteGrainService 鎺ュ彛鐨勫疄鐜扮被
+	 */
+	public static Map<String, RemoteGrainService> remoteGrainMap = new HashMap<>();
+
+	@Override
+	public void setApplicationContext(ApplicationContext applicationContext)
+			throws BeansException {
+		Map<String, RemoteGrainService> grainMap = applicationContext
+				.getBeansOfType(RemoteGrainService.class);
+
+		for (String key : grainMap.keySet()) {
+			remoteGrainMap.put(grainMap.get(key).getProtocol(),
+					grainMap.get(key));
+		}
+
+	}
+
+	/**
+	 * 鏍规嵁鍗忚鑾峰彇鍗忚瀹炵幇鎺ュ彛
+	 *
+	 * @param protocol
+	 * @return
+	 */
+	public RemoteGrainService getRemoteGrainService(String protocol) {
+		return remoteGrainMap.get(protocol);
+	}
+
+}
diff --git a/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/order/ExeOrderService.java b/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/order/ExeOrderService.java
new file mode 100644
index 0000000..d5321bd
--- /dev/null
+++ b/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/order/ExeOrderService.java
@@ -0,0 +1,341 @@
+package com.fzzy.igds.io.order;
+
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.constant.RedisConst;
+import com.fzzy.igds.domain.LogOperation;
+import com.fzzy.igds.request.ExeBaseRequest;
+import com.fzzy.igds.request.ReqStatus;
+import com.fzzy.igds.request.ThReqData;
+import com.fzzy.igds.service.LogOperationService;
+import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.core.redis.RedisCache;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Description 鍛戒护鎵ц鏍¢獙绛変俊鎭帴鍙�
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+@Service
+public class ExeOrderService {
+
+    @Resource
+    private RedisCache redisCache;
+    @Resource
+    private LogOperationService logService;
+
+    /**
+     *
+     * @param baseRequest
+     */
+    public void addCache(ExeBaseRequest baseRequest) {
+        // 娣诲姞缂撳瓨
+        this.addReqCache(baseRequest);
+    }
+
+    /**
+     *
+     * @param request
+     */
+    public void addLog(ExeBaseRequest request) {
+        // 娣诲姞鏃ュ織
+        this.addLogByExeReq(request);
+    }
+
+    /**
+     *
+     * @param baseRequest
+     */
+    public void addLogAndCache(ExeBaseRequest baseRequest) {
+
+        // 娣诲姞缂撳瓨
+        this.addReqCache(baseRequest);
+
+        // 娣诲姞鏃ュ織
+        this.addLogByExeReq(baseRequest);
+    }
+
+    /**
+     * 瀛樻斁娓╂箍搴﹀懡浠ょ紦瀛�
+     * @param request
+     */
+    public void addThCache(ExeBaseRequest request) {
+
+        ThReqData reqData = (ThReqData) request.getReqData();
+
+        if (null == reqData) return;
+
+        String key = this.buildExeOrderKey(request.getBizType(),
+                request.getDeptId(), request.getSerId() + "_" + reqData.getThConf(), request.getRequestId());
+
+        redisCache.setCacheObject(key, request, 8 * 60, TimeUnit.MINUTES);
+    }
+
+    /**
+     *
+     * @param companyId
+     * @param serId
+     * @return
+     */
+    public ExeBaseRequest getControlCache(String companyId, String serId) {
+        String key = Constant.APP_NAME + ":" + companyId + ":DEVICE_CTRL:" + serId;
+        return (ExeBaseRequest) redisCache.getCacheObject(key);
+    }
+
+    /**
+     *
+     * @param bizType
+     * @param type
+     * @param id
+     * @return
+     */
+    public List<ExeBaseRequest> getInProgressOrderById(String bizType, String type, String id) {
+        if (StringUtils.isEmpty(bizType)){
+            return null;
+        }
+        if (StringUtils.isEmpty(type)){
+            return null;
+        }
+        if (StringUtils.isEmpty(id)){
+            return null;
+        }
+
+        bizType = ":" + bizType;
+        type = ":" + type + ":";
+        id = ":" + id + ":";
+
+        String pattern = Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + bizType + type + "*";
+
+        Collection<String> keys = redisCache.keys(pattern);
+
+        if (null == keys || keys.isEmpty())
+            return null;
+
+        List<ExeBaseRequest> result = new ArrayList<>();
+        ExeBaseRequest exeRequest;
+        for (String key : keys) {
+            if (key.indexOf(id) > 0) {
+                exeRequest = (ExeBaseRequest) redisCache.getCacheObject(key);
+                if (null == exeRequest){
+                    continue;
+                }
+                result.add(exeRequest);
+//                if (ReqStatus.IN_PROGRESS.getCode().equals(
+//                        exeRequest.getStatus())) {
+//                    result.add(exeRequest);
+//                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     *
+     * @param bizType
+     * @param type
+     * @param deptId
+     * @param timout
+     * @return
+     */
+    public List<ExeBaseRequest> getAllOrderByDeptId(String bizType,String type, String deptId, int timout) {
+        if (StringUtils.isEmpty(bizType))
+            return null;
+        if (StringUtils.isEmpty(deptId))
+            return null;
+        bizType = ":" + bizType;
+        type = ":" + type;
+
+        String pattern = Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + bizType + type + "*";
+
+        Collection<String> keys = redisCache.keys(pattern);
+
+        if (null == keys || keys.isEmpty())
+            return null;
+
+        List<ExeBaseRequest> result = new ArrayList<>();
+        ExeBaseRequest exeRequest;
+        for (String key : keys) {
+            exeRequest = redisCache.getCacheObject(key);
+            if (null == exeRequest){
+                continue;
+            }
+            if(exeRequest.getDeptId().equals(deptId)){
+                if (ReqStatus.IN_PROGRESS.getCode().equals(exeRequest.getStatus()) && timout > 0) {
+                    if (System.currentTimeMillis() - exeRequest.getExeTime().getTime() > (timout * 1000)) {
+                        exeRequest.setExeMsg("绛夊緟瓒呰繃" + timout + "绉掑悗缁堢娌℃湁鍙嶉");
+                        exeRequest.setStatus(ReqStatus.TIMEOUT_ERROR.getCode());
+                    }
+                }
+
+                result.add(exeRequest);
+            }
+        }
+        return result;
+    }
+
+    /**
+     *
+     * @param request
+     * @param isDel
+     */
+    public void completeCache(ExeBaseRequest request, boolean isDel) {
+        request.setStatus(ReqStatus.COMPLETE.getCode());
+
+        if (StringUtils.isNotEmpty(request.getErrorMsg())) {
+            request.setStatus(ReqStatus.ANALYSIS_ERROR.getCode());
+        }
+
+        if (isDel) {
+            delReqCache(request);
+        } else {
+            addCache(request);
+        }
+    }
+
+    /**
+     *
+     * @param companyId
+     * @param bizType
+     * @param deptId
+     */
+    public void clean(String companyId, String bizType, String deptId) {
+        if (StringUtils.isEmpty(bizType))
+            return;
+        if (StringUtils.isEmpty(deptId))
+            return;
+
+        String pattern = Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE
+                + ":" + bizType + ":" + "*";
+
+        Collection<String> keys = redisCache.keys(pattern);
+
+        if (null == keys || keys.isEmpty())
+            return;
+
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+    }
+
+    /**
+     * @param request
+     */
+    public void addLogByExeReq(ExeBaseRequest request) {
+        LogOperation log = new LogOperation();
+        log.setCompanyId(request.getCompanyId());
+        log.setOperateUser(ContextUtil.getLoginUserName());
+        log.setOperateTime(new Date());
+        log.setBizType(request.getBizType());
+        log.setDeptId(request.getDeptId());
+        log.setOperateInfo(request.getExeMsg());
+        if (StringUtils.isNotEmpty(request.getErrorMsg())) {
+            log.setOperateInfo(request.getExeMsg() + "銆�" + request.getErrorMsg());
+        }
+
+        logService.addLog(log);
+    }
+
+    /**
+     * 娉ㄦ剰锛氬綋鍓嶅瓨鏀剧殑鏄笟鍔℃墽琛岀殑鍛戒护淇℃伅,鍒ゆ柇鏄惁瀛樻斁鍔熻兘缂撳瓨锛岄粯璁ゅ瓨鏀�
+     *
+     * @param request
+     */
+    public void addReqCache(ExeBaseRequest request) {
+
+        //娣诲姞涓氬姟缂撳瓨
+        String key = this.buildReqKeyByBiz(request.getBizType(),request.getDepotId(), request.getRequestId());
+        redisCache.setCacheObject(key, request, 60, TimeUnit.MINUTES);
+
+        //娣诲姞鍔熻兘缂撳瓨
+        if(request.isAddCacheTag()){
+            key = this.buildReqKeyByFun(request.getBizType(),request.getSerId(), request.getRequestId());
+            redisCache.setCacheObject(key, request, 60, TimeUnit.MINUTES);
+        }
+    }
+
+    /**
+     * 娉ㄦ剰锛氬綋鍓嶅瓨鏀剧殑鏄笟鍔℃墽琛岀殑鍛戒护淇℃伅
+     *
+     * @param request
+     */
+    public void delReqCache(ExeBaseRequest request) {
+
+        //鍒犻櫎涓氬姟缂撳瓨
+        String key = this.buildReqKeyByBiz(request.getBizType(), request.getDepotId(), request.getRequestId());
+        redisCache.deleteObject(key);
+
+        //鍒犻櫎鍔熻兘缂撳瓨
+        if(request.isAddCacheTag()){
+            key = this.buildReqKeyByFun(request.getBizType(),request.getSerId(), request.getRequestId());
+            redisCache.deleteObject(key);
+        }
+    }
+
+    /**
+     * 涓氬姟缂撳瓨key,鐢熸垚瑙勫垯锛歩gds:ORDER:bizType:BIZ:serId:orderId
+     *
+     * @param bizType
+     * @param depotId
+     * @param orderId
+     * @return
+     */
+    private String buildReqKeyByBiz(String bizType, String depotId, String orderId) {
+        if (StringUtils.isEmpty(bizType))
+            bizType = "sys";
+
+        if (StringUtils.isEmpty(orderId))
+            orderId = ContextUtil.getTimeId(10000, 99999);
+
+        return Constant.APP_NAME + ":" +RedisConst.KEY_ORDER_PRE + ":" + bizType + ":BIZ:" + depotId + ":" + orderId;
+    }
+
+    /**
+     * 鍔熻兘缂撳瓨key,鐢熸垚瑙勫垯锛歩gds:ORDER:bizType:FUN:serId:orderId
+     *
+     * @param bizType
+     * @param serId
+     * @param orderId
+     * @return
+     */
+    private String buildReqKeyByFun(String bizType, String serId, String orderId) {
+        if (StringUtils.isEmpty(bizType))
+            bizType = "sys";
+
+        if (StringUtils.isEmpty(orderId))
+            orderId = ContextUtil.getTimeId(10000, 99999);
+
+        return Constant.APP_NAME + ":" +RedisConst.KEY_ORDER_PRE + ":" + bizType  + ":FUN:" + serId + ":" + orderId;
+    }
+
+    /**
+     * 鍛戒护缂撳瓨鐢熸垚瑙勫垯锛歛ppName:KEY_KEY_ORDER:bizType:deptId:serId:orderId
+     *
+     * @param bizType 涓氬姟绫诲瀷
+     * @param deptId  搴撳尯缂栫爜
+     * @param serId   鍒嗘満缂栫爜
+     * @param orderId
+     * @return
+     */
+    private String buildExeOrderKey(String bizType, String deptId,
+                                    String serId, String orderId) {
+        if (StringUtils.isEmpty(bizType))
+            bizType = "sys";
+        if (StringUtils.isEmpty(deptId))
+            deptId = "01";
+        if (StringUtils.isEmpty(serId))
+            serId = "0001";
+        if (StringUtils.isEmpty(orderId))
+            orderId = "5000";
+
+        return Constant.APP_NAME + ":" + RedisConst.KEY_ORDER_PRE + ":"
+                + bizType + ":" + deptId + ":" + serId + ":" + orderId;
+    }
+}
diff --git a/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/RemoteGrainService.java b/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/RemoteGrainService.java
new file mode 100644
index 0000000..dcd848f
--- /dev/null
+++ b/fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/RemoteGrainService.java
@@ -0,0 +1,29 @@
+package com.fzzy.igds.io.service;
+
+import com.fzzy.igds.request.ExeBaseRequest;
+import com.fzzy.igds.request.GrainReqData;
+import com.fzzy.igds.response.GrainResponse;
+
+/**
+ * @Description 杩滅▼鎵ц绮儏鎺ュ彛锛岄渶瑕佸湪姣忎釜鍗忚鍖呬腑瀹炵幇    绯荤粺榛樿瀹炵幇涓�涓狣efault
+ * @Author CZT
+ * @Date 2025/12/9 10:19
+ */
+public interface RemoteGrainService {
+
+    /**
+     * 褰撳墠鍗忚鍚嶇О锛岀郴缁熸牴鎹崗璁悕绉拌嚜鍔ㄨ皟鐢ㄥ垎鏈哄尮閰嶇殑鍗忚瀹炵幇
+     *
+     *
+     */
+    String getProtocol();
+
+
+    /**
+     * 绮儏妫�娴嬫帴鍙�
+     *
+     * @param request 璇锋眰鍙傛暟
+     */
+    GrainResponse checkGrain(ExeBaseRequest<GrainReqData> request);
+
+}
diff --git a/fzzy-igdss-web/pom.xml b/fzzy-igdss-web/pom.xml
index 4b90a1f..bba1f82 100644
--- a/fzzy-igdss-web/pom.xml
+++ b/fzzy-igdss-web/pom.xml
@@ -49,6 +49,13 @@
             <artifactId>fzzy-igdss-view</artifactId>
             <version>${fzzy.igdss.version}</version>
         </dependency>
+
+        <!-- io妯″潡-->
+        <dependency>
+            <groupId>com.fzzy</groupId>
+            <artifactId>fzzy-igdss-io</artifactId>
+            <version>${fzzy.igdss.version}</version>
+        </dependency>
 		
         <!-- d7鐨偆鍖�-->
         <dependency>
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/grain/GrainController.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/grain/GrainController.java
new file mode 100644
index 0000000..c16b1f0
--- /dev/null
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/grain/GrainController.java
@@ -0,0 +1,315 @@
+package com.fzzy.sys.controller.grain;
+
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.constant.DepotType;
+import com.fzzy.igds.data.*;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.request.ExeBaseRequest;
+import com.fzzy.igds.response.GrainResponse;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.sys.manager.common.CommonManager;
+import com.fzzy.sys.manager.grain.GrainManager;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description 绮儏鎺у埗鍣�
+ * @Author CZT
+ * @Date 2025/12/9 9:04
+ */
+@Slf4j
+@Controller
+@RequestMapping("grain")
+public class GrainController {
+
+    private static final String prefix = "grain";
+
+    @Resource
+    private CommonManager commonManager;
+    @Resource
+    private GrainManager grainManager;
+
+    /**
+     * 椤甸潰鎺у埗--鏍规嵁浠撳簱绫诲瀷璋冩暣涓嶅悓椤甸潰
+     *
+     * @param depotId
+     * @param deptId
+     * @return
+     */
+    @RequestMapping("/gateway")
+    public String gateway(
+            @RequestParam(value = "depotId", required = true) String depotId,
+            @RequestParam(value = "deptId", required = false) String deptId,
+            ModelMap view) {
+
+        SysUser user = ContextUtil.getLoginUser();
+        view.put(Constant.MODEL_KEY_LOGIN_USER, user);
+
+        if(StringUtils.isBlank(deptId)){
+            deptId = ContextUtil.subDeptId(user);
+        }
+        view.put("deptId", deptId);
+
+        // 浠撳簱鍒楄〃鍋氫笅鎷夋浣跨敤
+        List<Depot> listDepot = commonManager.listDepotByDeptId(deptId);
+        view.put(Constant.MODEL_KEY_DEPOT_LIST, listDepot);
+
+        String depotType = commonManager.getDepotTypeById(depotId);
+        view.put("depotType", depotType);
+        view.put("depotId", depotId);
+
+        //椤甸潰锛岄粯璁ゅ钩鎴夸粨
+        String viewUrl = prefix + "grain-check1";
+        if (depotType.equals(DepotType.TYPE_01.getCode()) || depotType.equals(DepotType.TYPE_05.getCode())) {
+            viewUrl = prefix + "/grain-check1";
+        }
+        if (DepotType.TYPE_02.getCode().equals(depotType) || DepotType.TYPE_04.getCode().equals(depotType)) {
+            viewUrl = prefix + "/grain-check4";
+        }
+        if (DepotType.TYPE_03.getCode().equals(depotType)) {
+            viewUrl = prefix + "/grain-check3";
+        }
+
+        return viewUrl;
+    }
+
+    /**
+     * 椤甸潰鎺у埗--绮儏妫�娴嬮〉闈� - 骞虫埧浠�
+     *
+     * @param depotId
+     * @return
+     */
+    @RequestMapping("/view-check1")
+    public String viewCheck(
+            @RequestParam(value = "depotId", required = false) String depotId,
+            @RequestParam(value = "deptId", required = false) String deptId,
+            ModelMap view) {
+
+        SysUser user = ContextUtil.getLoginUser();
+        view.put(Constant.MODEL_KEY_LOGIN_USER, user);
+
+        // 鑾峰彇褰撳墠鐢ㄦ埛鎵�鍦ㄧ殑鍒嗗簱鍚嶇О
+        if(StringUtils.isBlank(deptId)){
+            deptId = ContextUtil.subDeptId(user);
+        }
+        view.put("deptId", deptId);
+
+        // 鑾峰彇褰撳墠閮ㄩ棬锛屾墍鏈変粨搴撳垪琛�
+        List<Depot> listDepot = commonManager.listDepotByDeptId(deptId);
+        view.put(Constant.MODEL_KEY_DEPOT_LIST, listDepot);
+
+        view.put("depotType", DepotType.TYPE_01.getCode());
+        view.put("depotId", depotId);
+
+        return prefix + "/grain-check1";
+    }
+
+    /**
+     * 椤甸潰鎺у埗--绮儏妫�娴嬮〉闈� - 绛掍粨銆佹祬鍦嗕粨
+     *
+     * @param depotId
+     * @param deptId
+     * @return
+     */
+    @RequestMapping("/view-check4")
+    public String viewCheck4(
+            @RequestParam(value = "depotId", required = false) String depotId,
+            @RequestParam(value = "deptId", required = false) String deptId,
+            ModelMap view) {
+
+        SysUser user = ContextUtil.getLoginUser();
+        view.put(Constant.MODEL_KEY_LOGIN_USER, user);
+
+        // 鑾峰彇褰撳墠鐢ㄦ埛鎵�鍦ㄧ殑鍒嗗簱鍚嶇О
+        if(StringUtils.isBlank(deptId)){
+            deptId = ContextUtil.subDeptId(user);
+        }
+        view.put("deptId", deptId);
+
+        // 鑾峰彇褰撳墠閮ㄩ棬锛屾墍鏈変粨搴撳垪琛�
+        List<Depot> listDepot = commonManager.listDepotByDeptId(deptId);
+        view.put(Constant.MODEL_KEY_DEPOT_LIST, listDepot);
+
+        view.put("depotType", DepotType.TYPE_04.getCode());
+        view.put("depotId", depotId);
+
+        return prefix + "/grain-check4";
+    }
+
+    /**
+     * 鑾峰彇鎵ц鍛戒护璁板綍
+     *
+     * @param depotId
+     * @param deptId
+     * @return
+     */
+    @RequestMapping("/order-list")
+    public String orderList(
+            @RequestParam(value = "depotId", required = false) String depotId,
+            @RequestParam(value = "deptId", required = false) String deptId,
+            ModelMap view) {
+
+        SysUser user = ContextUtil.getLoginUser();
+        view.put(Constant.MODEL_KEY_LOGIN_USER, user);
+
+        // 鑾峰彇褰撳墠鐢ㄦ埛鎵�鍦ㄧ殑鍒嗗簱鍚嶇О
+        if (org.apache.commons.lang3.StringUtils.isEmpty(deptId)) {
+            deptId = ContextUtil.subDeptId(user);
+        }
+        view.put("deptId", deptId);
+
+        view.put("bizType", "grain");
+        view.put("depotId", depotId);
+
+        return prefix + "/order-list";
+    }
+
+    /**
+     * 绮儏椤甸潰 - 鏍规嵁鏉′欢鑾峰彇闆嗗悎锛岄粯璁ゆ煡璇㈠綋澶╃殑鏁版嵁
+     *
+     * @param param
+     * @return
+     */
+    @RequestMapping("/query-list-data")
+    @ResponseBody
+    public PageResponse<List<GrainData>> queryListGrainData(@RequestBody GrainParam param) {
+        if (null == param.getCheckMonth()) {
+            param.setLimit(5);
+        } else {
+            param.setLimit(80);
+        }
+        return grainManager.queryListGrainData(param);
+    }
+
+    /**
+     * 绮儏妫�娴�-鍗曚粨妫�娴�
+     *
+     * @param param
+     * @return
+     */
+    @RequestMapping("/check-single")
+    @ResponseBody
+    public GrainResponse checkSingle(@RequestBody GrainParam param) {
+        return grainManager.checkSingle(param);
+    }
+
+    /**
+     * 绮儏妫�娴�-鎵归噺妫�娴�
+     *
+     * @param param
+     * @return
+     */
+    @RequestMapping("/check-batch")
+    @ResponseBody
+    public GrainResponse checkBatch(@RequestBody GrainParam param) {
+        return grainManager.checkBatch(param);
+    }
+
+    /**
+     * 鏍规嵁褰撳墠浠撳簱鑾峰彇妫�娴嬭褰曪紝榛樿10鏉★紝濡傛灉妫�娴嬪綋鍓嶆湀锛岄粯璁ゆ樉绀�80鏉�
+     *
+     * @param param
+     * @return
+     */
+    @RequestMapping("/page-list")
+    @ResponseBody
+    public PageResponse<List<GrainData>> pageList(@RequestBody GrainParam param) {
+        if (null == param.getCheckMonth()) {
+            param.setLimit(10);
+        } else {
+            param.setLimit(80);
+        }
+        return grainManager.pageListGrainData(param);
+    }
+
+
+    /**
+     * 鏍规嵁鍙傛暟鑾峰彇鎵撳嵃鐨勬ā鏉�
+     *
+     * @param param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/build-print-model")
+    public PageResponse<PrintModeData> buildPrintModel(
+            @RequestBody GrainParam param) {
+        return grainManager.buildPrintModel(param);
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟鑾峰彇鎵撳嵃鐨勬ā鏉�-ALL
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/build-print-model-all")
+    public PageResponse<Map<String, PrintModeData>> buildPrintModelAll(
+            @RequestBody GrainParam param) {
+        param.setCompanyId(ContextUtil.getCompanyId());
+        return grainManager.buildPrintModelAll(param);
+    }
+
+
+    /**
+     * 绮儏妫�娴�-鎵归噺瀵煎嚭EXCEL
+     *
+     * @param param 鍖呮嫭妫�娴嬫椂闂村拰闇�瑕佸鍑虹殑IDS
+     * @return
+     */
+    @RequestMapping("/export-batch")
+    @ResponseBody
+    public GrainResponse exportBatch(@RequestBody GrainParam param) {
+        return grainManager.exportBatch(param);
+    }
+
+
+
+    /**
+     * 鏍规嵁鍙傛暟鑾峰彇鎵撳嵃鐨勬ā鏉�-ALL
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/query-order-list")
+    public LayPage<List<ExeBaseRequest>> queryOrderList(@RequestParam(value = "depotId", required = false) String depotId,
+                                                     @RequestParam(value = "deptId", required = false) String deptId) {
+        // 鑾峰彇褰撳墠鐢ㄦ埛鎵�鍦ㄧ殑鍒嗗簱鍚嶇О
+        if(StringUtils.isBlank(deptId)){
+            deptId = ContextUtil.subDeptId(null);
+        }
+
+        List<ExeBaseRequest> result = grainManager.orderList(deptId);
+
+        return new LayPage(result);
+    }
+
+
+    /**
+     * 娓呴櫎鎵ц鏃ュ織
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/clean-order-list")
+    public PageResponse<String> cleanOrderList(@RequestBody IgdsBaseParam param) {
+
+        if (StringUtils.isEmpty(param.getCompanyId())) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+        if (StringUtils.isEmpty(param.getDeptId())) {
+            param.setDeptId(ContextUtil.subDeptId(null));
+        }
+
+        return grainManager.cleanOrderList(param);
+    }
+}
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java
index ffda277..da79a92 100644
--- a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java
@@ -1,5 +1,6 @@
 package com.fzzy.sys.manager.common;
 
+import com.fzzy.igds.constant.DepotType;
 import com.fzzy.igds.domain.Depot;
 import com.fzzy.igds.service.DepotService;
 import com.fzzy.igds.service.DicService;
@@ -55,4 +56,22 @@
     public List<SysDictData> getInoutType() {
         return dicService.getInoutType();
     }
+
+
+
+    /**
+     * 鏍规嵁浠撳簱缂栫爜鑾峰彇浠撳簱绫诲瀷
+     * @param depotId
+     * @return
+     */
+    public String getDepotTypeById(String depotId) {
+        String depotType = DepotType.TYPE_01.getCode();
+
+        Depot depot = depotService.getCacheDepot(ContextUtil.getCompanyId(), depotId);
+        if (null != depot && StringUtils.isNotEmpty(depot.getDepotType())) {
+            depotType = depot.getDepotType();
+        }
+
+        return depotType;
+    }
 }
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainExportBuilder.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainExportBuilder.java
new file mode 100644
index 0000000..e751048
--- /dev/null
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainExportBuilder.java
@@ -0,0 +1,346 @@
+package com.fzzy.sys.manager.grain;
+
+import com.fzzy.igds.constant.DepotType;
+import com.fzzy.igds.constant.FoodVariety;
+import com.fzzy.igds.data.GrainData;
+import com.fzzy.igds.data.GrainLay;
+import com.fzzy.igds.data.GrainPoint;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.service.FileService;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.GrainDataBuilder;
+import com.fzzy.igds.utils.NumberUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Desc: 绮儏椤甸潰鎵归噺瀵煎嚭EXCEL
+ * @author: Andy
+ * @update-time: 2022/12/8
+ */
+@Slf4j
+@Component
+public class GrainExportBuilder {
+
+    @Autowired
+    private FileService fileService;
+
+    /**
+     * 鐢熸垚鐢熸垚
+     *
+     * @param dataMap
+     * @return 濡傛灉杩斿洖淇℃伅浠ワ細ERROR:寮�澶磋〃绀烘墽琛屽嚭閿欙紝姝e父杩斿洖鏂囦欢鍚嶇О
+     */
+    public String exportByMapData(Map<String, GrainData> dataMap, List<Depot> listDepot) {
+
+        String result;
+        try {
+            //鍒涘缓涓�涓柊鐨凟XCEL
+            HSSFWorkbook toWorkbook = createWorkBook();
+            HSSFWorkbook fromWorkBook;
+
+            Map<String, HSSFWorkbook> mapWorkBook = new HashMap<>();
+
+            HSSFSheet newSheet, oldSheet;
+
+            Depot depot = null;
+            String cableKey = "";
+            for (GrainData data : dataMap.values()) {
+                depot = this.getDepot(data.getDepotId(), listDepot);
+
+                if (null == depot) {
+                    log.info("--------绮儏瀵煎嚭EXCEL娌℃湁鑾峰彇鍒颁粨搴撲俊鎭紝鍙栨秷瀵煎嚭----{}", data.getDepotId());
+                    continue;
+                }
+                if (StringUtils.isEmpty(data.getCableCir())) {
+                    cableKey = data.getCable();
+                } else {
+                    cableKey = data.getCable() + "_" + data.getCableCir();
+                }
+
+                fromWorkBook = mapWorkBook.get(cableKey);
+                if (null == fromWorkBook) {
+                    fromWorkBook = this.getFromWorkBook(data, depot);
+                    mapWorkBook.put(cableKey, fromWorkBook);
+                }
+
+                newSheet = toWorkbook.createSheet(depot.getName());
+
+                oldSheet = fromWorkBook.getSheetAt(0);
+
+                this.copySheet(newSheet, oldSheet, toWorkbook, data, depot);
+
+                Thread.sleep(300);
+            }
+
+            result = ContextUtil.getTimeId() + ".xls";
+            String tempPath = fileService.getTempFilePath(depot == null ? ContextUtil.getCompanyId() : depot.getCompanyId());
+            FileOutputStream fos = new FileOutputStream(tempPath + "/" + result);
+            toWorkbook.write(fos);
+            if (null != fos) fos.close();
+
+        } catch (Exception e) {
+            log.info("---------------瀵煎嚭寮傚父淇℃伅----{}", e);
+            result = "ERROR:瀵煎嚭閿欒锛�" + e.getMessage();
+        }
+
+        return result;
+    }
+
+    private HSSFWorkbook getFromWorkBook(GrainData data, Depot depot) throws Exception {
+        FileInputStream fis = null;
+
+        String filePath = fileService.getConfPath();
+        try {
+            //鑾峰彇妯$増鐨勫悕绉帮紝娉ㄦ剰绛掍粨鍚嶇О閰嶇疆瑙勫垯
+            if (StringUtils.isEmpty(data.getCableCir())) {
+                filePath = filePath + data.getCable() + ".xls";
+            } else {
+                filePath = filePath + data.getCable() + "_" + data.getCableCir() + ".xls";
+            }
+
+            fis = new FileInputStream(filePath);
+            HSSFWorkbook wb = new HSSFWorkbook(fis);
+
+            return wb;
+        } catch (Exception e) {
+            log.error("------鏍规嵁绮儏瀵煎嚭EXCEL鎵ц寮傚父锛歿}", e);
+            return null;
+        } finally {
+            if (null != fis) fis.close();
+        }
+    }
+
+    private Depot getDepot(String depotId, List<Depot> listDepot) {
+        if (listDepot == null || listDepot.isEmpty()) return null;
+
+        for (Depot depot : listDepot) {
+            if (depot.getId().equals(depotId)) return depot;
+        }
+        return null;
+    }
+
+
+    private HSSFWorkbook createWorkBook() {
+        return new HSSFWorkbook();
+    }
+
+
+    /**
+     * 澶嶅埗sheet
+     *
+     * @param newSheet
+     * @param oldSheet
+     * @return
+     */
+    public Sheet copySheet(HSSFSheet newSheet, HSSFSheet oldSheet, Workbook workbook, GrainData data, Depot depot) {
+
+        //鍚堝苟鍗曞厓鏍�
+        int numMergedRegions = oldSheet.getNumMergedRegions();
+        for (int i = 0; i < numMergedRegions; i++) {
+            CellRangeAddress mergedRegion = oldSheet.getMergedRegion(i);
+            newSheet.addMergedRegion(mergedRegion);
+        }
+
+
+        // 璁剧疆鍒楀
+        int physicalNumberOfCells = oldSheet.getRow(0).getPhysicalNumberOfCells();
+        for (int i = 0; i < physicalNumberOfCells; i++) {
+            HSSFRow fromRow = oldSheet.getRow(i);
+            if (null == fromRow) continue;
+            for (int j = fromRow.getLastCellNum(); j >= fromRow.getFirstCellNum(); j--) {
+                newSheet.setColumnWidth(j, oldSheet.getColumnWidth(j));
+                newSheet.setColumnHidden(j, false);
+            }
+        }
+
+
+        //姝ゅ闇�瑕佸皢 cellStyle 瀹氫箟鍦ㄩ亶鍘嗚鐨勫湴鏂�,瀹氫箟鍦ㄥ闈㈠彲鑳藉嚭鐜版牱寮忔覆鏌撻敊璇�
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setWrapText(true);
+
+
+        //姣忔瀹屾垚涓�涓垹闄や竴涓�
+        List<GrainPoint> listPoints = data.getListPoints();
+
+        //鏈�澶ц幏鍙栬鏁�
+        int maxRowSize = oldSheet.getPhysicalNumberOfRows() - 1;
+        for (int i = 0; i < maxRowSize; i++) {
+            Row newRow = newSheet.createRow(i);
+            Row oldRow = oldSheet.getRow(i);
+            newRow.setHeight((short) (20 * 20));
+
+            int maxColSize = oldRow.getPhysicalNumberOfCells();
+
+            String oldCellValue;
+            for (int j = 0; j < maxColSize; j++) {
+                Cell newCell = newRow.createCell(j);
+                Cell oldCell = oldRow.getCell(j);
+                if (oldCell == null) {
+                    continue;
+                }
+                oldCellValue = oldCell.getStringCellValue();
+
+                newCell.setCellValue(getNewCellValue(oldCellValue, listPoints, data, depot));
+
+                newCell.setCellStyle(cellStyle);
+            }
+        }
+        return newSheet;
+    }
+
+
+    /**
+     * 鏍规嵁鍗曞厓鏍兼爣绛炬浛鎹㈠�硷紝闇�瑕佹浛鎹㈢殑鏍囪涓篶_
+     *
+     * @param oldCellValue
+     * @param data
+     * @return
+     */
+    public String getNewCellValue(String oldCellValue, List<GrainPoint> listPoints, GrainData data, Depot depot) {
+
+        try {
+
+            if (null == oldCellValue) return null;
+
+            if (!oldCellValue.startsWith("c_")) return oldCellValue;
+
+            if ("c_title".equals(oldCellValue)) return "绮儏鎶ヨ〃";
+            if ("c_depot".equals(oldCellValue)) return depot.getName() + "绮儏鎶ヨ〃";
+            if ("c_depot_name".equals(oldCellValue)) return depot.getName();
+            if ("c_weather".equals(oldCellValue)) return data.getWeather();
+            if ("c_checkDate".equals(oldCellValue))
+                return DateFormatUtils.format(data.getReceiveDate(), "yyyy-MM-dd HH:mm");
+            if ("c_checkDateYMD".equals(oldCellValue))
+                return DateFormatUtils.format(data.getReceiveDate(), "yyyy-MM-dd HH:mm:ss");
+            if ("c_ori".equals(oldCellValue)) return "";
+            if ("c_tIn".equals(oldCellValue)) return getStrValue(data.getTempIn());
+            if ("c_tOut".equals(oldCellValue)) return getStrValue(data.getTempOut());
+            if ("c_hIn".equals(oldCellValue)) return getStrValue(data.getHumidityIn());
+            if ("c_hOut".equals(oldCellValue)) return getStrValue(data.getHumidityOut());
+
+            if ("c_tempMax".equals(oldCellValue)) return getStrValue(data.getTempMax());
+            if ("c_tempMin".equals(oldCellValue)) return getStrValue(data.getTempMin());
+            if ("c_tempAve".equals(oldCellValue)) return getStrValue(data.getTempAve());
+            if ("c_depotType".equals(oldCellValue)) return DepotType.getMsg(depot.getDepotType());
+            if ("c_storeDate".equals(oldCellValue))
+                return null == depot.getStoreDate() ? null : DateFormatUtils.format(depot.getStoreDate(), "yyyy-MM-dd");
+            if ("c_foodVariety".equals(oldCellValue)) return FoodVariety.getMsg(depot.getFoodVariety());
+            if ("c_storageReal".equals(oldCellValue)) return getStrValue(NumberUtil.keepPrecision(depot.getStorageReal()/1000, 2));
+            if ("c_foodLocation".equals(oldCellValue)) return depot.getFoodLocation();
+            if ("c_bulkWeight".equals(oldCellValue)) return getStrValue(depot.getBulkWeight());
+            if ("c_checkUser".equals(oldCellValue)) return data.getCheckUser();
+            if ("c_storeKeeper".equals(oldCellValue)) return depot.getStoreKeeperName();
+            if ("c_createDate".equals(oldCellValue)) return DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm");
+
+            if (oldCellValue.startsWith("c_lay_")) {
+                String[] tempAttr = oldCellValue.split("_");
+                int layNum = Integer.valueOf(tempAttr[3]);
+                for (GrainLay lay : data.getListLays()) {
+                    if (lay.getFz() == layNum) {
+                        if (oldCellValue.indexOf("max") > 0) return getStrValue(lay.getTempMax());
+                        if (oldCellValue.indexOf("min") > 0) return getStrValue(lay.getTempMin());
+                        if (oldCellValue.indexOf("ave") > 0) return getStrValue(lay.getTempAve());
+                    }
+                }
+                return oldCellValue;
+            }
+
+
+            //骞虫埧浠撶殑鑾峰彇鏂瑰紡
+
+            if (DepotType.TYPE_01.getCode().equals(depot.getDepotType()) || DepotType.TYPE_05.getCode().equals(depot.getDepotType())) {
+                return getNewCellValue01(data, oldCellValue, listPoints);
+            }
+
+            if (DepotType.TYPE_02.getCode().equals(depot.getDepotType())) {
+                return getNewCellValue02(data, oldCellValue, listPoints);
+            }
+
+            if (DepotType.TYPE_03.getCode().equals(depot.getDepotType())) {
+                return getNewCellValue02(data, oldCellValue, listPoints);
+            }
+
+            if (DepotType.TYPE_04.getCode().equals(depot.getDepotType())) {
+                return getNewCellValue02(data, oldCellValue, listPoints);
+            }
+
+        } catch (Exception e) {
+            log.error("---------鎵归噺瀵煎嚭绮儏EXCEL---璧嬪�煎嚭閿�---{}", e);
+            return oldCellValue;
+        }
+
+        return null;
+    }
+
+
+    /**
+     * @Desc: 绛掍粨鐨勭伯娓╃偣瑙勫垯c_x_y_z 鍏朵腑x = 琛ㄧず鍦堟暟锛寉=鎬绘牴鏁帮紝z= 褰撳墠灞�
+     * @author: Andy
+     * @update-time: 2022/12/12
+     */
+    private String getNewCellValue02(GrainData data, String oldCellValue, List<GrainPoint> listPoints) {
+        //鍗曞厓鏍艰祴鍊� c_x_y_z 鍏朵腑x = 琛ㄧず鍦堟暟锛寉=鎬绘牴鏁帮紝z= 褰撳墠灞�
+        String[] attr = oldCellValue.split("_");
+        int x = Integer.valueOf(attr[1]), y = Integer.valueOf(attr[2]), z = Integer.valueOf(attr[3]);
+
+        x = x - 1;
+        y = y - 1;
+        GrainPoint point;
+        for (int i = 0; i < listPoints.size(); i++) {
+            point = listPoints.get(i);
+
+            if (point.getX() == x && point.getY() == y && point.getFz() == z) {
+                listPoints.remove(i);
+                return GrainDataBuilder.renderTempValue(point.getTemp());
+            }
+        }
+
+        return "--";
+    }
+
+
+    private String getNewCellValue01(GrainData data, String oldCellValue, List<GrainPoint> listPoints) {
+        String cable = data.getCable();
+        String[] attrCable = cable.split("-");
+        int numX = Integer.valueOf(attrCable[2]);
+
+
+        //鍗曞厓鏍艰祴鍊� c_灞俖琛宊鍒�
+        String[] attr = oldCellValue.split("_");
+        int lay = Integer.valueOf(attr[1]), row = Integer.valueOf(attr[2]), col = Integer.valueOf(attr[3]);
+
+        row = row - 1;
+        col = numX - col;
+
+        GrainPoint point;
+        for (int i = 0; i < listPoints.size(); i++) {
+            point = listPoints.get(i);
+            if (point.getFz() == lay && point.getY() == row && point.getX() == col) {
+                listPoints.remove(i);
+                return GrainDataBuilder.renderTempValue(point.getTemp());
+            }
+        }
+
+        return "--";
+    }
+
+    private static String getStrValue(Double tempIn) {
+        if (null == tempIn) return null;
+        return tempIn + "";
+    }
+}
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainManager.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainManager.java
new file mode 100644
index 0000000..77972e0
--- /dev/null
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainManager.java
@@ -0,0 +1,498 @@
+package com.fzzy.sys.manager.grain;
+
+import com.fzzy.igds.constant.OrderRespEnum;
+import com.fzzy.igds.constant.RespCodeEnum;
+import com.fzzy.igds.data.*;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.domain.DepotConf;
+import com.fzzy.igds.domain.DeviceSer;
+import com.fzzy.igds.domain.Grain;
+import com.fzzy.igds.io.manager.RemoteManager;
+import com.fzzy.igds.io.order.ExeOrderService;
+import com.fzzy.igds.io.service.RemoteGrainService;
+import com.fzzy.igds.request.ExeBaseRequest;
+import com.fzzy.igds.request.GrainReqData;
+import com.fzzy.igds.request.ReqStatus;
+import com.fzzy.igds.response.GrainResponse;
+import com.fzzy.igds.service.DepotConfService;
+import com.fzzy.igds.service.DepotService;
+import com.fzzy.igds.service.DeviceSerService;
+import com.fzzy.igds.service.GrainService;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.DateUtil;
+import com.fzzy.igds.utils.GrainDataBuilder;
+import com.fzzy.igds.utils.GrainPrintBuilder;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
+import java.text.Collator;
+import java.util.*;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/12/9 9:56
+ */
+@Slf4j
+@Component
+public class GrainManager {
+
+    @Resource
+    private DepotService depotService;
+    @Resource
+    private DepotConfService depotConfService;
+    @Resource
+    private GrainService grainService;
+    @Resource
+    private DeviceSerService deviceSerService;
+    @Resource
+    private RemoteManager remoteManager;
+    @Resource
+    private ExeOrderService exeOrderService;
+    @Resource
+    private GrainExportBuilder grainExportBuilder;
+
+    public PageResponse<List<GrainData>> queryListGrainData(GrainParam param) {
+        if (StringUtils.isEmpty(param.getDepotId())) {
+            return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(),
+                    "娌℃湁鑾峰彇鍒颁粨搴撳弬鏁般��");
+        }
+        if (StringUtils.isEmpty(param.getCompanyId())) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+
+        if (null != param.getCheckDate()) {
+            param.setStart(DateUtil.getCurZero(param.getCheckDate()));
+            param.setEnd(DateUtil.getNextZero(param.getCheckDate()));
+            param.setCheckDate(null);
+        }
+
+        if (null != param.getCheckMonth()) {
+            param.setStart(DateUtil.getMonthFirst(param.getCheckMonth()));
+            param.setEnd(DateUtil.getNextMonthFirst(param.getCheckMonth()));
+            param.setCheckMonth(null);
+        }
+
+        List<Grain> list = grainService.listData(param);
+        if (null == list || list.isEmpty()) {
+            return null;
+        }
+
+        // 娣诲姞浠撳簱淇℃伅
+        Depot depotData = depotService.getCacheDepot(param.getCompanyId(), param.getDepotId());
+        if (null == depotData) {
+            log.error("鏈幏鍙栧埌浠撳簱淇℃伅");
+        }
+
+        List<GrainData> result = new ArrayList<>();
+        DepotConf depotConf;
+        GrainData data;
+        for (Grain grain : list) {
+            depotConf = depotConfService.getCacheDepotConfByDepotId(grain.getCompanyId(), grain.getDepotId());
+            data = new GrainData();
+            BeanUtils.copyProperties(grain, data);
+            GrainDataBuilder.updateGrainData(data, depotConf, depotData.getDepotType());
+            data.setDepotData(depotData);
+            result.add(data);
+        }
+
+
+        for (GrainData grainData : result) {
+            grainData.setDepotData(depotData);
+        }
+        return new PageResponse<>(RespCodeEnum.CODE_0000, result);
+    }
+
+    /**
+     * 鍗曚粨閲囬泦
+     *
+     * @param param
+     * @return
+     */
+    public GrainResponse checkSingle(GrainParam param) {
+        if (StringUtils.isEmpty(param.getCompanyId())) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+
+        if (StringUtils.isEmpty(param.getDeptId())) {
+            param.setDeptId(ContextUtil.subDeptId(null));
+        }
+
+        if (StringUtils.isEmpty(param.getDepotId())) {
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "娌℃湁鑾峰彇鍒颁粨搴撳弬鏁帮紝璇烽噸鏂伴�夋嫨浠撳簱骞舵墽琛岋紒");
+        }
+
+        try {
+            // 缂撳瓨鑾蜂粨搴撻厤缃俊鎭�
+            DepotConf depotConf = depotConfService.getCacheDepotConfByDepotId(param.getCompanyId(), param.getDepotId());
+
+            if (null == depotConf) {
+                return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                        "褰撳墠浠撳簱娌℃湁閰嶇疆绮儏鍙傛暟锛屾墽琛岃鎷掔粷锛�");
+            }
+
+            // 鑾峰彇鍒嗘満淇℃伅
+            DeviceSer deviceSer = deviceSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer());
+
+            if (null == deviceSer) {
+                return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                        "褰撳墠浠撳簱娌℃湁閰嶇疆绮儏鍒嗘満锛屾墽琛岃鎷掔粷锛�");
+            }
+
+            Depot depot = depotService.getCacheDepot(depotConf.getCompanyId(), depotConf.getDepotId());
+
+            //鏁版嵁灏佽
+            ExeBaseRequest request = new ExeBaseRequest<GrainReqData>();
+            request.setDepotId(param.getDepotId());
+            request.setCompanyId(param.getCompanyId());
+            request.setBizType("grain");
+            request.setExeUser(ContextUtil.getLoginUserName());
+            request.setDepotName(depot.getName());
+            request.setDeptId(ContextUtil.subDeptId(null));
+            request.setProtocol(deviceSer.getProtocol());
+            request.setAddLogTag(true);
+            request.setIp(deviceSer.getIp());
+            request.setPort(deviceSer.getPort());
+            request.setSerId(deviceSer.getId());
+            request.setSerName(deviceSer.getName());
+            request.setSn(deviceSer.getSn());
+
+            request.setExeMsg("绮儏閲囬泦锛屼粨搴�=" + request.getDepotName());
+
+            GrainReqData reqData = new GrainReqData();
+            reqData.setCableStart(depotConf.getCableStart());
+            reqData.setCableEnd(depotConf.getCableEnd());
+            reqData.setCableRule(depotConf.getCableRule());
+            // 鏂板娓╂箍搴︿俊鎭�
+            reqData.setThSerId(depotConf.getThSer());
+            reqData.setThConf(depotConf.getThConf());
+            //澶氫粨骞跺彂鏍囧織
+            reqData.setIsMoreDepot(deviceSer.getIsMoreDepot());
+
+            request.setReqData(reqData);
+
+            RemoteGrainService remoteGrainService = remoteManager.getRemoteGrainService(deviceSer.getProtocol());
+
+            if (null == remoteGrainService) {
+                String msg = "绯荤粺娌℃湁" + request.getProtocol() + "鐨勫崗璁疄鐜帮紝鎵ц琚嫆缁濓紒";
+                request.setErrorMsg(msg);
+                request.setStatus(ReqStatus.SEND_ERROR.getCode());
+                exeOrderService.addLogAndCache(request);
+                return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), msg);
+            }
+
+            GrainResponse result = remoteGrainService.checkGrain(request);
+
+            if (!OrderRespEnum.ORDER_SUCCESS.getCode().equals(result.getCode())) {
+                String msg = request.getDepotName() + "璇锋眰澶辫触:" + result.getMsg();
+                request.setErrorMsg(msg);
+                request.setStatus(ReqStatus.SEND_ERROR.getCode());
+            }
+
+            exeOrderService.addLogAndCache(request);
+            return result;
+
+        } catch (Exception e) {
+            log.error("绮儏鎵ц寮傚父锛歿}", e.getLocalizedMessage());
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "绯荤粺寮傚父锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鎵归噺閲囬泦
+     *
+     * @param param
+     * @return
+     */
+    public GrainResponse checkBatch(GrainParam param) {
+        if (null == param.getDepotIds()) {
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "娌℃湁鑾峰彇鍒颁粨搴撳弬鏁帮紝璇烽噸鏂伴�夋嫨浠撳簱骞舵墽琛岋紒");
+        }
+        if (StringUtils.isEmpty(param.getCompanyId())) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+
+        if (StringUtils.isEmpty(param.getDeptId())) {
+            param.setDeptId(ContextUtil.subDeptId(null));
+        }
+
+        try {
+            String[] attr = param.getDepotIds().split(",");
+
+            // 缂撳瓨鑾蜂粨搴撻厤缃俊鎭�
+            DepotConf depotConf;
+            // 鑾峰彇鍒嗘満淇℃伅
+            DeviceSer deviceSer;
+            ExeBaseRequest request;
+            GrainReqData reqData;
+            //鎵ц鍙戦�佸懡浠�
+            RemoteGrainService remoteGrainService;
+            GrainResponse result;
+            Depot depot;
+            for (String depotId : attr) {
+                param.setDepotId(depotId);
+
+                //鏁版嵁灏佽
+                request = new ExeBaseRequest<GrainReqData>();
+                request.setDepotId(param.getDepotId());
+                request.setCompanyId(param.getCompanyId());
+                request.setBizType("grain");
+                request.setExeUser(ContextUtil.getLoginUserName());
+
+                request.setDeptId(ContextUtil.subDeptId(null));
+                request.setAddLogTag(true);
+
+                reqData = new GrainReqData();
+
+                depotConf = depotConfService.getCacheDepotConfByDepotId(param.getCompanyId(), param.getDepotId());
+
+                depot = depotService.getCacheDepot(depotConf.getCompanyId(), depotConf.getDepotId());
+
+                if (null == depotConf) {
+                    request.setErrorMsg("鎵ц澶辫触锛屾病鏈夎幏鍙栫伯鎯呭弬鏁伴厤缃�");
+                    request.setReqData(reqData);
+                    request.setStatus(ReqStatus.SEND_ERROR.getCode());
+                    exeOrderService.addLogAndCache(request);
+                    continue;
+                }
+                request.setDepotName(depot.getName());
+
+                deviceSer = deviceSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer());
+
+                if (null == deviceSer) {
+                    request.setErrorMsg("鎵ц澶辫触锛屾病鏈夎幏鍙栧埌鍒嗘満淇℃伅");
+                    request.setReqData(reqData);
+                    request.setStatus(ReqStatus.SEND_ERROR.getCode());
+                    exeOrderService.addLogAndCache(request);
+                    continue;
+                }
+
+                request.setProtocol(deviceSer.getProtocol());
+                request.setIp(deviceSer.getIp());
+                request.setPort(deviceSer.getPort());
+                request.setSerId(deviceSer.getId());
+                request.setSerName(deviceSer.getName());
+                request.setSn(deviceSer.getSn());
+
+                request.setExeMsg("绮儏閲囬泦锛屼粨搴�=" + request.getDepotName());
+
+                reqData.setCableStart(depotConf.getCableStart());
+                reqData.setCableEnd(depotConf.getCableEnd());
+                reqData.setCableRule(depotConf.getCableRule());
+
+                // 鏂板娓╂箍搴︿俊鎭�
+                reqData.setThSerId(depotConf.getThSer());
+                reqData.setThConf(depotConf.getThConf());
+                //澶氫粨骞跺彂
+                reqData.setIsMoreDepot(deviceSer.getIsMoreDepot());
+                request.setReqData(reqData);
+
+                //鎵ц鍛戒护
+                remoteGrainService = remoteManager.getRemoteGrainService(deviceSer.getProtocol());
+                if (null == remoteGrainService) {
+                    //鍙戦�佸紓甯�
+                    request.setErrorMsg("绯荤粺娌℃湁" + request.getProtocol() + "鐨勫崗璁疄鐜帮紝鎵ц琚嫆缁濓紒");
+                    request.setStatus(ReqStatus.SEND_ERROR.getCode());
+                    exeOrderService.addLogAndCache(request);
+                    continue;
+                }
+
+                result = remoteGrainService.checkGrain(request);
+                if (!OrderRespEnum.ORDER_SUCCESS.getCode().equals(result.getCode())) {
+                    request.setErrorMsg(request.getDepotName() + "璇锋眰澶辫触:" + result.getMsg());
+                    request.setStatus(ReqStatus.SEND_ERROR.getCode());
+                }
+
+                exeOrderService.addLogAndCache(request);
+
+                Thread.sleep(200);
+            }
+        } catch (Exception e) {
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍚庡彴鎵ц寮傚父锛�" + e.getMessage());
+        }
+        return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                "鎵归噺鎵ц绮儏妫�娴嬪懡浠ゅ彂閫佹垚鍔燂紝璇风瓑寰呯粓绔搷搴斺�︹��");
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    public PageResponse<List<GrainData>> pageListGrainData(GrainParam param) {
+        if (StringUtils.isEmpty(param.getCompanyId())) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+        if (StringUtils.isEmpty(param.getDepotId())) {
+            return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(),
+                    "娌℃湁鑾峰彇鍒颁粨搴撳弬鏁帮紝鎵ц澶辫触锛�");
+        }
+
+        param.setTagUpdate(false);
+        List<Grain> list = grainService.listData(param);
+
+        DepotConf depotConf;
+        GrainData data;
+        Depot depotData;
+        List<GrainData> result = new ArrayList<>();
+        for (Grain grain : list) {
+            depotConf = depotConfService.getCacheDepotConfByDepotId(grain.getCompanyId(), grain.getDepotId());
+            data = new GrainData();
+            BeanUtils.copyProperties(grain, data);
+            // 娣诲姞浠撳簱淇℃伅
+            depotData = depotService.getCacheDepot(param.getCompanyId(), param.getDepotId());
+            GrainDataBuilder.updateGrainData(data, depotConf, depotData.getDepotType());
+            result.add(data);
+        }
+
+        if (null == result) {
+            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "褰撳墠鏉′欢涓嬫病鏈夎幏鍙栧埌绮儏淇℃伅锛侊紒");
+        }
+
+        return new PageResponse<List<GrainData>>(RespCodeEnum.CODE_0000, result);
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟鑾峰彇褰撳墠鎵撳嵃闇�瑕佺殑妯℃澘
+     *
+     * @param param
+     * @return
+     */
+    public PageResponse<PrintModeData> buildPrintModel(GrainParam param) {
+        if (null == param.getCompanyId()) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+        if (StringUtils.isEmpty(param.getDepotType())) {
+            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
+                    "娌℃湁鑾峰彇鍒板綋鍓嶄粨搴撶殑浠撳簱绫诲瀷");
+        }
+        if (StringUtils.isEmpty(param.getCableRule()) && StringUtils.isEmpty(param.getCableCir())) {
+            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
+                    "娌℃湁鑾峰彇褰撳墠浠撳簱鐨勫竷绾胯鍒�");
+        }
+        PrintModeData result = GrainPrintBuilder.buildPrintModel(param);
+
+        if (null == result) {
+            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
+                    "绯荤粺娌℃湁鑾峰彇褰撳墠浠撳簱鐨勮〃鍗曟ā鏉�");
+        }
+
+        if (StringUtils.isNotEmpty(result.getMsg())) {
+            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
+                    result.getMsg());
+        }
+
+        return new PageResponse<>(RespCodeEnum.CODE_0000, result);
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    public PageResponse<Map<String, PrintModeData>> buildPrintModelAll(GrainParam param) {
+
+        Map<String, PrintModeData> result = new HashMap<>();
+
+        List<DepotConf> depotConfList = depotConfService.getCacheDepotConfList(param.getCompanyId());
+        PrintModeData modeData;
+        String key;
+        Depot cacheDepot;
+        for (DepotConf conf : depotConfList) {
+            cacheDepot = depotService.getCacheDepot(param.getCompanyId(), conf.getDepotId());
+            param.setCableRule(conf.getCableRule());
+            param.setDepotId(conf.getDepotId());
+            param.setCableCir(conf.getCableCir());
+            param.setDepotType(cacheDepot.getDepotType());
+
+            if (StringUtils.isNotEmpty(param.getCableCir())) {
+                key = param.getDepotType() + "_" + param.getCableRule() + "_" + param.getCableCir();
+            } else {
+                key = param.getDepotType() + "_" + param.getCableRule();
+            }
+            if (null == result.get(key)) {
+                modeData = GrainPrintBuilder.buildPrintModel(param);
+                result.put(key, modeData);
+            }
+        }
+        return new PageResponse<>(RespCodeEnum.CODE_0000, result);
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    public GrainResponse exportBatch(GrainParam param) {
+
+        //鏍规嵁鏉′欢鑾峰彇闇�瑕佹墦鍗扮殑绮儏淇℃伅
+
+        if (null != param.getCheckDate()) {
+            param.setStart(DateUtil.getCurZero(param.getCheckDate()));
+            param.setEnd(DateUtil.getNextZero(param.getCheckDate()));
+            param.setCheckDate(null);
+        }
+
+        //鑾峰彇宸茬粡绮儏鏍煎紡鍖栧畬鎴愮殑绮儏鏁版嵁
+        param.setTagUpdate(true);
+        PageResponse<List<GrainData>> listPageResponse = this.pageListGrainData(param);
+        List<GrainData> list = listPageResponse.getData();
+
+        if (null == list || list.isEmpty()) {
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "褰撳墠鏉′欢涓嬫病鏈夋煡璇㈠埌绮儏妫�娴嬭褰曪紝鍙栨秷瀵煎嚭");
+        }
+
+        //鎸夌収浠撳簱缂栫爜浠庢柊鎺掑簭
+        Collator sortChina = Collator.getInstance(Locale.CHINA);
+        Collections.sort(list, (a, b) -> sortChina.compare(a.getDepotId(), b.getDepotId()));
+
+        //鑾峰彇缂撳瓨鐨勪粨搴撳垪琛紝鐢ㄤ簬鑾峰彇浠撳簱鍚嶇О
+        List<Depot> listDepot = depotService.getCacheDepotList(param.getCompanyId(), param.getDeptId());
+
+        //鍘婚櫎閲嶅鐨勭伯鎯呮暟鎹�
+        LinkedHashMap<String, GrainData> dataMap = new LinkedHashMap<>();
+        for (GrainData data : list) {
+            if (null != dataMap.get(data.getDepotId())) continue;
+
+            dataMap.put(data.getDepotId(), data);
+        }
+
+
+        String fileName = grainExportBuilder.exportByMapData(dataMap, listDepot);
+
+        if (fileName.startsWith("ERROR")) {
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鎵ц瀵煎嚭鍑虹幇閿欒锛�" + fileName);
+        }
+
+        return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                fileName);
+    }
+
+    /**
+     *
+     * @param deptId
+     * @return
+     */
+    public List<ExeBaseRequest> orderList(String deptId) {
+        return exeOrderService.getAllOrderByDeptId("grain","BIZ", deptId, 2 * 60 * 8);
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    public PageResponse<String> cleanOrderList(IgdsBaseParam param) {
+        exeOrderService.clean(param.getCompanyId(), "grain", param.getDeptId());
+
+        return new PageResponse<>(RespCodeEnum.CODE_0000, "鎵ц鎴愬姛");
+    }
+}
diff --git a/fzzy-igdss-web/src/main/resources/static/grain/PrintBuilder-lay.js b/fzzy-igdss-web/src/main/resources/static/grain/PrintBuilder-lay.js
new file mode 100644
index 0000000..8dd2dd1
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/grain/PrintBuilder-lay.js
@@ -0,0 +1,576 @@
+//鍒濆鍖栨ā鏉�
+initModel = function () {
+    if (CACHE_PRINT_MODEL.size > 0) {
+        return;
+    }
+    $.ajax({
+        type: "POST",
+        url: "/grain/build-print-model-all",
+        data: JSON.stringify({
+            depotId: depotId
+        }),
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        success: function (result) {
+            if (result.code != "0000") {
+                layer.msg(result.msg);
+                return null;
+            } else {
+                //瀛樻斁鍦ㄧ紦瀛樹腑
+                CACHE_PRINT_MODEL = result.data;
+            }
+        },
+        error: function () {
+            layer.msg("鍒濆鍖栨ā鏉垮け璐ワ紒锛�");
+        }
+    });
+};
+
+/**
+ * 鍗曚粨鎵撳嵃锛屽鏋滅洿鎺ヨ繑鍥炵殑妯℃澘淇℃伅涓篘ULL锛岄噸鏂拌幏鍙栦笅妯℃澘
+ * @param grainData
+ */
+toPrintSingle = function (grainData) {
+    var html = null;
+
+    var depotData = grainData.depotData;
+    if (!depotData.depotType) {
+        depotData.depotType = DepotType.T_01;
+    }
+    var key = builderModelKey(depotData.depotType, grainData.cable, grainData.cableCir);
+
+    //鍏堜粠鍗曚釜妯℃澘涓幏鍙�
+    var modelData = CACHE_PRINT_MODEL[key];
+    if (modelData) {
+        html = builderModelByType(modelData, grainData);
+        previewA4(html);
+        return;
+    }
+
+    console.log("---------閲嶆柊鑾峰彇妯℃澘--------");
+
+    $.ajax({
+        type: "POST",
+        url: "/grain/build-print-model",
+        data: JSON.stringify({
+            depotId: depotId,
+            depotType: depotData.depotType,
+            cableRule: grainData.cable,
+            cableCir: grainData.cableCir
+        }),
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        success: function (result) {
+            if (result.code != "0000") {
+                layer.alert("鏈嶅姟鍣ㄨ幏鍙栨墦鍗版ā鏉垮け璐ワ紝璇烽噸鏂版搷浣�-" + result.msg);
+                return;
+            } else {
+                html = builderModelByType(result.data, grainData);
+                previewA4(html);
+                return;
+            }
+        },
+        error: function () {
+            layer.alert("鏈嶅姟鍣ㄨ幏鍙栨墦鍗版ā鏉垮け璐ワ紒锛侊紒");
+        }
+    });
+};
+
+/**
+ * 鑾峰彇妯℃澘
+ * @param grainData
+ */
+builderModel = function (grainData) {
+    var depotData = grainData.depotData;
+    if (!depotData.depotType) {
+        depotData.depotType = DepotType.T_01;
+    }
+    var key = builderModelKey(depotData.depotType, grainData.cable, grainData.cableCir);
+
+    //鍏堜粠鍗曚釜妯℃澘涓幏鍙�
+    var modelData = CACHE_PRINT_MODEL[key];
+    if (modelData) {
+        // return builderModelStep2(modelData, grainData);
+        return builderModelByType(modelData, grainData);
+    } else {
+        return null;
+    }
+};
+
+/**
+ * 鑾峰彇妯℃澘鍚庢坊鍔犳暟鎹�
+ * @param grainData
+ */
+builderModelByType = function (modelData, grainData) {
+    var depotData = grainData.depotData;
+    //鍔ㄦ�佹暟鎹俊鎭�--骞虫柟浠�
+    if (DepotType.T_01 == depotData.depotType || DepotType.T_05 == depotData.depotType) {
+        return builderModelLay(grainData);
+    } else if (DepotType.T_02 == depotData.depotType) {
+        return builderModelCir(modelData, grainData);
+    } else if (DepotType.T_03 == depotData.depotType) {
+        return builderModelCir(modelData, grainData);
+    } else if (DepotType.T_04 == depotData.depotType) {
+        return builderModelCir(modelData, grainData);
+    } else {
+        return builderModelLay(modelData, grainData);
+    }
+};
+
+/**
+ * 鑾峰彇妯℃澘鍚庢坊鍔犳暟鎹�--绛掍粨
+ * @param grainData
+ */
+builderModelCir = function (modelData, grainData) {
+    var attCable = grainData.cable.split("-");
+    numZ = attCable[0];
+    numY = attCable[1];
+    numX = attCable[2];
+
+    var model = modelData.model;
+    var depotData = grainData.depotData;
+    //鏇挎崲鍩虹鏁版嵁
+    if (dept) {
+        model = model.replace("companyName", dept.deptName);
+    } else {
+        model = model.replace("companyName", "鏅烘収绮簱");
+    }
+    model = model.replace("depotName", depotData.name)
+        .replace("weather", grainData.weather == null ? "" : grainData.weather)
+        .replace("orientation", depotData.orientation == null ? "" : depotData.orientation)
+        .replace("checkDate", grainData.receiveDate)
+        .replace("remark", grainData.remark == null ? "姝e父" : grainData.remark)
+        .replace("c_max_all", grainData.tempMax)
+        .replace("c_min_all", grainData.tempMin)
+        .replace("c_ave_all", grainData.tempAve);
+
+    model = model.replace("c_out_ave_all", "");//鏆傛椂涓嶇敤
+    model = model.replace("c_in_ave_all", "");//鏆傛椂涓嶇敤
+
+    model = model.replace("c_tIn", grainData.tempIn <= -100.0 ? "澶囩敤" : grainData.tempIn)
+        .replace("c_hIn", grainData.humidityIn <= -100.0 ? "澶囩敤" : grainData.humidityIn)
+        .replace("c_tOut", grainData.tempOut <= -100.0 ? "澶囩敤" : grainData.tempOut)
+        .replace("c_hOut", grainData.humidityOut <= -100.0 ? "澶囩敤" : grainData.humidityOut)
+        .replace("c_depotType", depotData.depotTypeName == null ? "/" : depotData.depotTypeName)
+        .replace("c_storeDate", depotData.storeDate == null ? "/" : depotData.storeDate.substring(0, 10))
+        .replace("c_foodLocation", depotData.foodLocation == null ? "/" : depotData.foodLocation)
+        .replace("c_foodVariety", depotData.foodVarietyName == null ? "/" : depotData.foodVarietyName)
+        .replace("c_perWet", depotData.perWet == null ? "/" : depotData.perWet)
+        .replace("c_perImpurity", depotData.perImpurity == null ? "/" : depotData.perImpurity)
+        .replace("c_bulkWeight", depotData.bulkWeight == null ? "/" : depotData.bulkWeight)
+        .replace("c_storeDate", depotData.storeDate == null ? "/" : depotData.storeDate)
+        .replace("c_storageReal", depotData.storageReal == null ? "/" : (Number(depotData.storageReal) / 1000).toFixed(2))
+        .replace("c_checkUser", grainData.checkUser == null ? "/" : grainData.checkUser)
+        .replace("c_storeKeeperName", depotData.storeKeeperName == null ? "/" : depotData.storeKeeperName)
+        .replace("createBillDate", grainData.sysDate);
+
+    //鍔ㄦ�佹暟鎹俊鎭�--骞虫柟浠�
+    if (DepotType.T_01 == depotData.depotType) {
+        if ("ROW" == modelData.modelType) {
+            model = addPointsRow1(model, grainData, numX);
+        } else {
+            model = addPoints1(model, grainData, numX);
+        }
+    }
+    //鍔ㄦ�佹暟鎹俊鎭�--娴呭渾浠�
+    if (DepotType.T_02 == depotData.depotType) {
+        model = addPoints4(model, grainData);
+    }
+    //鍔ㄦ�佹暟鎹俊鎭�--娌圭綈
+    if (DepotType.T_03 == depotData.depotType) {
+        var oilHeight = grainData.oilHeight;
+        if (oilHeight) {
+            var att = oilHeight.split("-");
+            model = model.replace("c_depotHeight", att[1])
+                .replace("c_oilHeight", att[0]);
+        } else {
+            model = model.replace("c_depotHeight", "#")
+                .replace("c_oilHeight", "#");
+        }
+        model = addPoints4(model, grainData);
+    }
+    //鍔ㄦ�佹暟鎹俊鎭�--绔嬬瓛浠�
+    if (DepotType.T_04 == depotData.depotType) {
+        model = addPoints4(model, grainData);
+    }
+    return model;
+};
+
+/**
+ * 骞虫柟浠撴墦鍗版姤琛�
+ */
+builderModelLay = function (grainData) {
+
+    var companyId = grainData.companyId;
+    var depotData = grainData.depotData;
+    var quality = grainData.mquality;
+    var qualityItemMap = {};
+    if (quality) {
+        var item = quality.checkItems;
+        if (item) {
+            for (var i = 0; i < item.length; i++) {
+                qualityItemMap[item[i].standardId] = item[i];
+            }
+        }
+    }
+    var cable = grainData.cable;
+    var attr = cable.split("-");
+    var numZ = attr[0];//灞傞厤缃�
+    var numY = attr[1];//琛岄厤缃�
+    var numX = attr[2];//鍒楅厤缃�
+    var listLays = grainData.listLays;
+
+    var model = "<!DOCTYPE html><html lang=\"zh-cn\">\n"
+        + "<head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"><title>绮儏鎶ヨ〃妯$増</title>"
+        + "    <style>\n"
+        + "        table,table tr th,table tr td{border:1px solid #0d1021}table{width:100%;line-height:23px;text-align:center;font-size:14px}.table-2{border-top:0px solid #0d1021 !important}.table-2 tr{border-top:0px solid #0d1021 !important}.table-2 td{border-top:0px solid #0d1021 !important}.table-row-tr{border-left:0px !important;border-right:0px !important;border-top:0px !important}.table-row-fz{border:0px !important}.link-top{width:100%;border-top:solid #0d1021 1px}</style>\n"
+        + "</head>\n" + "<body>";
+
+    model += "<div style=\"text-align: center\">\n"
+        + "<span style=\"font-size: 26px; font-weight: bold;\">\n";
+    if (dept) {
+        model += dept.deptName;
+    } else {
+        model += "--XXX--绮簱"
+    }
+    model += "</span><div class=\"link-top\"></div><div class=\"link-top\"></div>\n";
+    model += "<span style=\"font-size: 18px; \">";
+    model += depotData.name;
+    if (compareData) {
+        model += "&nbsp;&nbsp;&nbsp;&nbsp;绮儏鎶ヨ〃(灞傚熀鍑�) 瀵规瘮 " + compareData.batchId + "</span>\n";
+    } else {
+        model += "&nbsp;&nbsp;&nbsp;&nbsp;绮儏鎶ヨ〃(灞傚熀鍑�)</span>\n";
+    }
+    model += "</div><div style=\"margin-top: 5px;\"><span style=\"float: left;\">澶╂皵锛�";
+    model += grainData.weather == null ? "" : grainData.weather;
+    model += "&nbsp;&nbsp;鏂瑰悜锛�";
+    model += depotData.orientation == null ? "" : depotData.orientation
+    model += "</span><span style=\"float: right;\">妫�娴嬫椂闂达細";
+    model += grainData.receiveDate;
+    model += "</span></div>";
+
+    //鍔ㄦ�侀厤缃�
+    model += "<table cellspacing=\"0\" cellpadding=\"0\"><tr><td colspan=\"2\"></td>";
+    //鍔ㄦ�佹坊鍔犲垪閰嶇疆
+    for (var x = 1; x <= numX; x++) {
+        model += "<td>绗�" + x + "鍒�</td>";
+    }
+    model += "</tr>";
+    //鍔ㄦ�佹坊鍔犻噰闆嗙偣淇℃伅 Y
+    for (var y = 1; y <= numY; y++) {
+        for (var z = 1; z <= numZ; z++) {
+            model += "<tr>";
+            if (1 == z) {
+                model += "<td rowspan=" + numZ + " class=\"table-row-tr\">"
+                    + y + "琛�</td>";
+            }
+            if (z == numZ) {
+                model += "<td class=\"table-row-tr\">" + z + "灞�</td>";
+            } else {
+                model += "<td class=\"table-row-fz\">" + z + "灞�</td>";
+            }
+            for (var x = numX; x >= 1; x--) { //鍊肩殑鏍煎紡锛歝ell+灞�+琛�+鍒�
+                if (z == numZ) {
+                    model += "<td class=\"table-row-tr\">c_" + z + y + x
+                        + "</td>";
+                } else {
+                    model += "<td class=\"table-row-fz\">c_" + z + y + x
+                        + "</td>";
+                }
+            }
+            model += "</tr>";
+        }
+    }
+    model += "</table>";
+    //寮�濮嬫坊鍔犵伯鎯呮暣浣撴暟鎹�
+    model += "<table cellspacing=\"0\" cellpadding=\"0\" class=\"table-2\">";
+    model += "<tr><td width=\"200px\">绮儏鍒嗘瀽锛�</td>";
+    model += "<td colspan=5>" + grainData.remark + "</td></tr>";
+    model += "</tr><tr><td></td><td>鏈�楂�</td><td>鏈�浣�</td><td>骞冲潎</td><td>鍛ㄥ潎</td><td>鍐呭潎</td></tr>";
+    //閬嶅巻姣忓眰鐨勪俊鎭�
+    var layData;
+    for (var i = 0; i < listLays.length; i++) {
+        layData = listLays[i];
+        model += "<tr><td>";
+        model += layData.fz + "灞�";
+        model += "</td><td>";
+        model += layData.tempMax;
+        model += "</td><td>";
+        model += layData.tempMin;
+        model += "</td><td>";
+        model += layData.tempAve;
+        model += "</td><td>";
+        model += layData.tempAveOut;
+        model += "</td><td>";
+        model += layData.tempAveIn;
+        model += "</td></tr>";
+    }
+    //鏁翠粨
+    model += "<tr><td>鏁翠粨</td><td>";
+    model += grainData.tempMax;
+    model += "</td><td>";
+    model += grainData.tempMin;
+    model += "</td><td>";
+    model += grainData.tempAve;
+    model += "</td><td>";
+    model += "</td><td>";
+    model += "</td></tr>";
+
+    //鍥哄畾鏍忎綅鍊�
+    model += "<tr><td>浠撴俯锛�" + (grainData.tempIn <= -100.0 ? "澶囩敤" : grainData.tempIn) + "</td>";
+    model += "<td>浠撴箍锛�" + (grainData.humidityIn <= -100.0 ? "澶囩敤" : grainData.humidityIn) + "</td>";
+    model += "<td colspan=\"2\">姘旀俯锛�" + (grainData.tempOut <= -100.0 ? "澶囩敤" : grainData.tempOut) + "</td>";
+    model += "<td colspan=\"2\">姘旀箍锛�" + (grainData.humidityOut <= -100.0 ? "澶囩敤" : grainData.humidityOut) + "</td></tr>";
+
+    model += "<tr><td>浠撴埧绫诲瀷</td><td>" + (depotData.depotTypeName == null ? '/' : depotData.depotTypeName) + "</td>";
+    model += "<td colspan=\"2\">鍏ヤ粨鏃ユ湡</td><td colspan=\"2\">"
+        + (depotData.storeDate == null ? '/' : depotData.storeDate.substring(0, 10)) + "</td></tr>";
+
+    model += "<tr><td>绮鍝佺</td><td>" + (depotData.foodVarietyName == null ? '/' : depotData.foodVarietyName) + "</td>";
+    model += "<td colspan=\"2\">瀹為檯鍌ㄩ噺锛堝惃锛�</td><td colspan=\"2\">"
+        + (depotData.storageReal == null ? '/' : (Number(depotData.storageReal) / 1000).toFixed(2)) + "</td></tr>";
+
+    model += "<tr><td>姘村垎(鍏ヤ粨% ~ 褰撳墠%)</td><td>" + (depotData.perWet == null ? '/' : depotData.perWet) + " ~ " + getCheckValue(qualityItemMap, "C01") + "</td>";
+    model += "<td colspan=\"2\">鍑虹硻鐜�(%)</td><td colspan=\"2\">"
+        + getCheckValue(qualityItemMap, "C09") + "</td></tr>";
+
+    model += "<tr><td>鍙戣娊鐜囷紙%锛�</td><td>" + getCheckValue(qualityItemMap, "C32") + "</td>";//鍙戣娊鐜�
+    model += "<td colspan=\"2\">绮浜у湴</td><td colspan=\"2\">"
+        + (depotData.foodLocation == null ? '/' : depotData.foodLocation) + "</td></tr>";
+    if ('5336' == companyId) {
+        model += "<tr><td>瀹归噸锛坓/L锛�</td><td>" + getCheckValue(qualityItemMap, "C03") + "</td>";
+    } else {
+        model += "<tr><td>瀹归噸锛坘g/m3锛�</td><td>" + getCheckValue(qualityItemMap, "C03") + "</td>";
+    }
+
+    model += "<td colspan=\"2\">闈㈢瓔鎸佹按鐜囷紙%锛�</td><td colspan=\"2\">" + getCheckValue(qualityItemMap, "C08") + "</td></tr>";//娌℃湁濉啓
+
+    model += "<tr><td>鏉傝川锛�%锛�</td><td>" + getCheckValue(qualityItemMap, "C02") + "</td>";
+    model += "<td colspan=\"2\">涓嶅畬鍠勭矑锛�%锛�</td><td colspan=\"2\">";
+    model += getCheckValue(qualityItemMap, "C04");
+    model += "</td></tr>";
+
+    model += "<tr><td>妫�娴嬩汉</td><td>" + (grainData.checkUser == null ? '/' : grainData.checkUser) + "</td>";
+    model += "<td colspan=\"2\">淇濈鍛�</td><td colspan=\"2\">"
+        + (depotData.storeKeeperName == null ? '/' : depotData.storeKeeperName) + "</td></tr>";
+    model += "</table>";
+
+    //娣诲姞灏鹃儴淇℃伅
+    model += "<div style=\"margin-top: 5px;\">";
+    model += "<span style=\"float: left;\">娉細#琛ㄧず灞傛渶浣庢俯&nbsp;&nbsp;*琛ㄧず灞傛渶楂樻俯&nbsp;&nbsp;\<琛ㄧず鐢电紗寮�濮嬩綅缃甛></span>";
+    model += "<span style=\"float: right;\">鍒惰〃鏃堕棿锛�" + grainData.sysDate
+        + "</span></div>";
+    model += "</div></body></html>";
+    //鐐逛綅淇℃伅璧嬪��
+    model = attrPointsLay(model, grainData.listPoints, listLays, numX);
+    return model;
+};
+
+//鏍规嵁閲囬泦鐐硅祴鍊硷紝娉ㄦ剰鏁版嵁搴撶敓鎴愮殑鍧愭爣鏄粠0寮�濮嬬殑
+attrPointsLay = function (model, listPoints, listLays, numX) {
+    var point;
+    var key;
+    var lay;
+    var temp;
+    for (var i = 0; i < listPoints.length; i++) {
+        point = listPoints[i];
+        temp = point.temp;
+        key = "c_" + (point.z + 1) + (point.y + 1) + (point.x + 1);
+        //鍒ゆ柇灞傞珮浣庢俯
+        lay = listLays[point.z];
+        if (-100.0 == temp) {
+            temp = "澶囩敤";
+        }
+        if (-101.0 == temp) {
+            temp = "鏁呴殰";
+        }
+        if (temp == lay.tempMax) {
+            temp = temp + "*";
+        }
+        if (temp == lay.tempMin) {
+            temp = temp + "#";
+        }
+        //key = c_z+1 + 1 + numX琛ㄧず绗竴鍒�
+        if (key == ("c_" + (point.z + 1) + "1" + numX)) {
+            temp = "<" + temp + ">";
+        }
+        model = model.replace(key, temp);
+    }
+    return model;
+};
+
+/**
+ * 妯℃澘缂撳瓨KEY鐨勭敓鎴�
+ * @param depotType
+ * @param cable
+ * @param cableCir
+ */
+builderModelKey = function (depotType, cable, cableCir) {
+    if (cableCir) {
+        return depotType + "_" + cable + "_" + cableCir;
+    }
+    return depotType + "_" + cable;
+};
+
+//鏍规嵁閲囬泦鐐硅祴鍊硷紝娉ㄦ剰鏁版嵁搴撶敓鎴愮殑鍧愭爣鏄粠0寮�濮嬬殑
+addPoints1 = function (model, numX) {
+    var listPoints = grainData.listPoints;
+    var listLays = grainData.listLays;
+    var point;
+    var key;
+    var lay;
+    var temp;
+    for (var i = 0; i < listPoints.length; i++) {
+        point = listPoints[i];
+        temp = point.temp;
+        lay = listLays[point.z];
+        //灞傛渶
+        if (lay.z <= listLays.length) {
+            key = "c_max_" + (lay.z + 1);
+            model = model.replace(key, lay.tempMax);
+            key = "c_min_" + (lay.z + 1);
+            model = model.replace(key, lay.tempMin);
+            key = "c_ave_" + (lay.z + 1);
+            model = model.replace(key, lay.tempAve);
+            key = "c_out_ave_" + (lay.z + 1);
+            model = model.replace(key, lay.tempAveOut);
+            key = "c_in_ave_" + (lay.z + 1);
+            model = model.replace(key, lay.tempAveIn);
+        }
+
+        key = (point.z + 1) + '_' + (point.y + 1) + '_' + (point.x + 1);
+        if (-100.0 == temp) {
+            temp = "澶囩敤";
+        }
+        if (-101.0 == temp) {
+            temp = "鏁呴殰";
+        }
+        if (temp == lay.tempMax) {
+            temp = temp + "*";
+        }
+        if (temp == lay.tempMin) {
+            temp = temp + "#";
+        }
+        //key = c_z+1 + 1 + numX琛ㄧず绗竴鍒�
+        // if (key == ((point.z + 1) + "1" + numX) + "_c") {
+        //     temp = "<" + temp + ">";
+        // }
+        model = model.replace(key, temp);
+    }
+    return model;
+};
+
+//妯悜閫氶璧嬪��
+addPointsRow1 = function (model, grainData, numX) {
+    var listPoints = grainData.listPoints;
+    var listRows = grainData.listRows;
+    var point;
+    var key;
+    var temp;
+    for (var i = 0; i < listPoints.length; i++) {
+        point = listPoints[i];
+        temp = point.temp;
+        row = listRows[point.y];
+        //琛屾渶澶�
+        if (row.y <= listRows.length) {
+            key = "c_max_" + (row.y + 1);
+            model = model.replace(key, row.tempMax);
+            key = "c_min_" + (row.y + 1);
+            model = model.replace(key, row.tempMin);
+            key = "c_ave_" + (row.y + 1);
+            model = model.replace(key, row.tempAve);
+        }
+
+        key = (point.z + 1) + '_' + (point.y + 1) + '_' + (point.x + 1);
+        if (-100.0 == temp) {
+            temp = "澶囩敤";
+        }
+        if (-101.0 == temp) {
+            temp = "鏁呴殰";
+        }
+        if (temp == row.tempMax) {
+            temp = temp + "*";
+        }
+        if (temp == row.tempMin) {
+            temp = temp + "#";
+        }
+        //key = c_z+1 + 1 + numX琛ㄧず绗竴鍒�
+        // if (key == ("c_" + (point.z + 1) + "1" + numX)) {
+        //     temp = "<" + temp + ">";
+        // }
+        model = model.replace(key, temp);
+    }
+    return model;
+};
+
+//绛掍粨娣诲姞閲囬泦鐐瑰拰灞傛俯搴︿俊鎭�
+addPoints4 = function (model, grainData) {
+    // console.log(grainData);
+    var listPoints = grainData.listPoints;
+    var listLays = grainData.listLays;
+    var point;
+    var key;
+    var lay;
+    var temp;
+    for (var i = 0; i < listPoints.length; i++) {
+        point = listPoints[i];
+        lay = listLays[point.z];
+        temp = point.temp;
+        //灞傛渶
+        if (lay.z <= listLays.length) {
+            key = "c_max_" + lay.z;
+            model = model.replace(key, lay.tempMax);
+            key = "c_min_" + lay.z;
+            model = model.replace(key, lay.tempMin);
+            key = "c_ave_" + lay.z;
+            model = model.replace(key, lay.tempAve);
+            key = "c_out_ave_" + lay.z;
+            model = model.replace(key, lay.tempAveOut);
+            key = "c_in_ave_" + lay.z;
+            model = model.replace(key, lay.tempAveIn);
+        }
+
+        key = (point.x + 1) + "_" + (point.y + 1) + "_" + (point.z + 1);
+        //鍒ゆ柇灞傞珮浣庢俯
+        if (-100.0 == temp) {
+            temp = "澶囩敤";
+        }
+        if (-101.0 == temp) {
+            temp = "鏁呴殰";
+        }
+        if (-102.0 == temp) {
+            temp = "--";
+        }
+        if (temp == lay.tempMax) {
+            temp = temp + "*";
+        }
+        if (temp == lay.tempMin) {
+            temp = temp + "#";
+        }
+        model = model.replace(key, temp);
+    }
+    return model;
+};
+/**
+ * 鏍规嵁HTML妯$増鎵撳嵃涓篈4
+ * @param strHtml
+ */
+previewA4 = function (strHtml) {
+    var LODOP = CLODOP;
+    LODOP.SET_PRINT_PAGESIZE(1, 0, 0, "A4");
+    LODOP.PRINT_INIT("绮儏鎶ヨ〃");
+    LODOP.ADD_PRINT_HTM(30, 40, "180mm", "100%", strHtml);
+    //璁剧疆榛樿婊″紶鎵撳嵃
+    LODOP.SET_PRINT_MODE("PRINT_PAGE_PERCENT", "Full-Page");
+    LODOP.PREVIEW();
+};
+
+getCheckValue = function (qualityItemMap, key) {
+    try {
+        return (qualityItemMap[key].value ? qualityItemMap[key].value : "/");
+    } catch (e) {
+        console.log(e);
+        return "/";
+    }
+    return "/";
+};
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/grain/grain-check1.js b/fzzy-igdss-web/src/main/resources/static/grain/grain-check1.js
new file mode 100644
index 0000000..8df0c66
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/grain/grain-check1.js
@@ -0,0 +1,718 @@
+var layer;
+var grainData;// 褰撳墠浠撶伯鎯呮暟鎹�
+var form;
+var table;
+var element;
+var compareData = null;// 瀵规瘮鏁版嵁
+var listGrainData;// 榛樿椤甸潰涓殑绮儏鍒楄〃
+var mapGrainData;// 鎵归噺鎵撳嵃涓殑鎵归噺绮儏淇℃伅
+
+$(function () {
+    layui.use(['layer', 'laydate', 'form', 'table', 'element'], function () {
+        element = layui.element;
+        form = layui.form;
+        layer = layui.layer;
+        var laydate = layui.laydate;
+        table = layui.table;
+
+        // 鏃ユ湡
+        laydate.render({
+            elem: '#checkDateMore',
+            type: 'month',
+            theme: '#7b8e9f',
+            position: 'static',
+            done: function (value, date, endDate) {
+                flushGrain(value);
+            }
+        });
+
+        laydate.render({
+            elem: '#compareCheckDate',
+            type: 'month',
+            theme: '#7b8e9f',
+            done: function (value, date, endDate) {
+                compareStep2(value);
+            }
+        });
+
+        laydate.render({
+            elem: '#printCheckDate',
+            theme: '#7b8e9f'
+        });
+
+        laydate.render({
+            elem: '#printCheckDate2',
+            theme: '#7b8e9f'
+        });
+        form.render();
+
+        // 鐩戝惉浠撳簱閫夋嫨
+        form.on('select(select_depotId)', function (obj) {
+            return changeView();
+        });
+
+        // 鐩戝惉閫夋嫨鎵规
+        form.on('select(select_batchId)', function (obj) {
+            var value = obj.value;
+            if (value == "0") {// 琛ㄧず寮瑰嚭鏇村鎵规
+                showMore();
+            } else {
+                flushGrainByBatchId(value);
+            }
+        });
+
+        // 鐩戝惉鏄剧ず绫诲瀷
+        form.on('switch(filter_switch)', function (obj) {
+            var value = obj.value;
+            var checked = obj.elem.checked;
+            if (checked) {
+                if ("lay" == value) {// 灞�
+                    $("#switch_row").prop("checked", false);
+                    $("#switch_col").prop("checked", false);
+                    lay();
+                }
+                if ("row" == value) {
+                    $("#switch_lay").prop("checked", false);
+                    $("#switch_col").prop("checked", false);
+                    row();
+                }
+                if ("col" == value) {
+                    $("#switch_lay").prop("checked", false);
+                    $("#switch_row").prop("checked", false);
+                    col();
+                }
+                form.render();
+            }
+        });
+
+        form.on('switch(filter_switch2)', function (obj) {
+            var value = obj.value;
+            var checked = obj.elem.checked;
+            console.log(value);
+
+            if (checked) {
+                if ("outer" == value) {
+                    $("#switch_all").prop("checked", false);
+                    $("#switch_inner").prop("checked", false);
+                    display_outside();
+                }
+                if ("all" == value) {
+                    $("#switch_inner").prop("checked", false);
+                    $("#switch_outer").prop("checked", false);
+                    display_all();
+                }
+                if ("inner" == value) {
+                    $("#switch_all").prop("checked", false);
+                    $("#switch_outer").prop("checked", false);
+                    display_inside();
+                }
+                form.render();
+            }
+        });
+
+        // 鐩戝惉瀵规瘮鏁版嵁
+        table.on('radio(filterTable)', function (obj) {
+            compareData = obj.data;
+        });
+
+        //鍒濆鍖栧埛鏂版暟鎹�
+        initData();
+    });
+
+    // 鍒濆鍖栧潗鏍囩郴
+    initGrainChar3d();
+
+});
+
+function initData() {
+    if (depotId) {
+        $("#depotId").val(depotId);
+        flushGrain(null);
+        form.render();
+    }
+}
+
+function changeView() {
+    depotId = $("#depotId").val();
+    window.location.href = "/grain/gateway?depotId=" + depotId;
+    return true;
+}
+
+// 鍗曚粨鎵撳嵃
+function printSingle() {
+    layer.msg("寮�濮嬭皟鐢ㄥ悗鍙版墦鍗版ā鏉库�︹��");
+    toPrintSingle(grainData);
+}
+
+// 鎵归噺鎵撳嵃
+function printBatch() {
+    // 棣栧厛鍘婚櫎涔嬪墠鐨勯�夋嫨
+    $('#batchPrintSelect input').each(function () {
+        var name = $(this).prop("name");
+        if (name == "printCheckDate") {// 璺宠繃
+            return true;
+        }
+        $(this).prop("disabled", false);
+        $(this).prop("checked", false);
+    });
+    form.render();
+
+    //鍒濆鍖栨壒閲忔ā鏉�
+    initModel();
+
+    // 寮瑰嚭閫夋嫨妗�
+    layer.open({
+        type: 1,
+        title: '鎵归噺绮儏鎵撳嵃锛堢孩鑹茶〃绀烘病鏈夌伯鎯呰褰曪紝榛樿涓哄綋澶╋級',
+        area: ['750px', '450px'],
+        shade: 0,
+        content: $('#batchPrintSelect'),
+        btn: ['鍏ㄩ��', '鍙嶉��', '閲嶉��', '鎵ц鎵撳嵃', '鍙栨秷鎵撳嵃'],
+        yes: function () {
+            var name;
+            $('#batchPrintSelect input').each(function () {
+                name = $(this).prop("name");
+                if (name == "printCheckDate" || $(this).prop("disabled")) {
+                    // doNothing
+                } else {
+                    $(this).prop("checked", true);
+                }
+            });
+            form.render();
+        },
+        btn2: function () {
+            var name;
+            $('#batchPrintSelect input').each(function () {
+                name = $(this).prop("name");
+                if (name == "printCheckDate" || $(this).prop("disabled")) {
+                    // doNothing
+                } else {
+                    if ($(this).prop("checked")) {
+                        $(this).prop("checked", false);
+                    } else {
+                        $(this).prop("checked", false);
+                    }
+                }
+            });
+            form.render();
+            return false;
+        },
+        btn3: function () {
+            var name;
+            $('#batchPrintSelect input').each(function () {
+                name = $(this).prop("name");
+                if (name == "printCheckDate" || $(this).prop("disabled")) {
+                    // doNothing
+                } else {
+                    $(this).prop("checked", false);
+                }
+            });
+            form.render();
+            return false;
+        },
+        btn4: function () {
+            printBatchTodo();
+        },
+        btn5: function () {
+            layer.close(0);
+        },
+        closeBtn: 0
+    });
+    // 榛樿璋冪敤鑾峰彇鏁版嵁鏇存柊
+    $("#printCheckDate").prop("value", dateFtt("yyyy-MM-dd", new Date()));
+    getPrintBatchDepot();
+};
+
+// 鑾峰彇鎵归噺鎵撳嵃鐨勪俊鎭�
+function getPrintBatchDepot() {
+    layer.msg("楠岃瘉绮儏妫�娴嬭褰曗�︹��");
+    var checkDate = $("#printCheckDate").val();
+    var checkHour = $("#printCheckHour").val();
+
+    //console.log(checkTime);
+
+    $.ajax({
+        type: "POST",
+        url: "/grain/query-checkDate-map",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify({
+            checkDate: checkDate,
+            checkHour: checkHour
+        }),
+        success: function (result) {
+            if (result.code != "0000") {
+                layer.msg(result.msg);
+                disabledAllSelectDepot();
+            } else {
+                mapGrainData = result.data;
+                updateSelectDepot();
+            }
+        },
+        error: function () {
+            layer.msg("鎵归噺鎵撳嵃鑾峰彇绮儏淇℃伅澶辫触锛�");
+        }
+    });
+};
+
+// 鏍规嵁鏌ヨ鐨勬暟鎹壒閲忔墦鍗伴瑙�
+function printBatchTodo() {
+    layer.msg("寮�濮嬫壒閲忕敓鎴愭墦鍗版ā鐗堚�︹��");
+    var strHtml;
+    var value;
+    var checked;
+    var printGrainData;
+    // 灏嗕粨搴撴暟鎹垪琛ㄨ浆鎹负MAP
+    var mapDepot = {};
+    $.each(listDepot, function (index, data) {
+        mapDepot[data.id] = data;
+    });
+    var LODOP = CLODOP;
+    // 璁剧疆榛樿婊″紶鎵撳嵃
+    LODOP.PRINT_INIT("绮儏鎶ヨ〃");// 鍒濆鍖栧湪寰幆澶�
+    LODOP.SET_PRINT_PAGESIZE(1, 0, 0, "A4");
+    $('#batchPrintSelect input').each(function () {
+        if ($(this).prop("name") == "printCheckDate") {// 璺宠繃
+            return true;
+        }
+        checked = $(this).prop("checked");
+        if (checked) {
+            value = $(this).val();
+            printGrainData = mapGrainData[value];
+            if (!printGrainData) {// 濡傛灉娌℃湁绮儏鏁版嵁璺宠繃鎵ц涓嬩竴涓�
+                return true;
+            }
+            LODOP.NewPage();
+            printGrainData.depotData = mapDepot[value];
+            strHtml = builderModel(printGrainData);
+            LODOP.ADD_PRINT_HTM(30, 40, "180mm", "100%", strHtml);
+        }
+    });
+    layer.msg("寮�濮嬭皟鐢ㄦ墦鍗扮▼搴忛瑙堚�︹��");
+    LODOP.SET_PRINT_MODE("PRINT_PAGE_PERCENT", "Full-Page");
+    LODOP.PREVIEW();
+};
+
+// 璁剧疆鎵归噺鎵撳嵃涓墍鏈変粨搴撲笉鍙�夋嫨
+function disabledAllSelectDepot() {
+    var name;
+    $('#batchPrintSelect input').each(function () {
+        name = $(this).prop("name");
+        if (name == "printCheckDate") {// 璺宠繃
+            return true;
+        }
+        $(this).prop("disabled", true);
+    });
+    form.render();
+};
+
+function updateSelectDepot() {
+    var value, name;
+    $('#batchPrintSelect input').each(function () {
+        value = $(this).val();
+        name = $(this).prop("name");
+        if (name == "printCheckDate") {// 璺宠繃
+            return true;
+        }
+        if (mapGrainData[value]) {
+            $(this).prop("disabled", false);
+        } else {
+            $(this).prop("disabled", true);
+        }
+    });
+    form.render();
+};
+
+// 绮儏瀵规瘮
+function compare() {
+    if (!depotId) {
+        layer.msg("璇峰厛閫夋嫨浠撳簱鈥︹��");
+        return;
+    }
+    var batchId = $("#batchId").val();
+    if (!batchId) {
+        layer.msg("褰撳墠娌℃湁鍙互姣旇緝鐨勬暟鎹�︹��");
+        return;
+    }
+    // 涓轰簡閬垮厤閲嶅姣旇緝鍑虹幇鐨勯棶棰橈紝濡傛灉宸茬粡姣旇緝杩囨暟鎹紝鍒欏湪姣旇緝鍓嶅埛鏂颁笅鏁版嵁
+    if (compareData) {
+        flushGrainByBatchId(batchId);
+    }
+    // 棣栧厛寮瑰嚭灞�
+    layer.open({
+        type: 1,
+        title: '绮儏瀵规瘮閫夋嫨',
+        area: ['330px', '640px'],
+        shade: 0,
+        content: $('#compareSelect'),
+        btn: ['纭瀵规瘮', '鍙栨秷瀵规瘮'],
+        yes: function () {
+            if (compareData) {
+                layer.msg("寮�濮嬫墽琛屾壒娆″姣斺�︹��");
+                compareStep3(grainData, compareData);
+            } else {
+                layer.msg("娌℃湁鑾峰彇鍒板姣旀暟鎹紒锛�");
+            }
+        },
+        btn2: function () {
+            layer.closeAll();
+        },
+        closeBtn: 1
+    });
+
+    $("#compareCheckDate").prop("value", null);
+    compareStep2(null);
+    form.render();
+};
+
+function compareStep2(compareDate) {
+    depotId = $("#depotId").val();
+    if (!depotId) {
+        layer.msg("璇峰厛閫夋嫨浠撳簱锛�");
+        return;
+    }
+    if (!compareDate) {
+        compareDate = $("#compareCheckDate").val();
+    }
+    var data = {
+        depotId: depotId,
+        checkMonth: compareDate,
+        extBatchId: grainData.batchId
+    };
+    $.ajax({
+        type: "POST",
+        url: "/grain/page-list",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            if (result.code != "0000") {
+                layer.msg(result.msg);
+            } else {
+                table.render({
+                    elem: '#tableSelect',
+                    height: 450,
+                    data: result.data,
+                    page: false,
+                    limit: 100,
+                    skin: "nob",
+                    even: true,
+                    size: "sm",
+                    cols: [[{
+                        type: 'radio',
+                        fixed: 'left',
+                        title: '閫夋嫨'
+                    }, {
+                        field: 'receiveDate',
+                        title: '妫�娴嬫椂闂�',
+                        align: 'center',
+                    }]]
+                });
+            }
+        },
+        error: function () {
+            layer.msg("鑾峰彇褰撳墠浠撳簱妫�娴嬭褰曞け璐ワ紝璇烽噸鏂板皾璇曪紒锛�");
+        }
+    });
+};
+
+// 寮�濮嬫壒娆″姣�
+function compareStep3(dataA, dataB) {
+    $.ajax({
+        type: "POST",
+        url: "/grain/data-compare",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify({
+            dataA: dataA,
+            dataB: dataB
+        }),
+        success: function (result) {
+            if (result.code != "0000") {
+                layer.msg(result.msg);
+            } else {
+                // 瑕嗙洊椤甸潰涓殑绮儏鏁版嵁
+                grainData = result.data;
+                // 鏄剧ず閲囬泦鐐逛俊鎭�
+                resetGrainChart3d();
+                // 绮儏淇℃伅璧嬪��
+                renderGrainInfo();
+
+                layer.closeAll();
+            }
+        },
+        error: function () {
+            layer.msg("鎵规瀵规瘮鍑虹幇寮傚父锛岃閲嶆柊閫夋嫨");
+        }
+    });
+};
+
+// 鐐瑰嚮鍒锋柊鎿嶄綔
+function flushGrain(checkMonth) {
+    compareData = null;
+    depotId = $("#depotId").val();
+
+    if (!depotId) {
+        layer.alert("璇峰厛閫夋嫨浠撳簱锛�");
+        return;
+    }
+    var data = {
+        depotId: depotId,
+        checkMonth: checkMonth
+    };
+
+    $.ajax({
+        type: "POST",
+        url: "/grain/query-list-data",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            if (result.code != "0000") {
+                layer.msg(result.msg);
+                clearGrainChart3d();
+            }
+            listGrainData = result.data;
+            if (!listGrainData) {
+                return;
+            }
+            grainData = listGrainData[0];
+            // 鏄剧ず閲囬泦鐐逛俊鎭�
+            resetGrainChart3d();
+            // 绮儏淇℃伅璧嬪��
+            renderGrainInfo();
+            // 鍦ㄦ壒娆¢�夋嫨涓坊鍔犱笅鎷夋暟鎹�
+            resetSelectBatchId();
+            // 璋冪敤鍏ㄩ儴鍏抽棴
+            layer.closeAll();
+            layer.msg("鏇存柊鎴愬姛鈥︹��");
+        },
+        error: function () {
+            layer.msg("鏍规嵁褰撳墠鏉′欢鑾峰彇绮儏鏁版嵁娓叉煋鍥炬爣澶辫触锛侊紒");
+        }
+    });
+};
+
+// 濉啓绮儏淇℃伅
+function renderGrainInfo() {
+    // 閰嶇疆浠撳簱鍗$墖淇℃伅
+    var depotData = grainData.depotData;
+    $("#depotTypeName").text(depotData.depotTypeName);
+    $("#storeDate").text(depotData.storeDate);
+    $("#storageReal").text(depotData.storageReal);
+    $("#foodVarietyName").text(depotData.foodVarietyName);
+    $("#perWet").text(depotData.perWet);
+    $("#depotStatus").text(DEPOT_STATUS_MSG(depotData.depotStatus));
+    $("#foodLocation").text(depotData.foodLocation);
+    $("#perImpurity").text(depotData.perImpurity);
+    $("#storeKeeperName").text(depotData.storeKeeperName);
+    $("#storeKeeperLevel").text(depotData.storeKeeperLevel);
+    $("#storeKeeperPhone").text(depotData.storeKeeperPhone);
+
+    // 绮儏妫�娴嬩俊鎭祴鍊�
+    $("#checkUser").text(grainData.checkUser);
+    $("#tempMax").text(grainData.tempMax);
+    $("#tempAve").text(grainData.tempAve);
+    $("#tempMin").text(grainData.tempMin);
+
+
+    //console.log("------------"+grainData.humidityIn);
+    //濡傛灉婀垮害==0琛ㄧず娌℃湁鑾峰彇鍒�
+    if(grainData.humidityIn != 0){
+        $("#tempIn").text(grainData.tempIn <= -100.0 ? "--" : grainData.tempIn);
+        $("#humidityIn").text(
+            grainData.humidityIn <= -100.0 ? "--" : grainData.humidityIn);
+    }
+    if(grainData.humidityOut != 0){
+        $("#tempOut").text(grainData.tempOut <= -100.0 ? "--" : grainData.tempOut);
+        $("#humidityOut").text(
+            grainData.humidityOut <= -100.0 ? "--" : grainData.humidityOut);
+    }
+};
+
+// 鏍规嵁鎵规鏇存柊鐨勫�艰皟鏁�
+function flushGrainByBatchId(batchId) {
+    var temp;
+    $.each(listGrainData, function (index, item) {
+        if (item.batchId == batchId) {
+            temp = item;
+            return false;
+        }
+    });
+    if (temp) {
+        grainData = temp;
+        // 鏄剧ず閲囬泦鐐逛俊鎭�
+        resetGrainChart3d();
+        // 绮儏淇℃伅璧嬪��
+        renderGrainInfo();
+        layer.msg("鏇存柊鎴愬姛鈥︹��");
+    }
+};
+
+// 閲嶇疆鎵规涓嬫媺妗�
+function resetSelectBatchId() {
+    // 棣栧厛娓呯┖鍘熸潵鐨勫��
+    $("#batchId").empty();
+    // 鏈笅鎷夋璧嬪��
+    $.each(listGrainData, function (index, item) {
+        $('#batchId').append(new Option(item.receiveDate, item.batchId));// 涓嬫媺鑿滃崟閲屾坊鍔犲厓绱�
+    });
+    $('#batchId').append(new Option("閫夋嫨鏃堕棿鈥︹��", "0"));
+    form.render();
+};
+
+// 鏇村鎵规閫夋嫨
+function showMore() {
+    layer.open({
+        type: 1,
+        title: '閫夋嫨妫�娴嬫椂闂�',
+        area: ['300px', '400px'],
+        shade: 0,
+        content: $('#dialogMoreSelect'),
+        btn: 0,
+        closeBtn: 1
+    });
+};
+
+// 鍗曚釜绮儏妫�娴�
+function checkGrain() {
+    if (!depotId) {
+        layer.msg("璇峰厛閫夋嫨浠撳簱锛�");
+        return;
+    }
+    var data = {
+        depotId: depotId
+    };
+    $.ajax({
+        type: "POST",
+        url: "/grain/check-single",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            showOrderProgress();
+            if (result.code != "ORDER_SUCCESS") {
+                layer.msg(result.msg);
+            } else {
+                layer.msg("鍛戒护宸茬粡鎴愬姛鍙戦�侊紝寰呯粓绔搷搴斺�︹��");
+            }
+        },
+        error: function () {
+            layer.alert("绮儏妫�娴嬪嚭鐜板紓甯革紝鎵ц澶辫触锛�");
+        }
+    });
+};
+
+// 鎵归噺绮儏閲囬泦
+function checkGrainBatch() {
+    $('#batchCheckSelect input').each(function () {
+        $(this).prop("checked", false);
+    });
+    form.render();
+    // 寮瑰嚭閫夋嫨妗�
+    layer.open({
+        type: 1,
+        title: '鎵归噺妫�娴嬮�夋嫨浠撳簱',
+        area: ['730px', '450px'],
+        shade: 0,
+        content: $('#batchCheckSelect'),
+        btn: ['鍏ㄩ��', '鍙嶉��', '閲嶉��', '纭畾妫�娴�', '鍙栨秷妫�娴�'],
+        yes: function () {
+            $('#batchCheckSelect input').each(function () {
+                $(this).prop("checked", true);
+            });
+            form.render();
+        },
+        btn2: function () {
+            $('#batchCheckSelect input').each(function () {
+                if ($(this).prop("checked")) {
+                    $(this).prop("checked", false);
+                } else {
+                    $(this).prop("checked", true);
+                }
+            });
+            form.render();
+            return false;
+        },
+        btn3: function () {
+            $('#batchCheckSelect input').each(function () {
+                $(this).prop("checked", false);
+            });
+            form.render();
+            return false;
+        },
+        btn4: function () {
+            showOrderProgress();
+            return checkBatchTodo();
+        },
+        btn5: function () {
+            layer.close(0);
+        },
+        closeBtn: 0
+    });
+};
+
+/**
+ * 寮�濮嬫墽琛屾壒閲忔娴�
+ */
+function checkBatchTodo() {
+    var depotIds = "";
+    $('#batchCheckSelect input').each(function () {
+        if ($(this).prop("checked")) {
+            depotIds += $(this).val() + ",";
+        }
+    });
+
+    if (depotIds == "") {
+        layer.msg("璇峰厛閫夋嫨闇�瑕佹娴嬬殑浠撳簱鈥︹��");
+        return false;
+    }
+    layer.msg("寮�濮嬫墽琛屾壒閲忔娴嬧�︹��");
+    // 璋冪敤鍚庡彴鎵归噺妫�娴�
+    var data = {
+        depotIds: depotIds
+    };
+    $.ajax({
+        type: "POST",
+        url: "/grain/check-batch",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            if (result.code != "ORDER_SUCCESS") {
+                layer.alert("鎵ц澶辫触锛�" + result.msg);
+                return false;
+            } else {
+                layer.msg("鍛戒护宸茬粡鎴愬姛鍙戦�侊紝寰呯粓绔搷搴斺�︹��");
+                return true;
+            }
+        },
+        error: function () {
+            layer.alert("绮儏妫�娴嬪嚭鐜板紓甯革紝鎵ц澶辫触锛�");
+            return false;
+        }
+    });
+    return true;
+};
+
+/**
+ * 寮瑰嚭鍛戒护鎵ц杩涘害妗�
+ */
+var iframeOrderIndex = 0;
+
+function showOrderProgress() {
+    var domId = "#layui-layer-iframe" + iframeOrderIndex;
+    if ($(domId).length == 0) {
+        iframeOrderIndex = layer.open({
+            type: 2,
+            title: "鎵ц杩涘害鍜岃褰�",
+            icon: 1,
+            shadeClose: true,
+            shade: 0.3,
+            closeBtn: 1,
+            anim: 2,
+            area: ['1000px', '600px'],
+            content: '/grain/order-list?depotId=' + depotId + "&t=" + Math.random()
+        });
+    }
+}
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/grain/grain-export.js b/fzzy-igdss-web/src/main/resources/static/grain/grain-export.js
new file mode 100644
index 0000000..bd270ee
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/grain/grain-export.js
@@ -0,0 +1,130 @@
+// 绮儏鎵归噺瀵煎嚭EXCEL
+function exportBatch() {
+    // 寮瑰嚭閫夋嫨妗�
+    layer.open({
+        type: 1,
+        title: '鎵归噺瀵煎嚭鎶ヨ〃',
+        area: ['730px', '450px'],
+        shade: 0,
+        content: $('#batchExportSelect'),
+        btn: ['鍏ㄩ��', '鍙嶉��', '閲嶉��', '鎵ц瀵煎嚭', '鍙栨秷瀵煎嚭'],
+        yes: function () {
+            var name;
+            $('#batchExportSelect input').each(function () {
+                name = $(this).prop("name");
+                if (name == "printCheckDate2" || $(this).prop("disabled")) {
+
+                } else {
+                    $(this).prop("checked", true);
+                }
+            });
+            form.render();
+        },
+        btn2: function () {
+            var name;
+            $('#batchExportSelect input').each(function () {
+                name = $(this).prop("name");
+                if (name == "printCheckDate2" || $(this).prop("disabled")) {
+                    // doNothing
+                } else {
+                    if ($(this).prop("checked")) {
+                        $(this).prop("checked", false);
+                    } else {
+                        $(this).prop("checked", false);
+                    }
+                }
+            });
+            form.render();
+            return false;
+        },
+        btn3: function () {
+            var name;
+            $('#batchExportSelect input').each(function () {
+                name = $(this).prop("name");
+                if (name == "printCheckDate2" || $(this).prop("disabled")) {
+                    // doNothing
+                } else {
+                    $(this).prop("checked", false);
+                }
+            });
+            form.render();
+            return false;
+        },
+        btn4: function () {
+            exportBatchTodo();
+        },
+        btn5: function () {
+            layer.close(0);
+        },
+        closeBtn: 0
+    });
+
+    // 榛樿璋冪敤鑾峰彇鏁版嵁鏇存柊
+    if (grainData) {
+        $("#printCheckDate2").prop("value", grainData.receiveDate.substr(0, 10));
+    } else {
+        $("#printCheckDate2").prop("value", dateFtt("yyyy-MM-dd", new Date()));
+    }
+};
+
+function exportBatchTodo() {
+    var depotIds = "";
+    $('#batchExportSelect input').each(function () {
+        if ($(this).prop("checked")) {
+            depotIds += $(this).val() + ",";
+        }
+    });
+
+    if (depotIds == "") {
+        layer.alert("璇烽�夋嫨闇�瑕佸鍑虹殑浠撳簱鈥︹��");
+        return false;
+    }
+
+    layer.load();
+    // 璋冪敤鍚庡彴鎵归噺妫�娴�
+    var checkDate = $("#printCheckDate2").val();
+    var data = {
+        companyId: companyId,
+        deptId: deptId,
+        depotIds: depotIds,
+        checkDate: checkDate
+    };
+
+    $.ajax({
+        type: "POST",
+        url: "/grain/export-batch",
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            layer.closeAll('loading');
+            if (result.code != "ORDER_SUCCESS") {
+                layer.alert("瀵煎嚭妯$増澶辫触锛�" + result.msg);
+                return false;
+            } else {
+                layer.closeAll('loading');
+                downLoadExcel(result.msg);
+                return true;
+            }
+        },
+        error: function () {
+            layer.closeAll('loading');
+            layer.alert("绮儏瀵煎嚭EXCEl鎵ц鍑洪敊锛岃浠庢柊鎵ц");
+            return false;
+        }
+    });
+    return true;
+}
+
+/**
+ * 鍒涘缓涓�涓狝鏍囩鎵ц涓嬭浇
+ * @param fileName
+ */
+function downLoadExcel(fileName) {
+    var url = "../../basic/file/download-temp?companyId=" + companyId + "&fileName=" + fileName;
+    var link = document.createElement('a');
+    link.style.display = 'none';
+    link.href = url;
+    document.body.appendChild(link)
+    link.click();
+}
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/grain/grain-style.css b/fzzy-igdss-web/src/main/resources/static/grain/grain-style.css
new file mode 100644
index 0000000..c61e677
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/grain/grain-style.css
@@ -0,0 +1,618 @@
+@charset "utf-8";
+
+/*-----------------
+  Author:xq
+  update:2019
+ -------------------*/
+body {
+	font-family: "寰蒋闆呴粦", Arial, sans-serif;
+	font-size: 14px;
+	background: #f3f5f8;
+}
+
+i,em{
+	font-style: normal;
+}
+
+
+.radius-3{
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	-ms-border-radius: 3px;
+	-o-border-radius: 3px;
+	border-radius: 3px;
+}
+
+.radius-4{
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	-ms-border-radius: 4px;
+	-o-border-radius: 4px;
+	border-radius: 4px;
+}
+
+.radius-6,
+.lq-rMenu li{
+	-webkit-border-radius: 6px;
+	-moz-border-radius: 6px;
+	-ms-border-radius: 6px;
+	-o-border-radius: 6px;
+	border-radius: 6px;
+}
+
+.box-shadow{
+	-webkit-box-shadow: 0px 0px 9px 3px rgba(230,230,230,0.6);
+	-moz-box-shadow: 0px 0px 9px 3px rgba(230,230,230,0.6);
+	box-shadow: 0px 0px 9px 3px rgba(230,230,230,0.6);
+}
+
+
+.lq-userbox{
+	min-height: 85px;
+	padding: 6px 6px;
+}
+
+.lq-user{
+	text-align: center;
+	width: 100%;
+}
+
+.lq-user img{
+	width: 85px;
+	/*height: 85px;*/
+	-webkit-border-radius: 50%;
+	border-radius: 50%;
+}
+
+.lq-user p{
+	line-height: 30px;
+	font-size: 16px;
+	color: #000;
+	font-weight: bold;
+	margin-top: 5px;
+}
+
+.lq-userItem{
+	height: 34px;
+	background: #eff4f6;
+	overflow: hidden;
+	margin-top: 12px;
+}
+
+.lq-userItem dt,
+.lq-userItem dd{
+	float: left;
+	height: 34px;
+	line-height: 34px;
+
+}
+
+.lq-userItem dt{
+	width: 40%;
+	text-align: center;
+	color: #6c7781;
+	font-size: 16px;
+	font-style: italic;
+}
+
+.lq-userItem dd{
+	font-size: 16px;
+	color: #000;
+}
+
+.lq-userItem dd span{
+	font-family: arial;
+}
+/*lqjc*/
+
+.l-container{
+	width: 100%;
+	/*max-width: 1680px;*/
+	min-width: 1340px;
+	margin-left: auto;
+	margin-right: auto;
+}
+
+.l-main{
+	margin: 10px;
+	position: relative;
+	padding-right: 110px;
+	overflow: hidden;
+}
+
+.l-icon{
+	width: 24px;
+	height: 24px;
+	display: inline-block;
+	position: relative;
+}
+
+.l-icon img{
+	width: 100%;
+	height: 100%;
+	vertical-align: top;
+}
+
+.fl {
+	float: left;
+}
+.fr {
+	float: right;
+}
+
+.lq-left{
+	/*width: 20%;*/
+	min-width: 260px;
+}
+
+
+.lq-left1{
+	padding: 6% 5%;
+	background: #7b8e9f;
+}
+
+.lq-left1-from{
+	margin-bottom: 20px;
+}
+
+.lq-left1 .lq-left1-from:last-child{
+	margin-bottom: 0;
+}
+
+.lq-left1 .lq-left1-from .layui-form-label{
+	color: #fff;
+	padding: 9px 0;
+	text-align: left;
+	font-size: 16px;
+}
+
+.lq-left1 .lq-left1-from .layui-input-block{
+	margin-left: 80px;
+}
+
+.lq-left1 .layui-form-select .layui-edge{
+	border-top-color: #666;
+}
+
+.lq-left1 .layui-input-block .layui-input{
+	font-size: 16px;
+	color: #000;
+}
+
+.lq-left1 .layui-form-select dl dd.layui-this{
+	background: #7b8e9f;
+}
+.lq-left2{
+	background: #fff;
+	overflow: hidden;
+	/*margin-top: 20px;*/
+	margin-top: 10px;
+}
+.lq-left2-list{
+	width: 100%;
+}
+
+.lq-left2-list li{
+	height: 20px;
+	line-height: 20px;
+	overflow: hidden;
+	position: relative;
+	padding: 3.5% 6%;
+}
+
+.lq-left2-list li h3{
+	float: left;
+	color: #6c7781;
+	font-size: 16px;
+	font-style: italic;
+}
+.lq-left2-list li>em{
+	float: right;
+	color: #000;
+	font-size: 16px;
+}
+
+.lq-left2-list li h3 span{
+	background: #6c7781;
+	width: 4px;
+	height: 4px;
+	margin-right: 10px;
+	position: relative;
+	top: -2px;
+}
+
+.lq-left2-list li:nth-child(2n){
+	background: #f8f9fa;
+}
+
+.lq-center{
+	width: 77%;
+	position: relative;
+	padding-bottom: 50px;
+	overflow: hidden;
+}
+
+.lq-cTop{
+	margin-top: 10px;
+}
+
+.lq-cTop-1,
+.lq-cTop-2,
+.lq-cTop-3,
+.lq-cTop-3-2,
+.lq-cTop-4-2,
+.lq-cTop-4{
+	padding: 10px 0;
+	overflow: hidden;
+	height: 80px;
+	text-align: center;
+	color: #fff;
+}
+
+.lq-cTop-1{
+	background: url(../img/web/grain/lq-c-bg1.png) no-repeat;
+	background-size: 100% 100%;
+	width: 29%;
+}
+
+.lq-cTop-2{
+	background: url(../img/web/grain/lq-c-bg2.png) no-repeat;
+	background-size: 100% 100%;
+	width: 29%;
+}
+
+.lq-cTop-3{
+	background: url(../img/web/grain/lq-c-bg3.png) no-repeat;
+	background-size: 100% 100%;
+	width: 19.5%;
+}
+
+.lq-cTop-3-2{
+	background: url(../img/web/grain/lq-c-bg3.png) no-repeat;
+	background-size: 100% 100%;
+}
+
+.lq-cTop-4{
+	background: url(../img/web/grain/lq-c-bg4.png) no-repeat;
+	background-size: 100% 100%;
+	width: 19.5%;
+}
+
+.lq-cTop-4-2{
+	background: url(../img/web/grain/lq-c-bg4.png) no-repeat;
+	background-size: 100% 100%;
+}
+
+.ml4{
+	margin-left: 1%;
+}
+
+.lq-cTop-item{
+	background: url(../img/web/grain/lq-li-bg.png) right center no-repeat;
+}
+
+.lq-cTop-item:last-child{
+	background: none;
+}
+
+.lq-cTop-item p{
+	height: 40px;
+	line-height: 40px;
+	font-size: 16px;
+	margin-top: 5px;
+	overflow: hidden;
+}
+
+.lq-cTop-item h4{
+	font-size: 14px;
+	line-height: 20px;
+	margin-top: 5px;
+	height: 25px;
+	overflow: hidden;
+}
+
+.lq-cTop-item p span{
+	font-size: 28px;
+}
+
+.lq-wendu{
+	width: 90px;
+	height: 200px;
+	position: absolute;
+	bottom: 0;
+	z-index: 99;
+	left: 0;
+}
+
+.lq-wendu-color,
+.lq-wendu-color img{
+	width: 10px;
+	height: 200px;
+}
+
+.lq-wendu-num{
+	width: 75px;
+}
+
+.lq-wendu-num p{
+	line-height: 20px;
+	color: #000;
+	font-size: 14px;
+	margin-bottom: 70px;
+}
+
+.lq-cPic-box{
+	width: 80%;
+
+	margin: 3% auto 0 auto;
+	text-align: center;
+}
+
+.lq-cPic{
+	width: 100%;
+	margin: 0 auto;
+}
+
+.lq-right{
+	width: 90px;
+	position: absolute;
+	right: 0;
+	top: 0;
+	z-index: 99;
+	height: 100%;
+}
+
+.lq-r-fx{
+	width: 80px;
+	margin-left: 10px;
+	margin-top: 25px;
+	height: 80px;
+	background: url(../img/web/grain/img-dnxb.png) center no-repeat;
+	overflow: hidden;
+	position: relative;
+}
+
+.lq-r-fx p{
+	line-height: 15px;
+	font-size: 12px;
+	height: 15px;
+	overflow: hidden;
+	color: #000;
+	text-align: center;
+	margin-bottom: 17px;
+	width: 100%;
+}
+
+.lq-rMenu{
+	position: absolute;
+	bottom: 0;
+	width: 90px;
+	z-index: 99;
+}
+.lq-rMenu li{
+	width: 90px;
+	height: 90px;
+	margin-top: 10px;
+	text-align: center;
+	background: #fff;
+}
+.lq-rMenu li a{
+	display: block;
+	width: 100%;
+	height: 100%;
+}
+.lq-rMenu li a span{
+	width: 48px;
+	height: 48px;
+	margin-top: 5px;
+	
+}
+
+.lq-rMenu li a p{
+	line-height: 20px;
+	color: #FFF;
+	font-size: 14px;
+	height: 20px;
+	overflow: hidden;
+	font-weight: bold;
+}
+
+.lq-rMenu li .lq-rMenu-icon1{
+ 		background: url(../img/web/grain/lq-r-icon1.png);
+}
+
+.lq-rMenu li .lq-rMenu-icon2{
+ 		background: url(../img/web/grain/lq-r-icon2.png);
+}
+.lq-rMenu li .lq-rMenu-icon3{
+ 		background: url(../img/web/grain/lq-r-icon3.png);
+}
+.lq-rMenu li .lq-rMenu-icon4{
+ 		background: url(../img/web/grain/lq-r-icon4.png);
+}
+.lq-rMenu li .lq-rMenu-icon5{
+ 		background: url(../img/web/grain/lq-r-icon5.png);
+}
+
+.lq-rMenu li .lq-rMenu-icon6{
+	background: url(../img/web/grain/lq-r-icon6.png);
+}
+
+.lq-a1{
+	background: url(../img/web/grain/lq-c-bg1.png) no-repeat;
+	background-size: 100% 100%;
+	border-radius: 6px;
+}
+
+.lq-a2{
+	background: url(../img/web/grain/lq-c-bg2.png) no-repeat;
+	background-size: 100% 100%;
+	border-radius: 6px;
+}
+
+.lq-a3{
+	background: url(../img/web/grain/lq-c-bg3.png) no-repeat;
+	background-size: 100% 100%;
+	border-radius: 6px;
+}
+
+.lq-a4{
+	background: url(../img/web/grain/lq-c-bg4.png) no-repeat;
+	background-size: 100% 100%;
+	border-radius: 6px;
+}
+.lq-a5{
+	background: url(../img/web/grain/lq-c-bg5.png) no-repeat;
+	background-size: 100% 100%;
+	border-radius: 6px;
+}
+
+.lq-a6{
+	background: url(../img/web/grain/lq-c-bg6.png) no-repeat;
+	background-size: 100% 100%;
+	border-radius: 6px;
+}
+
+.lq-rMenu li:hover,
+.lq-rMenu li.active{
+	background: #53adce;
+}
+
+
+.lq-rMenu li:hover a p,
+.lq-rMenu li.active a p{
+	 color: #fff;
+}
+
+.lq-rMenu li:hover .lq-rMenu-icon1,
+.lq-rMenu li.active .lq-rMenu-icon1{
+ 		background: url(../img/web/grain/lq-r-icon1-h.png);
+}
+
+.lq-rMenu li:hover .lq-rMenu-icon2,
+.lq-rMenu li.active .lq-rMenu-icon2{
+ 		background: url(../img/web/grain/lq-r-icon2-h.png);
+}
+.lq-rMenu li:hover .lq-rMenu-icon3,
+.lq-rMenu li.active .lq-rMenu-icon3{
+ 		background: url(../img/web/grain/lq-r-icon3-h.png);
+}
+.lq-rMenu li:hover .lq-rMenu-icon4,
+.lq-rMenu li.active .lq-rMenu-icon4{
+ 		background: url(../img/web/grain/lq-r-icon4-h.png);
+}
+.lq-rMenu li:hover .lq-rMenu-icon5,
+.lq-rMenu li.active .lq-rMenu-icon5{
+ 		background: url(../img/web/grain/lq-r-icon5-h.png);
+}
+
+.lq-rMenu li:hover .lq-rMenu-icon6,
+.lq-rMenu li.active .lq-rMenu-icon6{
+	background: url(../img/web/grain/lq-r-icon6-h.png);
+}
+
+.lq-cLow{
+	background: #fff;
+	height: 30px;
+	padding: 8px 15px;
+	overflow: hidden;
+	width: 740px;
+	left: 140px;
+	bottom: 0px;
+	position: absolute;
+}
+
+.lq-cLow-left{
+	line-height: 24px;
+}
+
+.top5{
+	margin-top: 5px;
+}
+
+.lq-cLow-1{
+	width: 90px;
+	color: #000;
+	font-size: 14px;
+	border-right: 1px solid #eceef0;
+}
+
+.lq-cLow-1 span{
+	color: #37bd34;
+}
+
+.lq-cLow-2{
+	margin-left: 20px;
+}
+
+
+.lq-cLow-left .layui-form-item{
+	margin-bottom: 0;
+	clear: initial;
+}
+
+.lq-cLow-left .layui-form-label{
+	padding: 2px 0;
+	text-align: left;
+	width: auto;
+}
+
+.lq-cLow-left .layui-input-block{
+	min-height: 24px;
+	margin-left: 5px;
+	float: left;
+}
+
+
+.lq-cLow-left .layui-form-switch{
+	margin-top: 0;
+}
+
+.lq-cLow-left .layui-form-switch{
+	padding: 0;
+}
+
+.lq-cLow-left .layui-form-onswitch {
+    border-color: #53adce;
+    background-color: #53adce;
+}
+
+
+.lq-cLow-right .layui-btn{
+	height: 30px;
+	line-height: 30px;
+	/*color: #324251;*/
+	font-size: 14px;
+	/*padding: 0 8px;*/
+	/*background-color: #53adce;*/
+}
+
+.lq-cLow-right .layui-btn:hover{
+	border-color: #7b8e9f;
+	background: #7b8e9f;
+	color: #fff;
+}
+
+
+
+@media all and (max-width: 1650px) {
+	.lq-cPic-box {
+    margin: 5% auto 0 auto;
+  }
+	.lq-center{
+		padding-bottom: 80px;
+		
+	}
+	.lq-left2-list li {
+    padding: 3% 6%;
+	}
+	
+	.lq-cTop-item p span{
+		font-size: 24px;
+	}
+}
+
+
+
+
+
diff --git a/fzzy-igdss-web/src/main/resources/static/grain/grainPoint1.js b/fzzy-igdss-web/src/main/resources/static/grain/grainPoint1.js
new file mode 100644
index 0000000..2ec2d25
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/grain/grainPoint1.js
@@ -0,0 +1,1348 @@
+/**瀹氫箟鍙橀噺**/
+var listPoints = [];
+var listLays = [];
+var listRows = [];
+/**鍒�**/
+var cols = 9;
+/**灞�**/
+var lays = 4;
+/**琛�**/
+var rows = 5;
+
+var oneWidth;
+var oneHeight;
+//鐭╁舰楂�
+var back_height;
+//鐭╁舰闀�
+var back_width;
+//鏈�澶у
+var rect_max_width;
+var width;
+var height;
+var x;
+var y;
+var display_mode = "all";
+
+var edge_distance = 0;//璁剧疆杈硅窛
+
+var blockWidth = 30;//鑹插潡瀹藉害
+var blockHeight = 15;//鑹插潡楂樺害
+var curType = "z";//鏄剧ず绫诲瀷
+var curVal = 1; //鏄剧ず绫诲瀷鐨勫垪灞傝
+var shift;
+var out_window_top;
+var out_window_left;
+var out_window_width;
+
+//鍒濆鍖栧弬鏁帮紝濡傛灉琛屾暟澶т簬12鍒楋紝闅愯棌宸︿晶鍗$墖淇℃伅锛岃皟鏁村尯鍩熷搴�
+function initCanvasParam() {
+    if (cols > 12) {
+        $("#lq-left2").css("display", "none");
+        $("#lq-center").css("width", "100%");
+        $("#lq-center").css("overflow-x", "auto");
+        var wWidth = window.innerWidth;
+        var wHeight = window.innerHeight;
+        $("#lq-center").css("height", wHeight - 180);
+        if (wWidth < 1600) {
+            $("#canvas").attr("width", 1600);
+        } else {
+            $("#canvas").attr("width", wWidth - 100);
+        }
+    } else {
+        $("#lq-left2").css("display", "block");
+        $("#lq-center").css("width", "80%");
+        $("#canvas").attr("width", "1200");
+    }
+
+    oneWidth = 9 * blockWidth * getRatio();//涓�涓垎鍓插揩鐨勫搴�
+    oneHeight = 6 * blockHeight * getRatio();//涓�涓垎鍓插揩鐨勯珮搴�
+
+    back_height = oneHeight * 2.1 * (2 - rows / 30);
+    back_width = 3 * blockWidth * cols * (2 - cols / 30) / 2;
+    rect_max_width = back_width + 0.5 * oneWidth;
+    width = oneWidth * 4;
+    height = oneHeight * 5;
+    x = back_width / 2 - rect_max_width / 2;
+    y = back_width / 2 - oneHeight * 2.8;
+
+    var canvasParent = $("#canvas_parent");
+    out_window_top = canvasParent.offset().top;
+    out_window_left = canvasParent.offset().left;
+    out_window_width = canvasParent.width();
+};
+
+initCanvasParam();
+
+//鑹插潡棰滆壊甯搁噺
+var color = null;
+var R = 0;
+var G = 0;
+var B = 0;
+
+//琛屻�佸垪銆佸眰瑕佹樉绀虹偣鐨勯泦鍚�
+var x_points = [];
+var y_points = [];
+var z_points = [];
+
+//浜嬩欢(鏄剧ず鏂瑰紡鍒囨崲銆佸脊鍑虹偣鐨勪俊鎭�)鍒ゅ畾鍖哄煙瀵硅薄鐨勯泦鍚�
+var arr = [];
+
+//璁剧疆瀹氭椂鍣�
+var timer;
+var t = -2;
+
+function sleep() {
+    if (timer) {
+        clearInterval(timer);
+    }
+    t++;
+    if (t >= 0) {
+        flash();
+    }
+    timer = setTimeout("sleep()", 400);
+}
+
+//瀹氭椂瑙﹀彂鍑芥暟--鍒囨崲鏋佸�肩偣棰滆壊
+function flash() {
+    var canvas = document.getElementById('canvas');
+    var ctx = canvas.getContext('2d');
+    canvas.height = canvas.height;
+    ctx.strokeStyle = "black";
+    ctx.lineWidth = 1;
+    arr = [];
+    x_points = [];
+    y_points = [];
+    z_points = [];
+
+    //娓呯┖鍥惧舰鐢诲竷
+    canvas.height = canvas.height;
+    //閲嶆柊缁樺埗鍥惧舰鐢诲竷
+
+    createBack(ctx);
+    createLeft(ctx);
+    createBottom(ctx, back_height);
+
+    gainData(listPoints, curType, curVal);
+
+    split(ctx);
+
+    entityBlock(ctx, curType, curVal);
+
+    title(ctx);
+    border(ctx)
+}
+
+//缁樺埗涓荤▼搴�
+function draw() {
+    var canvas = document.getElementById('canvas');
+    var ctx = canvas.getContext('2d');
+
+    shift = out_window_left;
+    if ((out_window_width - canvas.width) > 0) {
+        shift = out_window_left + (out_window_width - canvas.width) / 2;
+    }
+    edge_distance = (canvas.width - (oneWidth / 2 + back_width + 78)) / 2 + 35;//璁剧疆杈硅窛
+
+    ctx.strokeStyle = "black";
+    ctx.lineWidth = 1;
+
+    createBack(ctx);
+    createLeft(ctx);
+    createBottom(ctx, back_height);
+    gainData(listPoints, curType, curVal);
+    split(ctx);
+    entityBlock(ctx, curType, curVal);
+
+    title(ctx);
+    showIndex(canvas, ctx);
+    border(ctx);
+
+};
+
+//缁樺埗鐭╁舰澶栬竟妗�
+function border(ctx) {
+    ctx.beginPath();
+    ctx.lineWidth = 0.5;
+    ctx.strokeStyle = 'black';
+    ctx.moveTo(oneWidth / 2 + back_width + edge_distance, 0 * oneHeight);
+    ctx.lineTo(back_width + edge_distance, 2 * oneHeight);
+    ctx.lineTo(edge_distance, 2 * oneHeight);
+    ctx.moveTo(back_width + edge_distance, 2 * oneHeight + 0.5 * back_height);
+    ctx.lineTo(back_width + edge_distance, 2 * oneHeight);
+    ctx.stroke();
+    ctx.closePath();
+}
+
+//鍒堕�犺櫄褰�
+function split(context) {
+    //璁剧疆鍒楀垏鍒嗚櫄褰�
+    for (i = 0; i <= cols; i++) {
+        var start_x = back_width / cols * i + edge_distance;
+        var start_y = 2 * oneHeight;
+        //璁剧疆閫忔槑搴�
+        context.fillStyle = "rgba(255,255,255,0.1)";
+        context.beginPath();
+        context.moveTo(start_x, start_y);
+        context.lineTo(start_x, start_y + 0.5 * back_height);
+        context.lineTo(start_x + oneWidth / 2, 0.5 * back_height);
+        context.lineTo(start_x + oneWidth / 2, 0);
+        context.lineTo(start_x, start_y);
+        context.fill();
+        context.closePath();
+    }
+
+    //璁剧疆琛屽垏鍒嗚櫄褰�
+    for (i = 0; i <= rows; i++) {
+
+        var start_x = oneWidth / 2 / rows * i + edge_distance;
+        var start_y = (2 * oneHeight) / rows * (rows - i);
+        //璁剧疆閫忔槑搴�
+        context.fillStyle = "rgba(255,255,255,0.1)";
+        // context.fillStyle =  "rgba(150,150,150,1)";
+        context.beginPath();
+        context.moveTo(start_x, start_y);
+        context.lineTo(start_x + back_width, start_y);
+        context.lineTo(start_x + back_width, start_y + 0.5 * back_height);
+        context.lineTo(start_x, start_y + 0.5 * back_height);
+        context.lineTo(start_x, start_y);
+        context.fill();
+        context.closePath();
+    }
+
+    //璁剧疆灞傚垏鍒嗚櫄褰�
+    for (i = 0; i <= lays; i++) {
+        var start_x = oneWidth / 2 + edge_distance;
+        var y = (lays - i) * 0.5 * back_height / lays;
+        //璁剧疆閫忔槑搴�
+        context.fillStyle = "rgba(255,255,255,0.2)";
+        context.beginPath();
+        context.moveTo(start_x, y);
+        context.lineTo(start_x + back_width, y);
+        context.lineTo(back_width + edge_distance, 2 * oneHeight + y);
+        context.lineTo(edge_distance, 2 * oneHeight + y);
+        context.lineTo(start_x, y);
+        context.fill();
+        context.closePath();
+    }
+
+}
+
+function textbox(context, x, y, val, obj) {
+    if (val === null || val == -100 || val == -101) {
+        //璁剧疆绌哄�兼椂濉厖棰滆壊
+        context.fillStyle = "rgba(125,146,159,1)";
+    } else {
+        //璁剧疆鏈夊�兼椂濉厖棰滆壊
+        context.fillStyle = "rgba(50,66,81,1)";
+        //灏嗙偣鍑讳簨浠惰Е鍙戝尯鍩熷璞″啓鍏rr闆嗗悎
+        // alert(pointX)
+        arr.push({
+            'x': x + shift - 10,
+            'y': y + out_window_top - 10,
+            'width': 40,
+            'height': 25,
+            'type': 'val',
+            'pointX': obj['x'] + 1,
+            'pointY': obj['y'] + 1,
+            'pointZ': obj['z'] + 1,
+            'val': val,
+        })
+    }
+    context.beginPath();
+    context.lineWidth = 1;
+    context.moveTo(x, y + 12);
+    context.lineTo(x + 5, y + 7);
+    context.arcTo(x + 15, y + 7, x + 15, y + 2, 5);
+    context.lineTo(x + 15, y - 3);
+    context.arcTo(x + 15, y - 8, x + 5, y - 8, 5);
+    context.lineTo(x - 10, y - 8);
+    context.arcTo(x - 15, y - 8, x - 15, y - 3, 5);
+    context.lineTo(x - 15, y + 2);
+    context.arcTo(x - 15, y + 7, x - 10, y + 7, 5);
+    context.lineTo(x - 5, y + 7)
+    context.lineTo(x, y + 12)
+    context.stroke();
+    context.fill();
+    context.textAlign = 'center';
+    context.fillStyle = "rgba(226,228,229,1)";
+
+    if (val === null || val <= -100) {
+        context.fillText("澶囩敤", x, y + 2);
+    } else if (val == -101) {
+        context.fillText("鏁呴殰", x, y + 2);
+    } else {
+        context.fillText(val, x, y + 2);
+    }
+    context.textAlign = 'left';
+    context.closePath();
+}
+
+//鏁版嵁绛涢��
+function gainData(listPoints, curType, curVal) {
+    z_peak = [0, lays - 1];
+    x_peak = [0, cols - 1];
+    y_peak = [0, rows - 1];
+
+    //褰撳眰鏄剧ず鏃讹紝鎶婅鏄剧ず鐨勭偣娣诲姞鍒皕_points
+    if (curType === 'z') {
+        for (var i = 0; i < listPoints.length; i++) {
+            //璁剧疆鍏ㄦ樉绀�
+            if (display_mode === "all") {
+                if (listPoints[i]['z'] + 1 === curVal) {
+                    z_points.push(listPoints[i])
+                }
+                // 璁剧疆澶栭儴鏄剧ず
+            } else if (display_mode === "outside") {
+                if ((listPoints[i]['z'] + 1 === curVal)
+                    && ((x_peak.includes(listPoints[i]['x'])) || (y_peak
+                        .includes(listPoints[i]['y'])))) {
+                    z_points.push(listPoints[i]);
+                }
+                //璁剧疆鍐呴儴鏄剧ず
+            } else {
+                if ((listPoints[i]['z'] + 1 === curVal)
+                    && (!(x_peak.includes(listPoints[i]['x'])) && !(y_peak
+                        .includes(listPoints[i]['y'])))) {
+                    z_points.push(listPoints[i]);
+                }
+            }
+        }
+    }
+
+    //褰撳垪鏄剧ず鏃讹紝鎶婅鏄剧ず鐨勭偣娣诲姞鍒皒_points aaaa
+    if (curType === 'x') {
+        for (i = 0; i < listPoints.length; i++) {
+            //璁剧疆鍏ㄦ樉绀�
+            if (display_mode === "all") {
+                if (listPoints[i]['x'] === (cols - curVal)) {
+                    x_points.push(listPoints[i])
+                }
+            } else if (display_mode === "outside") {// 璁剧疆澶栭儴鏄剧ず
+                if ((listPoints[i]['x'] === (cols - curVal))
+                    && ((z_peak.includes(listPoints[i]['z'])) || (y_peak
+                        .includes(listPoints[i]['y'])))) {
+                    x_points.push(listPoints[i]);
+                }
+
+            } else {//璁剧疆鍐呴儴鏄剧ず
+                if ((listPoints[i]['x'] === (cols - curVal))
+                    && (!(z_peak.includes(listPoints[i]['z'])) && !(y_peak
+                        .includes(listPoints[i]['y'])))) {
+                    x_points.push(listPoints[i]);
+                }
+            }
+        }
+    }
+
+    //褰撹鏄剧ず鏃讹紝鎶婅鏄剧ず鐨勭偣娣诲姞鍒皔_points
+    if (curType === 'y') {
+        for (i = 0; i < listPoints.length; i++) {
+
+            //璁剧疆鍏ㄦ樉绀�
+            if (display_mode === "all") {
+                if (listPoints[i]['y'] + 1 === curVal) {
+                    y_points.push(listPoints[i])
+                }
+                // 璁剧疆澶栭儴鏄剧ず
+            } else if (display_mode === "outside") {
+                if ((listPoints[i]['y'] + 1 === curVal)
+                    && ((z_peak.includes(listPoints[i]['z'])) || (x_peak
+                        .includes(listPoints[i]['x'])))) {
+                    y_points.push(listPoints[i]);
+                }
+                //璁剧疆鍐呴儴鏄剧ず
+            } else {
+                if ((listPoints[i]['y'] + 1 === curVal)
+                    && (!(z_peak.includes(listPoints[i]['z'])) && !(x_peak
+                        .includes(listPoints[i]['x'])))) {
+                    y_points.push(listPoints[i]);
+                }
+            }
+        }
+    }
+}
+
+//鐢熸垚鑹插潡
+function entityBlock(context, curType, curVal) {
+
+    //瀹氫箟琛屽眰鍒楅棿闅�
+    var y_interval = 2 * oneHeight / rows;
+    var x_interval = back_width / cols;
+    var z_interval = 0.5 * back_height / lays;
+
+    //鏄剧ず鏂瑰紡涓哄眰
+    if (curType === 'z') {
+        //鐢熸垚琛�
+        for (i = 1; i <= rows; i++) {
+            var start_x = (oneWidth / 2 / rows) * (i - 1) + edge_distance;
+            var start_y = (2 * oneHeight / rows) * (rows - i + 1) + curVal
+                * z_interval;
+
+            //鐢熸垚鍒�
+            for (j = 1; j <= cols; j++) {
+
+                //澶栭儴鏄剧ず
+                if ((display_mode === "outside") && !y_peak.includes(i - 1)
+                    && !x_peak.includes(j - 1)) {
+                    start_x += x_interval;
+                    continue;
+                    //鍐呴儴鏄剧ず
+                } else if ((display_mode === "inner")
+                    && (y_peak.includes(i - 1) || x_peak.includes(j - 1))) {
+                    start_x += x_interval;
+                    continue;
+                }
+
+                //澹版槑鑹插潡鏁板��
+                var val = null;
+                //澹版槑鐐圭殑搴忓垪鍊�
+                var index = null;
+
+                //寰幆閬嶅巻鎵惧埌瀵瑰簲鑹插潡
+                for (k = 0; k < z_points.length; k++) {
+                    if ((z_points[k]['y'] + 1 === i)
+                        && (z_points[k]['x'] + 1 === j)) {
+                        val = z_points[k]['temp']
+                        index = k;
+                        break;
+                    }
+                }
+
+                //缁樺埗鑹插潡
+                context.beginPath();
+                context.lineWidth = 1;
+                context.strokeStyle = 'rgba(224,235,242,1)'
+                context.moveTo(start_x, start_y);
+                context.lineTo(start_x + x_interval, start_y);
+                context.lineTo(start_x + x_interval + (oneWidth / 2 / rows),
+                    start_y - y_interval);
+                context.lineTo(start_x + (oneWidth / 2 / rows), start_y
+                    - y_interval);
+                context.lineTo(start_x, start_y);
+
+                //璁剧疆瀵瑰簲棰滆壊
+                if (val === null || val == -100 || val == -101) {
+                    context.fillStyle = "rgba(155,171,182,1)";
+                    // val = "澶囩敤";
+                } else {
+                    if (t % 2 === 1) {
+                        if (listLays[curVal - 1]['tempMax'] && val == listLays[curVal - 1]['tempMax']) { //姝ょ偣涓烘渶楂樻俯
+                            context.fillStyle = "rgba(229,29,29,1)";
+                        } else if (listLays[curVal - 1]['tempMin'] && val == listLays[curVal - 1]['tempMin']) { //姝ょ偣涓烘渶浣庢俯
+                            context.fillStyle = "rgba(0,255,28,1)";
+                        } else {
+                            context.fillStyle = getColor(val);
+                        }
+                    } else {
+                        context.fillStyle = getColor(val);
+                    }
+                }
+                context.fill();
+                context.stroke();
+                context.closePath();
+
+                //缁樺埗鐐规枃鏈
+                textbox(context, start_x + 0.5 * x_interval + 0.5
+                    * (oneWidth / 2 / rows), start_y - 0.5 * y_interval,
+                    val, z_points[index]);
+                //淇敼鑹插潡璧峰鍊�
+                start_x += x_interval;
+            }
+        }
+        //鏄剧ず鏂瑰紡涓鸿
+    } else if (curType === 'y') {
+        //鐢熸垚灞�
+        for (var i = 1; i <= lays; i++) {
+            var start_x = (oneWidth / 2 / rows) * (curVal - 1) + edge_distance;
+            var start_y = (2 * oneHeight / rows) * (rows - curVal + 1) + i
+                * z_interval;
+
+            //鐢熸垚鍒�
+            for (var j = 1; j <= cols; j++) {
+
+                //澶栭儴鏄剧ず
+                if ((display_mode === "outside") && !z_peak.includes(i - 1)
+                    && !x_peak.includes(j - 1)) {
+                    start_x += x_interval;
+                    continue;
+                    //鍐呴儴鏄剧ず
+                } else if ((display_mode === "inner")
+                    && (z_peak.includes(i - 1) || x_peak.includes(j - 1))) {
+                    start_x += x_interval;
+                    continue;
+                }
+
+                //澹版槑鑹插潡鏁板��
+                var val = null;
+                //澹版槑鐐圭殑搴忓垪鍊�
+                var index = null;
+
+                //寰幆閬嶅巻鎵惧埌瀵瑰簲鑹插潡
+                for (k = 0; k < y_points.length; k++) {
+                    if ((y_points[k]['z'] + 1 === i)
+                        && (y_points[k]['x'] + 1 === j)) {
+                        val = y_points[k]['temp']
+                        index = k;
+                        break;
+                    }
+                }
+
+                ////缁樺埗涓�涓壊鍧�,鏄剧ず鏂瑰紡涓烘瑙嗗浘
+                context.fillStyle = "rgba(155,171,182,1)";
+                context.beginPath();
+                context.lineWidth = 1.5;
+                context.strokeStyle = 'rgba(224,235,242,1)'
+                context.moveTo(start_x, start_y);
+                context.lineTo(start_x + x_interval, start_y);
+                context.lineTo(start_x + x_interval, start_y - z_interval);
+                context.lineTo(start_x, start_y - z_interval);
+                context.lineTo(start_x, start_y);
+
+                //璁剧疆瀵瑰簲棰滆壊
+                if (val === null || val == -100) {
+                    context.fillStyle = "rgba(155,171,182,1)";
+                } else {
+                    if (t % 2 === 1) {
+                        if (val == listRows[curVal - 1]['tempMax']) { //姝ょ偣涓烘渶楂樻俯
+                            context.fillStyle = "rgba(229,29,29,1)";
+                        } else if (val == listRows[curVal - 1]['tempMin']) { //姝ょ偣涓烘渶浣庢俯
+                            context.fillStyle = "rgba(0,255,28,1)";
+                        } else {
+                            context.fillStyle = getColor(val);
+                        }
+                    } else {
+                        context.fillStyle = getColor(val);
+
+                    }
+                }
+
+                context.fill();
+                context.stroke();
+                context.closePath();
+
+                //缁樺埗鐐规枃鏈
+                textbox(context, start_x + 0.4 * x_interval, start_y - 0.5
+                    * z_interval, val, y_points[index]);
+
+                //淇敼鑹插潡璧峰鍊�
+                start_x += x_interval;
+            }
+        }
+
+        //鏄剧ず鏂瑰紡涓哄垪
+    } else if (curType === 'x') {
+
+        //鐢熸垚涓�灞�
+        for (var i = lays; i > 0; i--) {
+            var start_x = (cols - curVal) * x_interval + edge_distance;
+            var start_y = (2 * oneHeight / rows) * (rows) + i * z_interval;
+
+            //鐢熸垚涓�琛�
+            for (var j = 1; j <= rows; j++) {
+
+                //澶栭儴鏄剧ず
+                if ((display_mode === "outside") && !z_peak.includes(i - 1)
+                    && !y_peak.includes(j - 1)) {
+                    start_x += (oneWidth / 2 / rows);
+                    start_y -= (2 * oneHeight / rows);
+                    continue;
+                    //鍐呴儴鏄剧ず
+                } else if ((display_mode === "inner")
+                    && (z_peak.includes(i - 1) || y_peak.includes(j - 1))) {
+                    start_x += (oneWidth / 2 / rows);
+                    start_y -= (2 * oneHeight / rows);
+                    continue;
+                }
+
+                //澹版槑鑹插潡鏁板��
+                var val = null;
+                //澹版槑鐐圭殑搴忓垪鍊�
+                var index = null;
+
+                //寰幆閬嶅巻鎵惧埌瀵瑰簲鑹插潡
+                for (var k = 0; k < x_points.length; k++) {
+                    if ((x_points[k]['y'] + 1 === j)
+                        && (x_points[k]['z'] === (i - 1))) {
+                        val = x_points[k]['temp'];
+                        index = k;
+                        break;
+                    }
+                }
+                ;
+
+                //缁樺埗涓�涓壊鍧�,鏄剧ず鏂瑰紡涓轰晶瑙嗗浘
+                context.fillStyle = "rgba(155,171,182,1)";
+                context.beginPath();
+                context.lineWidth = 1.5;
+                context.strokeStyle = 'rgba(224,235,242,1)'
+                context.moveTo(start_x, start_y);
+                context.lineTo(start_x + (oneWidth / 2 / rows), start_y
+                    - y_interval);
+                context.lineTo(start_x + (oneWidth / 2 / rows), start_y
+                    - y_interval - z_interval);
+                context.lineTo(start_x, start_y - z_interval);
+                context.lineTo(start_x, start_y);
+
+                //璁剧疆瀵瑰簲棰滆壊
+                if (val === null || val == -100) {
+                    context.fillStyle = "rgba(155,171,182,1)";
+                } else {
+                    context.fillStyle = getColor(val);
+                }
+
+                context.fill();
+                context.stroke();
+                context.closePath();
+
+                //缁樺埗鐐规枃鏈
+                textbox(context, start_x + 0.5 * (oneWidth / 2 / rows), start_y
+                    - 0.5 * y_interval - 0.5 * z_interval, val,
+                    x_points[index]);
+
+                //淇敼鑹插潡璧峰鍊�
+                start_x += (oneWidth / 2 / rows);
+                start_y -= (2 * oneHeight / rows);
+            }
+        }
+    }
+}
+
+//缁戝畾瑙﹀彂鐨勪簨浠�
+function draws(x, y, canvas, ctx) {
+    //鍒涘缓鐐瑰嚮浜嬩欢鐨勭敾甯冿紙鐢诲竷2锛夐渶瑕佽�冭檻鐖舵鐨勪綅缃�
+    ctx.rect(0, 0, canvas.width, canvas.height);
+    //缁檃rr闆嗗悎涓殑姣忎竴涓璞℃坊鍔犵偣鍑讳簨浠�
+    arr.forEach(function (v, i) {
+        ctx.beginPath();
+        //缁樺埗姣忎竴涓璞$殑鍖哄煙
+        ctx.rect(v.x, v.y, v.width, v.height);
+        ctx.closePath();
+
+        //鍒ゆ柇鐐瑰嚮鐐规槸鍚﹀湪鍖哄煙涓�
+        if (ctx.isPointInPath(x, y)) {
+            //鍒ゆ柇鐐瑰嚮鍖哄煙绫诲瀷
+            if (v.type === 'val') {
+                //绫诲瀷涓簐al锛屽垯寮瑰嚭鐐逛俊鎭�
+                // showData = "x=" + v.pointX + "\ny=" + v.pointY + "\nz=" + v.pointZ;
+                // alert(showData)
+                layer.msg("灞�=" + (v.pointZ) + "\n琛�=" + (v.pointY) + "\n鍒�=" + (cols - v.pointX + 1) + "\n娓╁害="
+                    + v.val);
+            } else { //鍏朵粬绫诲瀷鍒欏垏鎹㈡樉绀鸿壊鍧�
+                //娓呯┖鏁版嵁
+                curType = v['type'];
+                curVal = v['num'];
+                if (curType === 'x') {
+                    curVal = cols - v['num'] + 1;
+                }
+                arr = [];
+                x_points = [];
+                y_points = [];
+                z_points = [];
+
+                //娓呯┖鍥惧舰鐢诲竷
+                canvas.height = canvas.height;
+                //閲嶆柊缁樺埗
+                createBack(ctx);
+                createLeft(ctx);
+                createBottom(ctx, back_height);
+                gainData(listPoints, curType, curVal);
+                split(ctx);
+                entityBlock(ctx, curType, curVal);
+                title(ctx);
+                border(ctx);
+
+                //鏇存敼Btn鍚嶇О锛屽悓鏃舵洿鏂板眰琛屽垪鐨勯�夋嫨
+                updateGrainBtn(true);
+
+                //鍒囨崲涓哄眰鏄剧ず
+                if (v['type'] === 'z') {
+                    //璧峰鐐�
+                    start_x = v['start_x'];
+                    start_y = v['start_y'];
+
+                    //璁捐鐐瑰嚮鏃剁殑娓愬彉
+                    var grad = ctx.createLinearGradient(start_x, start_y,
+                        start_x + 120, start_y);
+                    grad.addColorStop(0, "#2f2fff");
+                    grad.addColorStop(0.3, "#5858ff");
+                    grad.addColorStop(0.7, "#b3b3ff");
+                    grad.addColorStop(1, "#ffffff");
+                    ctx.fillStyle = grad;
+
+                    //寮�濮嬬粯鍒�
+                    ctx.beginPath();
+                    ctx.lineWidth = 5;
+                    ctx.strokeStyle = 'rgba(214,223,232,1)';
+                    ctx.moveTo(start_x, start_y);
+                    ctx.lineTo(start_x + 75, start_y);
+                    ctx.lineTo(start_x + 75, start_y - 0.5
+                        * (back_height / lays));
+                    ctx.lineTo(start_x, start_y - 0.5 * (back_height / lays));
+
+                    ctx.lineTo(start_x, start_y);
+                    ctx.stroke();
+                    ctx.fill();
+
+                    //鏍囬鏍忔枃鏈�
+                    ctx.fillStyle = 'rgba(255,14,0,1)';
+                    val = "绗�" + v['num'] + "灞�";
+                    ctx.font = "15px Arial";
+                    ctx.fillText(val, start_x + 10, start_y + 5 - 0.5
+                        * (back_height / lays) / 2);
+
+                    //鍒囨崲涓鸿鏄剧ず
+                } else if (v['type'] === 'y') {
+                    //璧峰鐐�
+                    start_x = v['start_x'];
+                    start_y = v['start_y'];
+
+                    //璁捐鐐瑰嚮鏃剁殑娓愬彉
+                    var grad = ctx.createLinearGradient(start_x, start_y,
+                        start_x + 120, start_y);
+                    grad.addColorStop(0, "#2f2fff");
+                    grad.addColorStop(0.3, "#5858ff");
+                    grad.addColorStop(0.7, "#b3b3ff");
+                    grad.addColorStop(1, "#ffffff");
+                    ctx.fillStyle = grad;
+
+                    //寮�濮嬬粯鍒�
+                    ctx.beginPath();
+                    ctx.lineWidth = 5;
+                    ctx.strokeStyle = 'rgba(214,223,232,1)';
+                    ctx.moveTo(start_x, start_y);
+                    ctx.lineTo(start_x + 75, start_y);
+                    ctx.lineTo(start_x + 75 + (oneWidth / 2 / rows), start_y
+                        - (2 * oneHeight / rows));
+                    ctx.lineTo(start_x + (oneWidth / 2 / rows), start_y
+                        - (2 * oneHeight / rows));
+                    ctx.lineTo(start_x, start_y);
+                    ctx.stroke();
+                    ctx.fill();
+
+                    //鏍囬鏍忔枃鏈�
+                    ctx.fillStyle = 'rgba(255,14,0,1)';
+                    val = "绗�" + v['num'] + "琛�";
+
+                    if (rows > 10) {
+                        ctx.font = "12px Arial";
+                        ctx.fillText(val, start_x + 25, start_y - 5);
+                    } else {
+                        ctx.font = "15px Arial";
+                        ctx.fillText(val, start_x + 25, start_y - 9);
+                    }
+
+                    //鍒囨崲涓哄垪鏄剧ず
+                } else if (v['type'] === 'x') {
+                    //璧峰鐐�
+                    start_x = v['start_x'];
+                    start_y = v['start_y'];
+
+                    //璁捐鐐瑰嚮鏃剁殑娓愬彉
+                    var grad = ctx.createLinearGradient(start_x, start_y,
+                        start_x + 120, start_y);
+                    grad.addColorStop(0, "#2f2fff");
+                    grad.addColorStop(0.3, "#5858ff");
+                    grad.addColorStop(0.7, "#b3b3ff");
+                    grad.addColorStop(1, "#ffffff");
+                    ctx.fillStyle = grad;
+
+                    //寮�濮嬬粯鍒�
+                    ctx.beginPath();
+                    ctx.lineWidth = 5;
+                    ctx.strokeStyle = 'rgba(214,223,232,1)';
+                    ctx.moveTo(start_x, start_y);
+                    ctx.lineTo(start_x - (oneWidth / 2 / rows), start_y
+                        + (2 * oneHeight / rows));
+                    ctx.lineTo(start_x + (back_width / cols)
+                        - (oneWidth / 2 / rows), start_y
+                        + (2 * oneHeight / rows));
+                    ctx.lineTo(start_x + (back_width / cols), start_y);
+                    ctx.lineTo(start_x, start_y);
+                    ctx.stroke();
+                    ctx.fill();
+
+                    //鏍囬鏍忔枃鏈�
+                    ctx.fillStyle = 'rgba(255,14,0,1)';
+                    val = "绗�" + (cols - v['num'] + 1) + "鍒�";
+                    ctx.font = "15px Arial";
+                    ctx.fillText(val, start_x - 0.5 * (oneWidth / 2 / rows),
+                        start_y + 0.7 * (2 * oneHeight / rows));
+                }
+            }
+        }
+    });
+}
+
+//缁戝畾浜嬩欢
+function showIndex(canvas, ctx) {
+
+    //鏁翠釜鐢诲竷瀵硅薄娣诲姞鐐瑰嚮浜嬩欢
+    canvas.addEventListener('click', function location(e) {
+        x = e.clientX;
+        y = e.clientY;
+        draws(x, y, canvas, ctx);
+    }, false);
+}
+
+//琛屻�佸垪銆佸眰鏍囬鏍�
+function title(context) {
+
+    //灞傛爣棰樻爮
+    for (i = 1; i <= lays; i++) {
+        //璁剧疆璧峰鐐�
+        start_x = (oneWidth / 2) + back_width + edge_distance + 3;
+        start_y = 0.5 * (back_height / lays) * i;
+
+        //璁剧疆涓洪�夋嫨鏃剁殑娓愬彉濉厖
+        if ((curType === "z") && (curVal === i)) {
+            var grad = context.createLinearGradient(start_x, start_y,
+                start_x + 120, start_y);
+            grad.addColorStop(0, "#2f2fff");
+            grad.addColorStop(0.3, "#5858ff");
+            grad.addColorStop(0.7, "#b3b3ff");
+            grad.addColorStop(1, "#ffffff");
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑娓愬彉濉厖
+        } else {
+            var grad = context.createLinearGradient(start_x, start_y,
+                start_x + 200, start_y);
+            grad.addColorStop(0, "#ffffff");
+            grad.addColorStop(0.8, "#a2baef");
+        }
+        context.fillStyle = grad;
+
+        //缁樺埗
+        context.beginPath();
+        context.lineWidth = 5;
+        context.strokeStyle = 'rgba(214,223,232,1)';
+        context.moveTo(start_x, start_y);
+        context.lineTo(start_x + 75, start_y);
+        context.lineTo(start_x + 75, start_y - 0.5 * (back_height / lays));
+        context.lineTo(start_x, start_y - 0.5 * (back_height / lays));
+        context.lineTo(start_x, start_y);
+        context.stroke();
+        context.fill();
+
+        //璁剧疆涓洪�夋嫨鏃剁殑瀛椾綋濉厖
+        if ((curType === "z") && (curVal === i)) {
+            context.fillStyle = 'rgba(255,14,0,1)';
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑瀛椾綋濉厖
+        } else {
+            context.fillStyle = 'rgba(30,30,30,1)';
+        }
+
+        //璁剧疆鏍囬鏂囨湰
+        val = "绗�" + i + "灞�";
+        context.font = "15px Arial";
+        context.fillText(val, start_x + 10, start_y + 5 - 0.5
+            * (back_height / lays) / 2);
+
+        //灏嗘樉绀烘柟寮忓垏鎹簨浠跺姞鍏rr鏁扮粍
+        arr.push({
+            'x': start_x + 10 + shift,
+            'y': start_y - 0.5 * (back_height / lays) / 2 - 22
+                + out_window_top,
+            'width': 60,
+            'height': 40,
+            'type': 'z',
+            'num': i,
+            'start_x': start_x,
+            'start_y': start_y
+        })
+        context.closePath();
+    }
+
+    //琛屾爣棰樻爮
+    for (i = 1; i <= rows; i++) {
+        //璁剧疆璧峰鐐�
+        start_x = back_width + (oneWidth / 2 / rows) * (i - 1) + edge_distance;
+        start_y = (2 * oneHeight + 0.5 * back_height) - (2 * oneHeight / rows)
+            * (i - 1) + 5;
+
+        //璁剧疆涓洪�夋嫨鏃剁殑娓愬彉濉厖
+        if ((curType === "y") && (curVal === i)) {
+            var grad = context.createLinearGradient(start_x, start_y,
+                start_x + 120, start_y);
+            grad.addColorStop(0, "#2f2fff");
+            grad.addColorStop(0.3, "#5858ff");
+            grad.addColorStop(0.7, "#b3b3ff");
+            grad.addColorStop(1, "#ffffff");
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑娓愬彉濉厖
+        } else {
+            var grad = context.createLinearGradient(start_x, start_y,
+                start_x + 200, start_y);
+            grad.addColorStop(0, "#ffffff");
+            grad.addColorStop(0.8, "#a2baef");
+        }
+        context.fillStyle = grad;
+
+        //缁樺埗
+        context.beginPath();
+        context.lineWidth = 5;
+        context.strokeStyle = 'rgba(215,224,230,1)';
+        context.moveTo(start_x, start_y);
+        context.lineTo(start_x + 75, start_y);
+        context.lineTo(start_x + 75 + (oneWidth / 2 / rows), start_y
+            - (2 * oneHeight / rows));
+        context.lineTo(start_x + (oneWidth / 2 / rows), start_y
+            - (2 * oneHeight / rows));
+        context.lineTo(start_x, start_y);
+        context.stroke();
+        context.fill();
+
+        //璁剧疆涓洪�夋嫨鏃剁殑瀛椾綋濉厖
+        if ((curType === "y") && (curVal === i)) {
+            context.fillStyle = 'rgba(255,14,0,1)';
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑瀛椾綋濉厖
+        } else {
+            context.fillStyle = 'rgba(30,30,30,1)';
+        }
+
+        //璁剧疆鏍囬鏂囨湰
+        val = "绗�" + i + "琛�";
+        if (rows > 10) {
+            context.font = "12px Arial";
+            context.fillText(val, start_x + 25, start_y - 5);
+        } else {
+            context.font = "15px Arial";
+            context.fillText(val, start_x + 25, start_y - 9);
+        }
+
+        //灏嗘樉绀烘柟寮忓垏鎹簨浠跺姞鍏rr鏁扮粍
+        arr.push({
+            'x': start_x + blockWidth + shift,
+            'y': start_y - blockHeight + out_window_top,
+            'width': 50,
+            'height': 20,
+            'type': 'y',
+            'num': i,
+            'start_x': start_x,
+            'start_y': start_y
+        })
+        context.closePath();
+    }
+
+    //鍒楁爣棰樻爮
+    for (i = 1; i <= cols; i++) {
+        //璁剧疆璧峰鐐�
+        start_x = (back_width / cols) * (i - 1) + edge_distance;
+        start_y = (2 * oneHeight + 0.5 * back_height) + 5;
+
+        //璁剧疆涓洪�夋嫨鏃剁殑娓愬彉濉厖
+        if ((curType === "x") && (curVal === (cols - i + 1))) {
+            var grad = context.createLinearGradient(start_x, start_y,
+                start_x + 120, start_y);
+            grad.addColorStop(0, "#2f2fff");
+            grad.addColorStop(0.3, "#5858ff");
+            grad.addColorStop(0.7, "#b3b3ff");
+            grad.addColorStop(1, "#ffffff");
+            context.strokeStyle = 'rgba(100,100,255,1)';
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑娓愬彉濉厖
+        } else {
+            context.strokeStyle = 'rgba(215,224,230,1)';
+            var grad = context.createLinearGradient(start_x, start_y,
+                start_x + 120, start_y);
+            grad.addColorStop(0, "#ffffff");
+            grad.addColorStop(0.8, "#a2baef");
+        }
+        context.fillStyle = grad;
+
+        //缁樺埗
+        context.beginPath();
+        context.lineWidth = 5;
+        context.moveTo(start_x, start_y);
+        context.lineTo(start_x - (oneWidth / 2 / rows), start_y
+            + (2 * oneHeight / rows));
+        context.lineTo(start_x + (back_width / cols) - (oneWidth / 2 / rows),
+            start_y + (2 * oneHeight / rows));
+        context.lineTo(start_x + (back_width / cols), start_y);
+        context.lineTo(start_x, start_y);
+        context.stroke();
+        context.fill();
+
+        //璁剧疆涓洪�夋嫨鏃剁殑瀛椾綋濉厖
+        if ((curType === "x") && (curVal === (cols - i + 1))) {
+            context.fillStyle = 'rgba(255,14,0,1)';
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑瀛椾綋濉厖
+        } else {
+            context.fillStyle = 'rgba(30,30,30,1)';
+        }
+        val = "绗�" + (cols - i + 1) + "鍒�";
+        context.font = "15px Arial";
+        context.fillText(val, start_x - 0.5 * (oneWidth / 2 / rows), start_y
+            + 0.7 * (2 * oneHeight / rows));
+        //灏嗘樉绀烘柟寮忓垏鎹簨浠跺姞鍏rr鏁扮粍
+        arr.push({
+            'x': start_x - 0.3 * (oneWidth / 2 / rows) + shift,
+            'y': start_y + 0.5 * (2 * oneHeight / rows) + out_window_top,
+            'width': 55,
+            'height': 25,
+            'type': 'x',
+            'num': i,
+            'start_x': start_x,
+            'start_y': start_y
+        })
+        context.closePath();
+    }
+
+}
+
+//鍒堕�犲簳鐭╁舰
+function createBottom(context, y) {
+    //璁剧疆濉厖鏍峰紡
+    var gra = context.createRadialGradient(oneWidth, oneHeight, 0,
+        oneWidth / 2, oneHeight / 2, width * 100);
+    gra.addColorStop(0, "#c9dde8");
+    // gra.addColorStop(0.8, "white");
+    gra.addColorStop(1, "#c0deea");
+    var start_x = oneWidth / 2 + edge_distance;
+
+    //缁樺埗鐭╁舰
+    context.fillStyle = "rgba(168,208,225,1)";
+    context.fillStyle = gra;
+    context.beginPath();
+    context.moveTo(start_x, 0.5 * back_height);
+    context.lineTo(edge_distance, 2 * oneHeight + 0.5 * back_height);
+    context.lineTo(edge_distance + back_width, 2 * oneHeight + 0.5
+        * back_height);
+    context.lineTo(start_x + back_width, 0.5 * back_height);
+    context.lineWidth = 1.5;
+    context.fill();
+    context.stroke();
+    context.closePath();
+}
+
+//鍒堕�犺儗鐭╁舰
+function createBack(context) {
+
+    //璁剧疆濉厖鏍峰紡
+    var gra = context.createRadialGradient(oneWidth, oneHeight, 0,
+        oneWidth / 2, oneHeight / 2, width * 100);
+    gra.addColorStop(0, "#a8d0e1");
+    gra.addColorStop(1, "white");
+
+    //缁樺埗
+    var start_x = oneWidth / 2 + edge_distance
+    var start_y = 0
+    context.fillStyle = "rgba(168,208,225,1)";
+    context.fillStyle = gra;
+    context.beginPath();
+    context.moveTo(start_x, start_y);
+
+    context.lineTo(start_x + back_width, start_y);
+    context.lineTo(start_x + back_width, 0.5 * back_height);
+
+    context.lineTo(start_x, 0.5 * back_height);
+    context.lineTo(start_x, start_y);
+    context.lineWidth = 1.5;
+    context.fill();
+    context.stroke();
+    context.closePath();
+}
+
+//鍒堕�犲乏鐭╁舰
+function createLeft(context) {
+    //缁樺埗
+    var start_x = edge_distance;
+    var start_y = 2 * oneHeight;
+    context.fillStyle = "rgba(168,208,225,1)";
+    context.beginPath();
+    context.moveTo(start_x, start_y);
+    context.lineTo(start_x, start_y + 0.5 * back_height);
+    context.lineTo(oneWidth / 2 + start_x, 0.5 * back_height);
+    context.lineTo(oneWidth / 2 + start_x, 0);
+    context.lineTo(start_x, start_y);
+    context.lineWidth = 1.5;
+    context.stroke();
+    context.fill();
+    context.closePath();
+}
+
+//鑾峰彇绾垫í姣�
+function getRatio() {
+    var tmp = 1.3;
+    if (Screen.height > 1050) {
+        tmp = 1.05
+        if (rows <= 5)
+            tmp = 1.3
+        else if ((rows >= 6) && (rows <= 7))
+            tmp = 1.2
+        else if ((rows >= 8) && (rows <= 9))
+            tmp = 1.1
+    } else if ((Screen.height <= 1050) && (Screen.height > 960)) {
+        tmp = 1;
+        if (rows <= 5)
+            tmp = 1.3
+        else if ((rows >= 6) && (rows <= 7))
+            tmp = 1.2
+        else if ((rows >= 8) && (rows <= 9))
+            tmp = 1.1
+    } else if ((Screen.height <= 960) && (Screen.height > 900)) {
+        tmp = 0.9;
+        if (rows <= 7)
+            tmp = 1.2
+        else if (rows === 8)
+            tmp = 1.1
+        else if (rows === 9)
+            tmp = 1
+    } else if ((Screen.height <= 900) && (Screen.height > 800)) {
+        tmp = 0.8;
+        if (rows <= 6)
+            tmp = 1.2
+        else if (rows === 7)
+            tmp = 1.1
+        else if (rows === 8)
+            tmp = 1
+        else if (rows === 9)
+            tmp = 0.9
+    } else if ((Screen.height <= 800) && (Screen.height > 768)) {
+        tmp = 0.75;
+        if (rows <= 6)
+            tmp = 1.2
+        else if (rows === 7)
+            tmp = 1
+        else if (rows === 8)
+            tmp = 0.9
+        else if (rows === 9)
+            tmp = 0.8
+    } else if ((Screen.height <= 768) && (Screen.height > 720)) {
+        tmp = 0.75;
+        if (rows <= 6)
+            tmp = 1.1
+        else if (rows === 7)
+            tmp = 1
+        else if (rows === 8)
+            tmp = 0.9
+        else if (rows === 9)
+            tmp = 0.8
+        back_height = oneHeight * 2.1 * (2 - rows / 10) * 0.7
+    } else if (Screen.height <= 720) {
+        tmp = 0.66;
+        if (rows <= 6)
+            tmp = 1
+        else if (rows === 7)
+            tmp = 0.9
+        else if (rows === 8)
+            tmp = 0.8
+        else if (rows === 9)
+            tmp = 0.7
+    }
+
+    return tmp;
+}
+
+//鏍规嵁娓╁害鑾峰彇RGB
+function getColor(val) {
+    if (val >= 50) {
+        color = "rgba(255,0,0,1)";
+        return color;
+    } else if (val >= 20) {
+        G = Math.round(255 - 255 * ((val - 20) / 30));
+        color = "rgba(255," + G + ",0,1)";
+        return color;
+    } else if (val >= 0) {
+        R = Math.round(100 + (155 / 20) * val);
+        B = Math.round(30 - 1.5 * val);
+        color = "rgba(" + R + ",255," + B + ",1)";
+        return color;
+    } else if (val >= -10) {
+        R = Math.round(100 - 6.6 * (val * (-1)));
+        G = Math.round(255 - 2.2 * (val * (-1)));
+        B = Math.round(30 + 1.2 * (val * (-1)));
+        color = "rgba(" + R + "," + G + "," + B + ",1)";
+        return color;
+    } else {
+        color = "rgba(34,233,42,1)";
+        return color;
+    }
+}
+
+//涓嬩竴涓偣鍑讳簨浠�
+function next() {
+    if (curType === "x") {
+        if (curVal === Number(cols)) {
+            curVal = 1;
+        } else {
+            curVal += 1;
+        }
+    } else if (curType === "y") {
+        if (curVal === Number(rows)) {
+            curVal = 1;
+        } else {
+            curVal += 1;
+        }
+    } else {
+        if (curVal === Number(lays)) {
+            curVal = 1;
+        } else {
+            curVal += 1;
+        }
+    }
+    flash();
+    updateTemp();
+}
+
+//涓婁竴涓偣鍑讳簨浠�
+function last() {
+    if (curType === "x") {
+        if (curVal === 1) {
+            curVal = Number(cols);
+        } else {
+            curVal -= 1;
+        }
+    } else if (curType === "y") {
+        if (curVal === 1) {
+            curVal = Number(rows);
+        } else {
+            curVal -= 1;
+        }
+    } else {
+        if (curVal === 1) {
+            curVal = Number(lays);
+        } else {
+            curVal -= 1;
+        }
+    }
+    flash();
+    updateTemp();
+}
+
+//灞傛樉绀虹偣鍑讳簨浠�
+function lay() {
+    curType = "z";//鏄剧ず绫诲瀷
+    curVal = 1;
+    flash();
+    updateGrainBtn(false);
+
+};
+
+//鍒楁樉绀虹偣鍑讳簨浠�
+function col() {
+    curType = "x";//鏄剧ず绫诲瀷
+    curVal = 1;
+    flash();
+    updateGrainBtn(false);
+};
+
+//琛屾樉绀虹偣鍑讳簨浠�
+function row() {
+    curType = "y";//鏄剧ず绫诲瀷
+    curVal = 1;
+    flash();
+    updateGrainBtn(false);
+};
+
+//鍏ㄩ儴鏄剧ず鐐瑰嚮浜嬩欢
+function display_all() {
+    display_mode = "all";
+    flash();
+}
+
+//澶栭儴鏄剧ず鐐瑰嚮浜嬩欢
+function display_outside() {
+    display_mode = "outside";
+    flash();
+}
+
+//鍐呴儴鏄剧ず鐐瑰嚮浜嬩欢
+function display_inside() {
+    display_mode = "inner";
+    flash();
+}
+
+// 鍒濆鍖栦笁缁寸伯鎯�
+function initGrainChar3d() {
+    draw();
+};
+
+function clearGrainChart3d() {
+    listPoints = [];
+    listLays = [];
+    listRows = [];
+    lays = 4;
+    rows = 5;
+    cols = 8;
+    curType = "z";
+    curVal = 1;
+    initCanvasParam();
+    draw();
+};
+
+//閲嶆柊娓叉煋
+function resetGrainChart3d() {
+    listPoints = grainData.listPoints;
+    listLays = grainData.listLays;
+    listRows = grainData.listRows;
+    var attr = grainData.cable.split("-");
+    lays = attr[0];
+    rows = attr[1];
+    cols = attr[2];
+
+    initCanvasParam();
+
+    draw();
+    sleep();//寮�濮嬮棯鐑�
+    curType = "z";
+    curVal = 1;
+
+    updateTemp();
+}
+
+//鏇存柊Btn鍚嶇О
+function updateGrainBtn(isUpdateSelect) {
+    var btnNext = $("#btn_next");
+    var btnPre = $("#btn_pre");
+    if ("z" === curType) {
+        btnNext.text("涓嬩竴灞�");
+        btnPre.text("涓婁竴灞�");
+    }
+    if ("y" === curType) {// 琛屾煡鐪�
+        btnNext.text("涓嬩竴琛�");
+        btnPre.text("涓婁竴琛�");
+    }
+    if ("x" === curType) {// 鍒楁煡鐪�
+        btnNext.text("涓嬩竴鍒�");
+        btnPre.text("涓婁竴鍒�");
+    }
+
+    //闇�鏀规俯搴�
+    updateTemp();
+
+};
+
+function updateTemp() {
+    //鏇存柊灞傛俯锛岃娓╁害淇℃伅
+    if ("z" === curType) {
+        $.each(listLays, function (index, item) {
+            if (item.z === (curVal - 1)) {
+                // 鏇存柊灞備俊鎭�
+                $("#dynamicAve").text(item.tempAve);
+                $("#dynamicMax").text(item.tempMax);
+                $("#dynamicMin").text(item.tempMin);
+                $("#dynamicAveName").text("灞傚潎娓�");
+                $("#dynamicMaxName").text("灞傞珮娓�");
+                $("#dynamicMinName").text("灞備綆娓�");
+                return;
+            }
+        });
+    }
+    if ("y" === curType) {
+        $.each(listRows, function (index, item) {
+            if (item.y === (curVal - 1)) {
+                $("#dynamicAve").text(item.tempAve);
+                $("#dynamicMax").text(item.tempMax);
+                $("#dynamicMin").text(item.tempMin);
+                $("#dynamicAveName").text("琛屽潎娓�");
+                $("#dynamicMaxName").text("琛岄珮娓�");
+                $("#dynamicMinName").text("琛屼綆娓�");
+            }
+        });
+    }
+    if ("x" === curType) {
+        $("#dynamicAve").text("--");
+        $("#dynamicMax").text("--");
+        $("#dynamicMin").text("--");
+        $("#dynamicAveName").text("鍒楀潎娓�");
+        $("#dynamicMaxName").text("鍒楅珮娓�");
+        $("#dynamicMinName").text("鍒椾綆娓�");
+    }
+};
diff --git a/fzzy-igdss-web/src/main/resources/static/grain/grainPoint4.js b/fzzy-igdss-web/src/main/resources/static/grain/grainPoint4.js
new file mode 100644
index 0000000..eadf57a
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/grain/grainPoint4.js
@@ -0,0 +1,633 @@
+/*==========浠撳簱绫诲瀷涓哄渾绛掍粨==========*/
+//瀹氫箟鏁版嵁
+var listPoints = [
+    {'z': 0, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 1, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 2, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 3, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 4, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 5, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 6, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 7, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 8, 'x': 0, 'y': 0, 'temp': 0.0},
+    {'z': 9, 'x': 0, 'y': 0, 'temp': 0.0}];
+var listLays = [{z: 1, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}, {
+    z: 2,
+    tempMin: 0.0,
+    tempMax: 0.0,
+    tempAve: 0.0
+}, {z: 3, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}, {z: 4, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}, {
+    z: 5,
+    tempMin: 0.0,
+    tempMax: 0.0,
+    tempAve: 0.0
+}, {z: 6, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}, {z: 7, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}, {
+    z: 8,
+    tempMin: 0.0,
+    tempMax: 0.0,
+    tempAve: 0.0
+}, {z: 9, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}, {z: 10, tempMin: 0.0, tempMax: 0.0, tempAve: 0.0}];
+
+var distrList = [1];
+var bottomList = [10];
+//瀹氫箟鏁版嵁鏄剧ず瀹瑰櫒
+var layPoints = [];
+var colPoints = [];
+var cirNum = distrList.length; //鍦堟暟
+var layNum = getLayNum(); //灞傛暟
+var longAxis = 100; //绗竴鍐呭湀鍗婇暱杞�
+var shortAxis = 10; //绗竴鍐呭湀鍗婄煭杞�
+var spaceCir = 35; //涓ゅ湀闂磋窛
+var intervalTop = 20; //璺濈椤剁璺濈
+var spaceLay = 55; //灞傞棿璺�
+var maxSpace = cirNum * spaceCir; //鍐呭鍦堟渶澶у樊鍊�
+var curVal = 1; //灞傛暟鎺у埗鍙橀噺
+var curCol = 0;//褰撳墠鏍癸紝澶т簬0琛ㄧず鎸夌収鏍规墽琛�
+var initAngle = 0; //瑙掑害鎺у埗
+var clockwise = true; //鏃堕拡鎺у埗
+var displayMode = 'all'; //鍐呭鏄剧ず
+var textSize = 16;//鏂囨湰妗嗗ぇ灏�
+
+var center_x;//浠撳績X鍧愭爣
+var center_y;//浠撳績y鍧愭爣
+
+var arr = [];//瀹氫箟缁戝畾浜嬩欢鏁扮粍
+
+//鑹插潡棰滆壊甯搁噺
+var color = null;
+var R = 0;
+var G = 0;
+var B = 0;
+var ctx;
+var timer;
+var t = -2;
+var caseHeight, sum_long;
+
+var isSleep = true;
+
+// 鍒濆鍖栧弬鏁�
+function initCanvasParam() {
+    isSleep = true;
+    cirNum = distrList.length; // 鍦堟暟
+    layNum = getLayNum(); // 灞傛暟
+    maxSpace = cirNum * spaceCir; // 鍐呭鍦堟渶澶у樊鍊�
+    curVal = 1; // 灞傛暟鎺у埗鍙橀噺
+    curCol = 0;
+    displayMode = 'all'; // 鍐呭鏄剧ず
+    arr = [];// 瀹氫箟缁戝畾浜嬩欢鏁扮粍
+};
+//鑾峰彇灞傞厤缃腑鐨勬渶楂樺眰鍊�
+function getLayNum() {
+    var i = 1;
+    bottomList.forEach(function (value, index, array) {
+        if (value > i) i = value;
+    });
+    return i;
+};
+
+
+//缁樺埗涓荤▼搴�
+function draw() {
+    var canvas = document.getElementById('canvas');
+    ctx = canvas.getContext('2d');
+    center_x = canvas.width / 3; //浠撳績X鍧愭爣
+    center_y = shortAxis / 3 + maxSpace + intervalTop; //浠撳績y鍧愭爣
+    ctx.strokeStyle = "black";
+    ctx.lineWidth = 1;
+    autoAdjust();
+    make_ellipse(ctx);
+    gainData(ctx);
+    entityBlock(ctx);
+    make_top_ellipse(ctx);
+    title(ctx);
+    showIndex(canvas, ctx);
+}
+
+//缁樺埗椤堕儴妞渾
+function make_top_ellipse() {
+    //缁樺埗椤堕儴妞渾
+    ctx.beginPath();
+    ctx.strokeStyle = "rgba(0,0,0,0.5)";
+    ctx.ellipse(center_x, center_y, longAxis + maxSpace, shortAxis + maxSpace, 0, 0, Math.PI * 2);
+    ctx.stroke();
+    ctx.closePath();
+}
+
+//楂樺害鑷皟鏁�
+function autoAdjust() {
+    //璁剧疆浠撻珮
+    caseHeight = spaceLay * (layNum - 1);
+    //璁$畻浠撳簱鍗犵敾甯冩�婚珮
+    sum_long = caseHeight + 2 * (maxSpace + shortAxis + intervalTop);
+    //鎬婚珮瓒婄晫杩涜璋冩暣灞傞棿璺�
+    if (eval(canvas.height) < eval(sum_long)) {
+        //浠撶璁剧疆涓烘渶楂�
+        caseHeight = canvas.height - 2 * (maxSpace + shortAxis + intervalTop);
+        //璋冩暣灞傞棿璺�
+        spaceLay = caseHeight / (layNum-1);
+    }
+};
+
+//缁樺埗浠撲綋
+function make_ellipse(ctx) {
+
+    //缁樺埗浠撳乏鍙宠竟鐣�
+    ctx.beginPath();
+    ctx.moveTo(center_x + (longAxis + maxSpace), center_y);
+    ctx.lineTo(center_x + (longAxis + maxSpace), center_y + caseHeight)
+    ctx.moveTo(center_x - (longAxis + maxSpace), center_y);
+    ctx.lineTo(center_x - (longAxis + maxSpace), center_y + caseHeight)
+    ctx.stroke();
+    ctx.closePath();
+
+    //濉厖鑳岄儴
+    var grd = ctx.createRadialGradient(center_x, center_y + caseHeight - longAxis, shortAxis, center_x, center_y + caseHeight - 2 * longAxis, 5 * longAxis);
+    //grd.addColorStop(0, "white");
+    // grd.addColorStop(1, "rgba(115,200,231,1)");
+    grd.addColorStop(0, "rgba(245,222,179)");
+    grd.addColorStop(1, "rgba(240 255 255)");
+
+    ctx.beginPath();
+    ctx.fillStyle = grd;
+    ctx.moveTo(center_x + (longAxis + maxSpace), center_y + caseHeight);
+    ctx.lineTo(center_x + (longAxis + maxSpace), center_y);
+    ctx.ellipse(center_x, center_y, longAxis + maxSpace, shortAxis + maxSpace, 0, 0, Math.PI, true);
+    ctx.lineTo(center_x - (longAxis + maxSpace), center_y + caseHeight);
+
+    ctx.fill();
+    ctx.closePath();
+
+    //缁樺埗搴曢儴妞渾
+    var grd = ctx.createRadialGradient(center_x, center_y + caseHeight - longAxis, shortAxis, center_x, center_y + caseHeight - 2 * longAxis, 5 * longAxis);
+    // grd.addColorStop(0, "white");
+    // grd.addColorStop(1, "rgba(115,200,231,1)");
+    grd.addColorStop(0, "rgba(245,222,179)");
+    grd.addColorStop(1, "rgba(240 255 255)");
+
+    ctx.beginPath();
+    ctx.fillStyle = grd;
+    ctx.ellipse(center_x, center_y + caseHeight, longAxis + maxSpace, shortAxis + maxSpace, 0, 0, Math.PI * 2);
+    ctx.stroke();
+    ctx.fill();
+    ctx.closePath();
+}
+
+//杩囨护鏁版嵁
+function gainData() {
+    for (i = 0; i < listPoints.length; i++) {
+        if (listPoints[i]['z'] + 1 === curVal) {
+            layPoints.push(listPoints[i])
+        }
+    }
+}
+
+//杩囨护鏁版嵁
+function gainData2() {
+    for (i = 0; i < listPoints.length; i++) {
+        if ((listPoints[i]['y'] + 1) == curCol) {
+            colPoints.push(listPoints[i])
+        }
+    }
+}
+
+//杩涜鎺掔嚎锛岀粯鍒惰壊鍧�
+function entityBlock(ctx) {
+    var z_peak = [1, cirNum];
+    var color_list = ["e9e9e9", "bbe5cc", "f8dabc", "f4c8d5", "958a9b", "9f9aa0"];
+
+    var turns = cirNum;
+    // for (i = 0; i < bottomList.length; i++) {
+    //     if(curVal > bottomList[i]){
+    //         turns = turns - 1;
+    //     }
+    // }
+
+    var showMax = turns;
+    //寰幆鐢熸垚姣忓湀
+    for (i = turns; i >= 1; i--) {
+        //鍐呭鏄剧ず閫昏緫鍒ゆ柇
+        if ((displayMode === 'outside') && !(i === cirNum)) {
+            continue;
+        } else if ((displayMode === 'inner') && i === cirNum) {
+            showMax -= 1;
+            continue;
+        }
+
+        var splNum = distrList[i - 1];
+        //鍙湁涓�鍒楁暟鎹椂鍊欐帶鍒朵腑蹇冧綅缃�
+        if(splNum === 1){
+            point = null;
+            //寰幆鎵惧埌瀵瑰簲鐐瑰��
+            for(z = 0;z < layPoints.length; z++){
+                if((layPoints[z]['x'] +1 === i )&&(layPoints[z]['y'] === 0)){
+                    point = layPoints[z];
+                    break;
+                }
+            }
+            point_x = center_x ;
+            point_y = center_y  + (curVal -1) * spaceLay ;
+            textBox(ctx,point,point_x,point_y);
+            continue;
+        }
+
+        ctx.beginPath();
+        ctx.strokeStyle = 'rgba(0,0,0,1)';
+        ctx.ellipse(center_x, center_y + (curVal-1) * spaceLay, longAxis + i * spaceCir, shortAxis + i * spaceCir, 0, 0, Math.PI * 2);
+
+        if (i === 1) {
+            var grd = ctx.createRadialGradient(center_x, center_y + caseHeight - longAxis, shortAxis, center_x, center_y + caseHeight - 2 * longAxis, 5 * longAxis);
+            grd.addColorStop(0, "rgba(245,222,179)");
+            grd.addColorStop(1, "rgba(240 255 255)");
+            ctx.fillStyle = grd;
+            ctx.fill();
+        } else {
+            var grd = ctx.createRadialGradient(center_x, center_y + caseHeight - longAxis, shortAxis, center_x, center_y + caseHeight - 2 * longAxis, 2 * longAxis);
+            grd.addColorStop(0, "white");
+            grd.addColorStop(1, "#" + color_list[i]);
+            ctx.fillStyle = grd;
+            ctx.fill();
+        }
+
+        ctx.stroke();
+        ctx.closePath();
+
+        //璁剧疆鐐瑰�间负null;
+        var point = null;
+
+        //姣忓湀鐨勮捣濮嬩笌鎴鏍�,splNum涓烘墍鍦ㄥ湀鐨勬牴鏁�
+        var startGen = 0, endGen = 0;
+        for(t = 0; t < distrList.length; t++){
+            if(t <= i - 1){
+                endGen += distrList[t];
+            }
+        }
+        startGen = endGen - splNum;
+        //寰幆鐢熸垚鍦堝唴鐐�
+        for (j = startGen; j < endGen; j++) {
+            //寰幆鎵惧埌瀵瑰簲鐐瑰��
+            for (z = 0; z < layPoints.length; z++) {
+                if ((layPoints[z]['x'] === (i - 1)) && (layPoints[z]['y'] === j)) {
+                    point = layPoints[z];
+                    break;
+                }
+            }
+
+            var angle;
+            //鍒ゆ柇鏄剧ず鏃堕拡
+            if (clockwise) {
+                angle = (2 * Math.PI / splNum) * j + initAngle;
+            } else {
+                angle = (2 * Math.PI / splNum) * (splNum - j) + initAngle;
+            }
+
+            point_x = center_x + (longAxis + i * spaceCir) * Math.cos(angle);
+            point_y = center_y + (curVal-1) * spaceLay + (shortAxis + i * spaceCir) * Math.sin(angle);
+            if(point){
+                textBox(ctx, point, point_x, point_y)
+            }
+        }
+    }
+}
+
+
+//杩涜鎺掔嚎锛岀粯鍒惰壊鍧�
+function entityBlock2(ctx) {
+    //璁剧疆鐐瑰�间负null;
+    var point = null;
+    //寰幆鐢熸垚鍦堝唴鐐�
+    for (j = 0; j < colPoints.length; j++) {
+        point = colPoints[j];
+        point_x = center_x;
+        point_y = center_y + (j + 1) * spaceLay;
+        textBox(ctx, point, point_x, point_y)
+    }
+}
+
+//缁樺埗涓�涓渾褰㈡枃鏈
+function textBox(ctx, point, x, y) {
+    val = point.temp;
+
+    if ((t % 2 === 1)) {
+        if (val == listLays[curVal - 1]['tempMax']) {   //姝ょ偣涓烘渶楂樻俯
+            ctx.fillStyle = "rgba(229,29,29,1)";
+        } else if (val == listLays[curVal - 1]['tempMin']) {  //姝ょ偣涓烘渶浣庢俯
+            ctx.fillStyle = "rgba(0,255,28,1)";
+        } else {
+            ctx.fillStyle = getColor(val);
+        }
+    } else {
+        ctx.fillStyle = getColor(val);
+    }
+
+    //濡傛灉鏄ˉ鐐癸紝涓嶅仛鐐逛綅娓叉煋
+    if (val == -102) {
+        return;
+    }
+    if ("澶囩敤" != val) {
+        val = val.toFixed(1);
+    }
+
+    if(val <= -100){
+        val = "澶囩敤";
+    }
+
+    ctx.beginPath();
+    ctx.lineWidth = 0.75;
+
+    ctx.arc(x, y, textSize, 0, 2 * Math.PI);
+    ctx.stroke();
+    ctx.fill();
+    ctx.fillStyle = "rgba(0,0,0,1)";
+    ctx.textAlign = 'center';
+
+
+    ctx.font = "600 14px Arial";
+    ctx.fillText(val, x, y + 3);
+    ctx.closePath();
+
+    arr.push({
+        'x': x - 0.6 * textSize,
+        'y': y - 0.7 * textSize,
+        'width': 2.1 * textSize,
+        'height': 2.2 * textSize,
+        'type': 'val',
+        'lay': point['z'],
+        'val': point['temp'],
+        'cir': point['x'],
+        'rows': point['y']
+    })
+}
+
+//鏍规嵁娓╁害鑾峰彇RGB
+function getColor(val) {
+    if (val >= 50) {
+        color = "rgba(255,0,0,1)";
+        return color;
+    } else if (val >= 20) {
+        G = Math.round(255 - 255 * ((val - 20) / 30));
+        color = "rgba(255," + G + ",0,1)";
+        return color;
+    } else if (val >= 0) {
+        R = Math.round(100 + (155 / 20) * val);
+        B = Math.round(30 - 1.5 * val);
+        color = "rgba(" + R + ",255," + B + ",1)";
+        return color;
+    } else if (val >= -10) {
+        R = Math.round(100 - 6.6 * (val * (-1)));
+        G = Math.round(255 - 2.2 * (val * (-1)));
+        B = Math.round(30 + 1.2 * (val * (-1)));
+        color = "rgba(" + R + "," + G + "," + B + ",1)";
+        return color;
+    } else {
+        color = "rgba(34,233,42,1)";
+        return color;
+    }
+}
+
+//鐫$湢
+function sleep() {
+    if(isSleep){
+        t++;
+        if (t >= 0) {
+            flash();
+        }
+        timer = setTimeout("sleep()", 400);
+    }
+}
+
+//闂儊绋嬪簭
+function flash() {
+    var canvas = document.getElementById('canvas');
+    var ctx = canvas.getContext('2d');
+    canvas.height = canvas.height;
+    layPoints = [];
+    arr = [];
+    make_ellipse(ctx);
+    gainData(ctx);
+    entityBlock(ctx);
+    make_top_ellipse(ctx);
+    title(ctx)
+}
+
+//闂儊绋嬪簭
+function flash2() {
+    var canvas = document.getElementById('canvas');
+    var ctx = canvas.getContext('2d');
+    canvas.height = canvas.height;
+    colPoints = [];
+    arr = [];
+
+    make_ellipse(ctx);
+
+    gainData2(ctx);
+
+    entityBlock2(ctx);
+
+    make_top_ellipse(ctx);
+    title(ctx)
+}
+
+//鏍囬鏍�
+function title(ctx) {
+
+    for (i = 1; i <= layNum; i++) {
+
+        start_x = center_x + (longAxis + maxSpace) + 20;
+        start_y = center_y + spaceLay * (i - 1);
+
+        if (curVal === i) {
+            var grad = ctx.createLinearGradient(start_x, start_y, start_x + 2 * spaceLay, start_y);
+            grad.addColorStop(0, "#2f2fff");
+            grad.addColorStop(0.7, "#b3b3ff");
+            grad.addColorStop(1, "#ffffff");
+            //璁剧疆涓烘湭閫夋嫨鏃剁殑娓愬彉濉厖
+        } else {
+            var grad = ctx.createLinearGradient(start_x, start_y, start_x + 2 * spaceLay, start_y);
+            // grad.addColorStop(0, "#a2baef");
+            // grad.addColorStop(0.8, "#ffffff");
+            grad.addColorStop(0, "rgba(245,222,179)");
+            grad.addColorStop(1, "rgba(240 255 255)");
+        }
+
+        ctx.fillStyle = grad;
+        ctx.lineWidth = 1;
+        ctx.strokeStyle = 'rgba(214,223,232,1)';
+        ctx.beginPath();
+        ctx.moveTo(start_x, start_y + 1); //鍘熺偣
+        ctx.lineTo(start_x + 1.8 * spaceLay, start_y + 1); //鍙崇Щ
+        ctx.lineTo(start_x + 1.8 * spaceLay, start_y + spaceLay - 1); //涓嬬Щ
+        ctx.lineTo(start_x, start_y + spaceLay - 1); //宸︾Щ
+        ctx.lineTo(start_x, start_y + 1); //涓婄Щ
+        ctx.stroke();
+        ctx.fill();
+        ctx.closePath();
+        //璁剧疆涓洪�夋嫨鏃剁殑瀛椾綋濉厖
+        if (curVal === i) {
+            ctx.fillStyle = 'rgba(255,14,0,1)';
+            ctx.font = "600 14px Arial";
+        } else {
+            ctx.fillStyle = 'rgba(30,30,30,1)';
+            ctx.font = "14px Arial";
+        }
+        val = "绗�" + i + "灞�";
+        ctx.textAlign = 'center';
+        ctx.fillText(val, start_x + 0.9 * spaceLay, start_y + 0.7 * spaceLay);
+        arr.push({
+            'x': start_x,
+            'y': start_y + 1,
+            'width': 1.8 * spaceLay,
+            'height': spaceLay,
+            'num': i,
+            'type': 'title'
+        })
+    }
+}
+
+//缁戝畾瑙﹀彂鐨勪簨浠�
+function draws(x, y, canvas, ctx) {
+    //鍒涘缓鐐瑰嚮浜嬩欢鐨勭敾甯冿紙鐢诲竷2锛�
+    ctx.rect(0, 0, canvas.width, canvas.height);
+    arr.forEach(function (v, i) {
+        ctx.beginPath();
+        //缁樺埗姣忎竴涓璞$殑鍖哄煙
+        ctx.rect(v.x, v.y, v.width, v.height);
+        ctx.closePath();
+
+        console.log(v);
+
+        //鍒ゆ柇鐐规槸鍚﹀湪鍖哄煙鍐�
+        var showData;
+        if (ctx.isPointInPath(x, y)) {
+            //鐐圭殑绫诲瀷涓哄��
+            if (v.type === 'val') {
+                //绫诲瀷涓簐al锛屽垯寮瑰嚭鐐逛俊鎭�
+                showData = "褰撳墠灞傦細" + (v.lay + 1) + "\n 褰撳墠鐢电紗锛氱" + (v.rows + 1) + "鏍�";
+                alert(showData);
+            } else { //鍏朵粬绫诲瀷鍒欏垏鎹㈡樉绀鸿壊鍧�
+                curVal = v['num'];
+                flash();
+            }
+        }
+    })
+}
+
+//缁戝畾浜嬩欢
+function showIndex(canvas, ctx) {
+    //鏁翠釜鐢诲竷瀵硅薄娣诲姞鐐瑰嚮浜嬩欢
+    canvas.addEventListener('click', function location(e) {
+        x = e.clientX;
+        y = e.clientY;
+        draws(x, y, canvas, ctx);
+    }, false);
+}
+
+// --------------- 鎸夐挳鐐瑰嚮浜嬩欢---------------------
+//涓婁竴琛�
+function last() {
+    if (curVal === 1) {
+        curVal = Number(layNum);
+    } else {
+        curVal -= 1;
+    }
+    flash();
+    renderGrainByLay(curVal);
+}
+
+//涓嬩竴琛�
+function next() {
+    if (curVal === Number(layNum)) {
+        curVal = 1;
+    } else {
+        curVal += 1;
+    }
+    flash();
+
+    renderGrainByLay(curVal);
+}
+
+//鏍规煡鐪�
+function showCol() {
+    isSleep = false;
+
+    curCol =  $("#value_col").val();
+    listPoints = grainData.listPoints;
+    listLays = grainData.listLays;
+    distrList = grainData.cable.split("-").map(Number);
+    bottomList = grainData.cableCir.split("-").map(Number);
+
+    flash2();
+
+    $("#switch_all").prop("checked", false);
+    form.render();
+}
+
+//瑙掑害鏃嬭浆
+function rotate() {
+    initAngle += (document.getElementById("rotate").value) * 2 * Math.PI / 360;
+    flash();
+}
+
+//鍏ㄩ儴鏄剧ず鐐瑰嚮浜嬩欢
+function display_all() {
+    isSleep = true;
+    displayMode = 'all';
+    flash();
+}
+
+//澶栭儴鏄剧ず鐐瑰嚮浜嬩欢
+function display_outside() {
+    isSleep = true;
+    displayMode = 'outside';
+    flash();
+}
+
+//鍐呴儴鏄剧ず鐐瑰嚮浜嬩欢
+function display_inside() {
+    isSleep = true;
+    displayMode = 'inner';
+    flash();
+}
+
+// 鍒濆鍖栦笁缁寸伯鎯�
+function initGrainChar3d() {
+    isSleep = true;
+    draw();
+};
+
+function clearGrainChart3d() {
+    initCanvasParam();
+    draw();
+};
+
+//閲嶆柊娓叉煋
+function resetGrainChart3d() {
+    listPoints = grainData.listPoints;
+    listLays = grainData.listLays;
+    distrList = grainData.cable.split("-").map(Number);
+    bottomList = grainData.cableCir.split("-").map(Number);
+
+    initCanvasParam();
+    draw();
+    sleep();//寮�濮嬮棯鐑�
+    curType = "z";
+    curVal = 1;
+    renderGrainByLay(curVal);
+}
+
+// 鏍规嵁鐢ㄦ埛閫夋嫨鐨勫眰锛屾覆鏌撴暟鎹紝浠�1寮�濮�
+function renderGrainByLay(num) {
+    var lay;
+    $.each(listLays, function (index, data) {
+        if (num == data.z) {
+            lay = data;
+            // 鏇存柊灞備俊鎭�
+            $("#dynamicAve").text(lay.tempAve);
+            $("#dynamicMax").text(lay.tempMax);
+            $("#dynamicMin").text(lay.tempMin);
+            $("#dynamicAveName").text("灞傚潎娓�");
+            $("#dynamicMaxName").text("灞傞珮娓�");
+            $("#dynamicMinName").text("灞備綆娓�");
+            return;
+        }
+    });
+};
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/cpc-pic.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/cpc-pic.png
new file mode 100644
index 0000000..2f43469
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/cpc-pic.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.gif b/fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.gif
new file mode 100644
index 0000000..c1e098a
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.gif
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.png
new file mode 100644
index 0000000..57f111f
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/img-dnxb.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/img-dnxb.png
new file mode 100644
index 0000000..7c0d7dc
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/img-dnxb.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg1.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg1.png
new file mode 100644
index 0000000..d826ae2
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg1.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg2.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg2.png
new file mode 100644
index 0000000..0a4c46a
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg2.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg3.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg3.png
new file mode 100644
index 0000000..1f72537
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg3.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg4.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg4.png
new file mode 100644
index 0000000..979f76d
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg4.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg5.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg5.png
new file mode 100644
index 0000000..942e648
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg5.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg6.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg6.png
new file mode 100644
index 0000000..333abe4
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg6.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg7.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg7.png
new file mode 100644
index 0000000..6009f24
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg7.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-color_03.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-color_03.png
new file mode 100644
index 0000000..959e6df
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-color_03.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-li-bg.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-li-bg.png
new file mode 100644
index 0000000..95875ad
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-li-bg.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1-h.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1-h.png
new file mode 100644
index 0000000..5e2df50
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1-h.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1.png
new file mode 100644
index 0000000..8d1dd47
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2-h.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2-h.png
new file mode 100644
index 0000000..06e698b
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2-h.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2.png
new file mode 100644
index 0000000..0f1caeb
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3-h.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3-h.png
new file mode 100644
index 0000000..ad2100c
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3-h.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3.png
new file mode 100644
index 0000000..0d312b2
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4-h.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4-h.png
new file mode 100644
index 0000000..924f9b1
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4-h.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4.png
new file mode 100644
index 0000000..419d3e2
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5-h.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5-h.png
new file mode 100644
index 0000000..74e4c0b
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5-h.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5.png
new file mode 100644
index 0000000..2397cac
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6-h.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6-h.png
new file mode 100644
index 0000000..9d45429
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6-h.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6.png
new file mode 100644
index 0000000..4366895
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-swt.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-swt.png
new file mode 100644
index 0000000..e223873
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-swt.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/oil-all.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/oil-all.png
new file mode 100644
index 0000000..46e634a
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/oil-all.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/qt-bg4.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/qt-bg4.png
new file mode 100644
index 0000000..78c75f1
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/qt-bg4.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_02.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_02.png
new file mode 100644
index 0000000..ef6dde0
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_02.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_03.png b/fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_03.png
new file mode 100644
index 0000000..c11a340
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_03.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/templates/grain/grain-check1.html b/fzzy-igdss-web/src/main/resources/templates/grain/grain-check1.html
new file mode 100644
index 0000000..bcdc81b
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/grain/grain-check1.html
@@ -0,0 +1,575 @@
+<!DOCTYPE html>
+<html lang="zh-cn" xmlns:th=http://www.thymeleaf.org>
+<head>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="renderer" content="webkit">
+        <title>鏅烘収绮簱绠$悊骞冲彴-绮儏妫�娴�</title>
+
+        <link rel="stylesheet" type="text/css" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+        <link rel="stylesheet" type="text/css" th:href="@{/grain/grain-style.css}">
+
+        <!--浣跨敤鎵撳嵃鎻掍欢 闅愯棌褰撳墠鎻掍欢 -->
+        <script th:src="@{/js/plugins/lodop/LodopFuncs.js}"></script>
+
+        <style>
+            .layui-checkbox-disbaled span {
+                background-color: #ed5565 !important;
+            }
+
+            #lq-left2 {
+                min-width: 295px;
+            }
+
+            .lq-left2-list li h3 {
+                float: left;
+                /*color: rgb(108, 119, 129);*/
+                color: #000;
+                font-size: 16px;
+                font-style: italic;
+            }
+
+            @media all and (max-width: 1650px) {
+                .lq-cPic-box {
+                    margin: 5% auto 0 auto;
+                }
+
+                .lq-center {
+                    /*padding-bottom: 50px;*/
+                    padding-bottom: 5px;
+                }
+
+                .lq-left2-list li {
+                    padding: 3% 6%;
+                }
+
+                .lq-cTop-item p span {
+                    font-size: 24px;
+                }
+            }
+
+            .lq-wendu {
+                width: 90px;
+                height: 200px;
+                position: absolute;
+                bottom: 0;
+                z-index: 99;
+                left: 5px;
+                margin-bottom: 55px;
+            }
+
+            .lq-center {
+                width: 80%;
+                position: relative;
+                padding-bottom: 5px;
+                overflow: hidden;
+            }
+
+            .lq-center2 {
+                position: relative;
+                padding-bottom: 5px;
+                overflow-y: hidden;
+            }
+
+            .lq-cLow-1 {
+                width: 50px;
+                border-right: 1px solid #333;
+            }
+
+            .lq-cLow {
+                width: 850px;
+            }
+
+            .lq-cLow-3 {
+                width: 15px;
+                border-right: 1px solid #333;
+            }
+
+            .lq-rMenu li {
+                height: 80px;
+            }
+
+            .layui-form-checkbox {
+                min-width: 100px;
+            }
+        </style>
+
+    </head>
+
+<body>
+<div class="l-container">
+    <div class="l-main layui-clear">
+
+        <div class="layui-row">
+
+            <div class="lq-left fl">
+                <div class="lq-left1 layui-clear radius-6 box-shadow">
+                    <form class="layui-form">
+
+                        <div class="layui-form-item lq-left1-from">
+                            <label class="layui-form-label">浠撳簱鍒楄〃</label>
+                            <div class="layui-input-block">
+                                <select name="depotId" id="depotId" lay-filter="select_depotId">
+                                    <option value=""></option>
+                                    <option th:each="depot,depotSet:${listDepot}"
+                                            th:value="${depot.id}" th:text="${depot.name}"
+                                            th:type="${depot.depotType}"></option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item lq-left1-from">
+                            <label class="layui-form-label">妫�娴嬫椂闂�</label>
+                            <div class="layui-input-block">
+                                <select name="batchId" id="batchId" lay-filter="select_batchId">
+                                    <option value=""></option>
+                                </select>
+                            </div>
+                        </div>
+
+                    </form>
+                </div>
+
+            </div>
+            <!-- 涓�-宸�  END-->
+
+            <div id="lq-center1" class="lq-center fr">
+                <div class="lq-cTop layui-clear" id="topInfo">
+                    <div class="lq-cTop-1 fl">
+                        <div class="layui-row">
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p>
+                                    <span id="tempAve">--</span>鈩�
+                                </p>
+                                <h4>绮潎娓�</h4>
+                            </div>
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p>
+                                    <span id="tempMax">--</span>鈩�
+                                </p>
+                                <h4>绮珮娓�</h4>
+                            </div>
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p>
+                                    <span id="tempMin">--</span>鈩�
+                                </p>
+                                <h4>绮綆娓�</h4>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="lq-cTop-2 fl ml4">
+                        <div class="layui-row">
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p>
+                                    <span id="dynamicAve">--</span>鈩�
+                                </p>
+                                <h4 id="dynamicAveName">灞傚潎娓�</h4>
+                            </div>
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p>
+                                    <span id="dynamicMax">--</span>鈩�
+                                </p>
+                                <h4 id="dynamicMaxName">灞傞珮娓�</h4>
+                            </div>
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p>
+                                    <span id="dynamicMin">--</span>鈩�
+                                </p>
+                                <h4 id="dynamicMinName">灞備綆娓�</h4>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="lq-cTop-3 fl ml4">
+                        <div class="layui-row">
+                            <div class="layui-col-lg6 lq-cTop-item">
+                                <p>
+                                    <span id="tempIn">--</span>鈩�
+                                </p>
+                                <h4>浠撳唴娓�</h4>
+                            </div>
+                            <div class="layui-col-lg6 lq-cTop-item">
+                                <p>
+                                    <span id="humidityIn">--</span>%
+                                </p>
+                                <h4>浠撳唴婀�</h4>
+                            </div>
+
+                        </div>
+                    </div>
+                    <div class="lq-cTop-4 fl ml4">
+                        <div class="layui-row">
+                            <div class="layui-col-lg6 lq-cTop-item">
+                                <p>
+                                    <span id="tempOut">--</span>鈩�
+                                </p>
+                                <h4>浠撳娓�</h4>
+                            </div>
+                            <div class="layui-col-lg6 lq-cTop-item">
+                                <p>
+                                    <span id="humidityOut">--</span>%
+                                </p>
+                                <h4>浠撳婀�</h4>
+                            </div>
+
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+            <!--涓�-涓�-END-->
+
+            <div class="lq-right fr">
+                <div class="lq-r-fx">
+                    <p>鍖�</p>
+                    <p>
+                        <span class="fl">瑗�</span><span class="fr">涓�</span>
+                    </p>
+                    <p>鍗�</p>
+                </div>
+            </div>
+            <!--涓�-鍙�-EDN-->
+
+        </div>
+
+        <!-- 涓婇儴鍒� END-->
+
+        <div class="layui-row">
+
+            <div class="lq-left fl" id="lq-left2">
+
+                <!-- 淇濈鍛樹俊鎭� -->
+                <div class="lq-left2 radius-6 box-shadow">
+                    <div class="lq-userbox">
+                        <div class="lq-user">
+                            <img th:src="@{/img/web/grain/rkbk-photo_02.png}"/>
+                            <p id="storeKeeperName">淇濈鍛�</p>
+                        </div>
+                        <dl class="lq-userItem radius-4">
+                            <dt>绾у埆</dt>
+                            <dd><span id="storeKeeperLevel">楂樼骇淇濈鍛�</span></dd>
+                        </dl>
+                        <dl class="lq-userItem radius-4">
+                            <dt>鐢佃瘽</dt>
+                            <dd>
+                                <span id="storeKeeperPhone">###</span>
+                            </dd>
+                        </dl>
+                    </div>
+                </div>
+
+
+                <!-- 璐т綅鍗$墖淇℃伅 -->
+                <div class="lq-left2 radius-6 box-shadow">
+                    <ul class="lq-left2-list">
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>浠撴埧绫诲瀷&nbsp;:
+                            </h3> <em id="depotTypeName"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>鍏ヤ粨鏃ユ湡&nbsp;:
+                            </h3> <em id="storeDate"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>鍌ㄩ噺(KG)&nbsp;:
+                            </h3> <em id="storageReal"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>绮鍝佺&nbsp;:
+                            </h3> <em id="foodVarietyName"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>浠撳簱鐘舵��&nbsp;:
+                            </h3> <em id="depotStatus"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>绮浜у湴&nbsp;:
+                            </h3> <em id="foodLocation"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>姘村垎(%)&nbsp;:
+                            </h3> <em id="perWet"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>鏉傝川(%)&nbsp;:
+                            </h3> <em id="perImpurity"></em>
+                        </li>
+                        <li>
+                            <h3>
+                                <span class="layui-badge-dot"></span>妫�娴嬩汉&nbsp;:
+                            </h3> <em id="checkUser"></em>
+                        </li>
+                    </ul>
+
+                </div>
+            </div>
+            <!--涓�-宸�- END-->
+
+            <div id="lq-center" class="lq-center2 fr">
+
+                <div style="margin-top: 10px; text-align: center;"
+                     id="canvas_parent">
+                    <canvas id="canvas" width="1200" height="600"></canvas>
+                </div>
+
+                <div class="lq-cLow layui-clear radius-6">
+                    <form class="layui-form">
+                        <div class="lq-cLow-left fl top5">
+                            <div class="lq-cLow-1 fl">
+                                鎿嶄綔锛�
+                                <!--<span>鍦ㄧ嚎</span>-->
+                            </div>
+
+                            <div class="lq-cLow-2 fl layui-form-item">
+                                <label class="layui-form-label">鍏ㄩ儴</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" value="all" id="switch_all"
+                                           lay-skin="switch" lay-filter="filter_switch2" checked>
+                                </div>
+                            </div>
+                            <div class="lq-cLow-2 fl layui-form-item">
+                                <label class="layui-form-label">澶栧洿</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" value="outer" id="switch_outer"
+                                           lay-skin="switch" lay-filter="filter_switch2">
+                                </div>
+                            </div>
+                            <div class="lq-cLow-2 fl layui-form-item">
+                                <label class="layui-form-label">鍫嗗唴</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" value="inner" id="switch_inner"
+                                           lay-skin="switch" lay-filter="filter_switch2">
+                                </div>
+                            </div>
+
+                            <div class="lq-cLow-3 fl">&nbsp;</div>
+
+                            <div class="lq-cLow-2 fl layui-form-item">
+                                <label class="layui-form-label">灞傛樉绀�</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" value="lay" id="switch_lay"
+                                           lay-skin="switch" lay-filter="filter_switch" checked>
+                                </div>
+                            </div>
+                            <div class="lq-cLow-2 fl layui-form-item">
+                                <label class="layui-form-label">琛屾樉绀�</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" value="row" id="switch_row"
+                                           lay-skin="switch" lay-filter="filter_switch">
+                                </div>
+                            </div>
+                            <div class="lq-cLow-2 fl layui-form-item">
+                                <label class="layui-form-label">鍒楁樉绀�</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" value="col" id="switch_col"
+                                           lay-skin="switch" lay-filter="filter_switch">
+                                </div>
+                            </div>
+
+                        </div>
+                        <div class="lq-cLow-right fr">
+                            <button type="button"
+                                    class="layui-btn layui-btn-normal layui-btn-radius"
+                                    id="btn_pre" onClick="last()">涓婁竴灞�
+                            </button>
+
+                            <button type="button"
+                                    class="layui-btn layui-btn-warm layui-btn-radius" id="btn_next"
+                                    num="1" typeTag="lay" onClick="next()">涓嬩竴灞�
+                            </button>
+
+                        </div>
+                    </form>
+                </div>
+
+
+            </div>
+
+            <!--涓�-涓�- END-->
+
+
+            <div class="lq-right fr">
+                <div class="lq-rMenu">
+                    <ul>
+                        <li><a href="javascript:;" onClick="checkGrain()"
+                               class="lq-a1"> <span class="l-icon lq-rMenu-icon1"></span>
+                            <p>鍗曚粨閲囬泦</p>
+                        </a></li>
+                        <li><a href="javascript:;" onClick="checkGrainBatch()"
+                               class="lq-a1"> <span class="l-icon lq-rMenu-icon2"></span>
+                            <p>澶氫粨閲囬泦</p>
+                        </a></li>
+                        <li><a href="javascript:;" onClick="compare()" class="lq-a3">
+                            <span class="l-icon lq-rMenu-icon3"></span>
+                            <p>绮儏瀵规瘮</p>
+                        </a></li>
+                        <li><a href="javascript:;" onClick="printSingle()"
+                               class="lq-a2"> <span class="l-icon lq-rMenu-icon4"></span>
+                            <p>鍗曚粨鎵撳嵃</p>
+                        </a></li>
+                        <li><a href="javascript:;" onClick="printBatch()"
+                               class="lq-a2"> <span class="l-icon lq-rMenu-icon4"></span>
+                            <p>澶氫粨鎵撳嵃</p>
+                        </a></li>
+                        <li><a href="javascript:;" onClick="exportBatch()"
+                               class="lq-a4"> <span class="l-icon lq-rMenu-icon5"></span>
+                            <p>瀵煎嚭EXCEL</p>
+                        </a></li>
+                        <li><a href="javascript:;" onClick="showOrderProgress()"
+                               class="lq-a4"> <span class="l-icon lq-rMenu-icon6"></span>
+                            <p>妫�娴嬭褰�</p>
+                        </a></li>
+                    </ul>
+                </div>
+            </div>
+            <!--涓�-鍙�- END-->
+        </div>
+
+
+    </div>
+    <!--l-main end-->
+</div>
+<!--l-container end-->
+
+<script th:inline="javascript">
+    //浠撳簱鍒楄〃
+    var listDepot = [[${listDepot}]];
+    //userId
+    var userId = [[${loginUser.loginName}]];
+    var deptId = [[${deptId}]];
+    var companyId = [[${loginUser.companyId}]];
+    var dept = [[${dept}]];
+
+    var DEPOT_TYPE = [[${depotType}]]; //浠撳簱绫诲瀷
+    var depotId = [[${depotId}]];// 褰撳墠浠撳簱id锛屽瓨鍦ㄧ┖鎯呭喌
+    var socket;
+</script>
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:src="@{/common/constant.js}"></script>
+<script th:src="@{/common/igds-common.js}"></script>
+<script th:src="@{/grain/PrintBuilder-lay.js}"></script>
+<script th:src="@{/grain/grainPoint1.js}"></script>
+<script th:src="@{/grain/grain-export.js}"></script>
+<script th:src="@{/grain/grain-check1.js}"></script>
+</body>
+
+<!-- 鏇村鎵规閫夋嫨 -->
+<div class="layui-tab-content" id="dialogMoreSelect"
+     style="display: none;">
+    <div class="layui-inline" id="checkDateMore"></div>
+</div>
+
+
+<!-- 瀹氫箟鎵归噺鎵撳嵃閫夋嫨鍐呭 -->
+<div class="layui-tab-content" id="batchPrintSelect"
+     style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">閫夋嫨鏃ユ湡锛�</label>
+                <div class="layui-input-inline left-input">
+                    <input type="text" name="printCheckDate" id="printCheckDate" placeholder="骞�-鏈�" autocomplete="off"
+                           class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-inline">
+                <label class="layui-form-label">閫夋嫨鏃堕棿</label>
+                <div class="layui-input-inline">
+                    <select id="printCheckHour">
+                        <option value="0">涓嶉�夋嫨</option>
+                        <option value="6">6鐐�</option>
+                        <option value="7">7鐐�</option>
+                        <option value="8">8鐐�</option>
+                        <option value="9">9鐐�</option>
+                        <option value="10">10鐐�</option>
+                        <option value="11">11鐐�</option>
+                        <option value="12">12鐐�</option>
+                        <option value="13">13鐐�</option>
+                        <option value="14">14鐐�</option>
+                        <option value="15">15鐐�</option>
+                        <option value="16">16鐐�</option>
+                        <option value="17">17鐐�</option>
+                        <option value="18">18鐐�</option>
+                        <option value="19">19鐐�</option>
+                        <option value="20">20鐐�</option>
+                        <option value="21">21鐐�</option>
+                        <option value="22">22鐐�</option>
+                    </select>
+                </div>
+                <button type="button" onclick="getPrintBatchDepot()"
+                        class="layui-btn layui-btn-sm">
+                    <i class="layui-icon layui-icon-search"></i>纭
+                </button>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <input type="checkbox" lay-filter="select_print_depot"
+                   th:each="depot,depotSet:${listDepot}" th:value="${depot.id}"
+                   th:title="${depot.name}" th:disabled="false">
+        </div>
+    </form>
+</div>
+
+<!-- 瀹氫箟姣旇緝鐨勯�夋嫨 -->
+<div class="layui-tab-content" id="compareSelect" style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <label class="layui-form-label">瀵规瘮鑼冨洿锛�</label>
+            <div class="layui-input-inline left-input">
+                <input type="text" name="compareCheckDate" id="compareCheckDate"
+                       placeholder="骞�-鏈�" autocomplete="off" class="layui-input">
+            </div>
+        </div>
+    </form>
+    <table class="layui-table" id="tableSelect" lay-filter="filterTable"></table>
+</div>
+
+<!-- 瀹氫箟鎵归噺瀵煎嚭閫夋嫨鍐呭 -->
+<div class="layui-tab-content" id="batchExportSelect"
+     style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <label class="layui-form-label">閫夋嫨鏃堕棿锛�</label>
+            <div class="layui-input-inline left-input">
+                <input type="text" name="printCheckDate2" id="printCheckDate2"
+                       placeholder="骞�-鏈�" autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <input type="checkbox" lay-filter="select_print_depot2"
+                   th:each="depot,depotSet:${listDepot}" th:value="${depot.id}"
+                   th:title="${depot.name}" th:disabled="false">
+        </div>
+    </form>
+</div>
+
+<!-- 鎵归噺閲囬泦寮瑰嚭妗� -->
+<div class="layui-tab-content" id="batchCheckSelect"
+     style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <input type="checkbox" lay-filter="select_check_depot"
+                   th:each="depot,depotSet:${listDepot}" th:value="${depot.id}"
+                   th:title="${depot.name}" th:disabled="false">
+        </div>
+    </form>
+</div>
+
+<!-- 绮儏閲囬泦鐐硅蛋鍔� -->
+<div class="layui-tab-content" id="pointChart" style="display: none;">
+    <div id="pointChartLine" style="width: 1300px; height: 500px;"></div>
+</div>
+
+</html>
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/templates/grain/grain-check4.html b/fzzy-igdss-web/src/main/resources/templates/grain/grain-check4.html
new file mode 100644
index 0000000..f61a36d
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/grain/grain-check4.html
@@ -0,0 +1,566 @@
+<!DOCTYPE html>
+<html lang="zh-cn" xmlns:th=http://www.thymeleaf.org>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="renderer" content="webkit">
+    <title>鏅烘収绮簱绠$悊骞冲彴-绮儏妫�娴�-绛掍粨</title>
+
+    <link rel="stylesheet" type="text/css" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+    <link rel="stylesheet" type="text/css" th:href="@{/grain/grain-style.css}">
+
+    <!--浣跨敤鎵撳嵃鎻掍欢 闅愯棌褰撳墠鎻掍欢 -->
+    <script th:src="@{/js/plugins/lodop/LodopFuncs.js}"></script>
+
+    <style>
+        .layui-checkbox-disbaled span {
+            background-color: #ed5565 !important;
+        }
+
+        .lq-rMenu {
+            position: relative;
+        }
+
+        .lq-left2-list li h3 {
+            float: left;
+            /*color: rgb(108, 119, 129);*/
+            color: #000;
+            font-size: 16px;
+            font-style: italic;
+        }
+
+        @media all and (max-width: 1650px) {
+            .lq-cPic-box {
+                margin: 5% auto 0 auto;
+            }
+
+            .lq-center {
+                padding-bottom: 50px;
+            }
+
+            .lq-left2-list li {
+                padding: 3% 6%;
+            }
+
+            .lq-cTop-item p span {
+                font-size: 24px;
+            }
+        }
+
+        .lq-center {
+            width: 79%;
+            position: relative;
+            padding-bottom: 50px;
+            overflow: hidden;
+        }
+
+        .lq-cLow-1 {
+            width: 50px;
+            border-right: 1px solid #333;
+        }
+
+        .lq-cLow {
+            width: 690px;
+            left: 320px;
+            height: 40px;
+        }
+
+        .lq-cLow-right .layui-btn {
+            height: 38px;
+            line-height: 38px;
+            width: 100px;
+        }
+
+        .lq-cLow-3 {
+            width: 15px;
+            border-right: 1px solid #333;
+        }
+
+        .lq-cTop {
+            margin-top: 10px;
+            float: left;
+            width: 28%;
+        }
+
+        .lq-cTop-1 {
+            width: 100%;
+        }
+
+        .lq-cTop-2 {
+            width: 100%;
+        }
+
+        .m-top-30 {
+            margin-top: 30px;
+        }
+
+        .m-top-15 {
+            margin-top: 18px;
+        }
+
+        .lq-right {
+            right: 10px;
+        }
+
+        .lq-rMenu li a p {
+            color: #FFF;
+        }
+
+        .lq-cLow-left {
+            margin-top: 8px;
+        }
+
+        .lq-rMenu li {
+            height: 80px;
+        }
+
+        .layui-form-checkbox {
+            min-width: 100px;
+        }
+
+        .layui-form-switch {
+            height: 30px;
+            line-height: 30px;
+            width: 50px;
+            margin-top: 13px;
+        }
+
+        .layui-form-switch i {
+            margin-top: 3px;
+        }
+
+        .input-root {
+            width: 40px;
+            margin-left: 20px;
+            margin-top: 10px;
+            height: 35px;
+        }
+
+        .btn-next {
+            margin-top: 20px !important;
+            cursor: pointer;
+        }
+
+        .kccz-data-dw {
+            position: absolute;
+            right: 10px;
+            top: 10px;
+            z-index: 9;
+            line-height: 34px;
+            display: block;
+            height: 32px;
+            text-align: center;
+            cursor: pointer;
+        }
+    </style>
+
+</head>
+
+<body>
+<div class="l-container">
+    <div class="l-main layui-clear">
+        <div class="lq-left fl">
+            <div class="lq-left1 layui-clear radius-6 box-shadow">
+                <form class="layui-form" action="">
+
+                    <div class="layui-form-item lq-left1-from">
+                        <label class="layui-form-label">浠撳簱鍒楄〃</label>
+                        <div class="layui-input-block">
+                            <select name="depotId" id="depotId" lay-filter="select_depotId">
+                                <option value=""></option>
+                                <option th:each="depot,depotSet:${listDepot}"
+                                        th:value="${depot.id}" th:text="${depot.name}"
+                                        th:type="${depot.depotType}"></option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item lq-left1-from">
+                        <label class="layui-form-label">妫�娴嬫椂闂�</label>
+                        <div class="layui-input-block">
+                            <select name="batchId" id="batchId" lay-filter="select_batchId">
+                                <option value=""></option>
+                            </select>
+                        </div>
+                    </div>
+
+                </form>
+            </div>
+
+            <!-- 娣诲姞淇濈鍛樹俊鎭�-->
+            <div class="lq-left2 radius-6 box-shadow">
+                <div class="lq-userbox">
+                    <div class="lq-user">
+                        <img th:src="@{/img/web/grain/rkbk-photo_02.png}"/>
+                        <p id="storeKeeperName">淇濈鍛�</p>
+                    </div>
+                    <dl class="lq-userItem radius-4">
+                        <dt>绾у埆</dt>
+                        <dd>楂樼骇淇濈鍛�</dd>
+                    </dl>
+                    <dl class="lq-userItem radius-4">
+                        <dt>鐢佃瘽</dt>
+                        <dd>
+                            <span id="storeKeeperPhone">###</span>
+                        </dd>
+                    </dl>
+                </div>
+            </div>
+
+            <div class="lq-left2 radius-6 box-shadow" id="mainLeft">
+                <ul class="lq-left2-list">
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>浠撴埧绫诲瀷&nbsp;:
+                        </h3> <em id="depotTypeName"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>鍏ヤ粨鏃ユ湡&nbsp;:
+                        </h3> <em id="storeDate"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>鍌ㄩ噺(KG)&nbsp;:
+                        </h3> <em id="storageReal"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>绮鍝佺&nbsp;:
+                        </h3> <em id="foodVarietyName"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>浠撳簱鐘舵��&nbsp;:
+                        </h3> <em id="depotStatus"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>绮浜у湴&nbsp;:
+                        </h3> <em id="foodLocation"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>姘村垎(%)&nbsp;:
+                        </h3> <em id="perWet"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>鏉傝川(%)&nbsp;:
+                        </h3> <em id="perImpurity"></em>
+                    </li>
+                    <li>
+                        <h3>
+                            <span class="layui-badge-dot"></span>妫�娴嬩汉&nbsp;:
+                        </h3> <em id="checkUser"></em>
+                    </li>
+                </ul>
+
+            </div>
+            <!--lq-left2 end-->
+
+        </div>
+        <!--lq-left end-->
+        <div id="lq-center" class="lq-center fr">
+            <div class="lq-cTop layui-clear" id="topInfo">
+                <div class="lq-cTop-1">
+                    <div class="layui-row">
+                        <div class="layui-col-lg4 lq-cTop-item">
+                            <p>
+                                <span id="tempAve">--</span>鈩�
+                            </p>
+                            <h4>绮潎娓�</h4>
+                        </div>
+                        <div class="layui-col-lg4 lq-cTop-item">
+                            <p>
+                                <span id="tempMax">--</span>鈩�
+                            </p>
+                            <h4>绮珮娓�</h4>
+                        </div>
+                        <div class="layui-col-lg4 lq-cTop-item">
+                            <p>
+                                <span id="tempMin">--</span>鈩�
+                            </p>
+                            <h4>绮綆娓�</h4>
+                        </div>
+                    </div>
+                </div>
+                <div class="lq-cTop-2 m-top-15">
+                    <div class="layui-row">
+                        <div class="layui-col-lg4 lq-cTop-item">
+                            <p>
+                                <span id="dynamicAve">--</span>鈩�
+                            </p>
+                            <h4 id="dynamicAveName">灞傚潎娓�</h4>
+                        </div>
+                        <div class="layui-col-lg4 lq-cTop-item">
+                            <p>
+                                <span id="dynamicMax">--</span>鈩�
+                            </p>
+                            <h4 id="dynamicMaxName">灞傞珮娓�</h4>
+                        </div>
+                        <div class="layui-col-lg4 lq-cTop-item">
+                            <p>
+                                <span id="dynamicMin">--</span>鈩�
+                            </p>
+                            <h4 id="dynamicMinName">灞備綆娓�</h4>
+                        </div>
+                    </div>
+                </div>
+                <div class="lq-cTop-3-2 m-top-15">
+                    <div class="layui-row">
+                        <div class="layui-col-lg6 lq-cTop-item">
+                            <p>
+                                <span id="tempIn">--</span>鈩�
+                            </p>
+                            <h4>浠撳唴娓�</h4>
+                        </div>
+                        <div class="layui-col-lg6 lq-cTop-item">
+                            <p>
+                                <span id="humidityIn">--</span>%
+                            </p>
+                            <h4>浠撳唴婀�</h4>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="lq-cTop-4-2 m-top-15">
+                    <div class="layui-row">
+                        <div class="layui-col-lg6 lq-cTop-item">
+                            <p>
+                                <span id="tempOut">--</span>鈩�
+                            </p>
+                            <h4>浠撳娓�</h4>
+                        </div>
+                        <div class="layui-col-lg6 lq-cTop-item">
+                            <p>
+                                <span id="humidityOut">--</span>%
+                            </p>
+                            <h4>浠撳婀�</h4>
+                        </div>
+
+                    </div>
+                </div>
+
+                <form class="layui-form" action="">
+                    <div class="lq-cTop-1 m-top-15">
+                        <div class="layui-row">
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <div>
+                                    <input type="checkbox" checked="" id="switch_all" value="all"
+                                           lay-skin="switch" lay-filter="filter_switch2" lay-text="寮�|鍏�">
+                                </div>
+                                <h4>鍏ㄥ眰鏌ョ湅</h4>
+                            </div>
+
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <div>
+                                    <input type="checkbox" value="outer" id="switch_outer"
+                                           lay-skin="switch" lay-filter="filter_switch2" lay-text="寮�|鍏�">
+                                </div>
+                                <h4>鏌ョ湅澶栧湀</h4>
+                            </div>
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p class="btn-next" onClick="last()" id="btn_pre">
+                                    <span>涓婁竴灞�</span>
+                                </p>
+                            </div>
+
+                        </div>
+                    </div>
+
+
+                    <div class="lq-cTop-1 m-top-15">
+                        <div class="layui-row">
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <div>
+                                    <input type="checkbox" value="inner" id="switch_inner"
+                                           lay-skin="switch" lay-filter="filter_switch2" lay-text="寮�|鍏�">
+                                </div>
+                                <h4>鏌ョ湅鍐呭湀</h4>
+                            </div>
+
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <div>
+                                    <input type="text"
+                                           class="layui-input input-root" id="value_col">
+                                    <em class="kccz-data-dw" onclick="showCol()">纭畾</em>
+                                </div>
+                                <h4>鍗曟牴鏌ョ湅</h4>
+                            </div>
+                            <div class="layui-col-lg4 lq-cTop-item">
+                                <p class="btn-next" onClick="next()" id="btn_next" num="1" typeTag="lay">
+                                    <span>涓嬩竴灞�</span>
+                                </p>
+                            </div>
+
+                        </div>
+                    </div>
+
+                </form>
+
+            </div>
+
+            <div style="margin-top: 10px; width: 70%; float: left;" id="canvas_parent">
+                <canvas id="canvas" width="950" height="720"></canvas>
+            </div>
+
+        </div>
+    </div>
+    <!--lq-center end-->
+
+    <div class="lq-right fr">
+        <div class="lq-r-fx">
+            <p>鍖�</p>
+            <p>
+                <span class="fl">瑗�</span><span class="fr">涓�</span>
+            </p>
+            <p>鍗�</p>
+        </div>
+        <div class="lq-rMenu">
+            <ul>
+                <li><a href="javascript:;" onClick="checkGrain()"
+                       class="lq-a1"> <span class="l-icon lq-rMenu-icon1"></span>
+                    <p>鍗曚粨閲囬泦</p>
+                </a></li>
+                <li><a href="javascript:;" onClick="checkGrainBatch()"
+                       class="lq-a2"> <span class="l-icon lq-rMenu-icon2"></span>
+                    <p>澶氫粨閲囬泦</p>
+                </a></li>
+                <li><a href="javascript:;" onClick="compare()" class="lq-a3">
+                    <span class="l-icon lq-rMenu-icon3"></span>
+                    <p>绮儏瀵规瘮</p>
+                </a></li>
+                <li><a href="javascript:;" onClick="printSingle()"
+                       class="lq-a4"> <span class="l-icon lq-rMenu-icon4"></span>
+                    <p>鍗曚粨鎵撳嵃</p>
+                </a></li>
+                <li><a href="javascript:;" onClick="printBatch()"
+                       class="lq-a5"> <span class="l-icon lq-rMenu-icon5"></span>
+                    <p>澶氫粨鎵撳嵃</p>
+                </a></li>
+                <li><a href="javascript:;" onClick="exportBatch()"
+                       class="lq-a4"> <span class="l-icon lq-rMenu-icon5"></span>
+                    <p>瀵煎嚭EXCEL</p>
+                </a></li>
+                <li><a href="javascript:;" onClick="showOrderProgress()"
+                       class="lq-a6"> <span class="l-icon lq-rMenu-icon6"></span>
+                    <p>妫�娴嬭褰�</p>
+                </a></li>
+            </ul>
+        </div>
+
+    </div>
+    <!--lq-right end-->
+
+</div>
+<!--l-main end-->
+</div>
+<!--l-container end-->
+
+<script th:inline="javascript">
+    //浠撳簱鍒楄〃
+    var listDepot = [[${listDepot}]];
+    //userId
+    var userId = [[${loginUser.loginName}]];
+    var deptId = [[${deptId}]];
+    var companyId = [[${loginUser.companyId}]];
+    var dept = [[${dept}]];
+    var DEPOT_TYPE = [[${depotType}]]; //浠撳簱绫诲瀷
+    var depotId = [[${depotId}]];// 褰撳墠浠撳簱id锛屽瓨鍦ㄧ┖鎯呭喌
+    var socket;
+</script>
+
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:src="@{/common/constant.js}"></script>
+<script th:src="@{/common/igds-common.js}"></script>
+<script th:src="@{/grain/PrintBuilder-lay.js}"></script>
+<script th:src="@{/grain/grainPoint4.js}"></script>
+<script th:src="@{/grain/grain-export.js}"></script>
+<script th:src="@{/grain/grain-check1.js}"></script>
+</body>
+
+<!-- 鏇村鎵规閫夋嫨 -->
+<div class="layui-tab-content" id="dialogMoreSelect"
+     style="display: none;">
+    <div class="layui-inline" id="checkDateMore"></div>
+</div>
+
+
+<!-- 瀹氫箟鎵归噺鎵撳嵃閫夋嫨鍐呭 -->
+<div class="layui-tab-content" id="batchPrintSelect"
+     style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <label class="layui-form-label">閫夋嫨鏃堕棿锛�</label>
+            <div class="layui-input-inline left-input">
+                <input type="text" name="printCheckDate" id="printCheckDate"
+                       placeholder="骞�-鏈�" autocomplete="off" class="layui-input">
+            </div>
+            <button type="button" onclick="getPrintBatchDepot()"
+                    class="layui-btn layui-btn-radius layui-btn-sm">
+                <i class="layui-icon layui-icon-search"></i>纭鏌ヨ
+            </button>
+        </div>
+        <div class="layui-inline">
+            <input type="checkbox" lay-filter="select_print_depot"
+                   th:each="depot,depotSet:${listDepot}" th:value="${depot.id}"
+                   th:title="${depot.name}" th:disabled="false">
+        </div>
+    </form>
+</div>
+
+<!-- 瀹氫箟姣旇緝鐨勯�夋嫨 -->
+<div class="layui-tab-content" id="compareSelect" style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <label class="layui-form-label">瀵规瘮鑼冨洿锛�</label>
+            <div class="layui-input-inline left-input">
+                <input type="text" name="compareCheckDate" id="compareCheckDate"
+                       placeholder="骞�-鏈�" autocomplete="off" class="layui-input">
+            </div>
+        </div>
+    </form>
+    <table class="layui-table" id="tableSelect" lay-filter="filterTable"></table>
+</div>
+
+<!-- 瀹氫箟鎵归噺瀵煎嚭閫夋嫨鍐呭 -->
+<div class="layui-tab-content" id="batchExportSelect"
+     style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <label class="layui-form-label">閫夋嫨鏃堕棿锛�</label>
+            <div class="layui-input-inline left-input">
+                <input type="text" name="printCheckDate2" id="printCheckDate2"
+                       placeholder="骞�-鏈�" autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <input type="checkbox" lay-filter="select_print_depot2"
+                   th:each="depot,depotSet:${listDepot}" th:value="${depot.id}"
+                   th:title="${depot.name}" th:disabled="false">
+        </div>
+    </form>
+</div>
+
+
+<!-- 鎵归噺閲囬泦寮瑰嚭妗� -->
+<div class="layui-tab-content" id="batchCheckSelect"
+     style="display: none;">
+    <form class="layui-form layui-form-pane">
+        <div class="layui-inline">
+            <input type="checkbox" lay-filter="select_check_depot"
+                   th:each="depot,depotSet:${listDepot}" th:value="${depot.id}"
+                   th:title="${depot.name}" th:disabled="false">
+        </div>
+    </form>
+</div>
+
+<!-- 绮儏閲囬泦鐐硅蛋鍔� -->
+<div class="layui-tab-content" id="pointChart" style="display: none;">
+    <div id="pointChartLine" style="width: 1300px; height: 500px;"></div>
+</div>
+
+</html>
diff --git a/fzzy-igdss-web/src/main/resources/templates/grain/order-list.html b/fzzy-igdss-web/src/main/resources/templates/grain/order-list.html
new file mode 100644
index 0000000..dcbd4fe
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/grain/order-list.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html>
+<html lang="zh-cn" xmlns:th=http://www.thymeleaf.org>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="renderer" content="webkit">
+    <title>Layui</title>
+
+    <link rel="stylesheet" type="text/css" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+
+    <style>
+        body {
+            font-family: "寰蒋闆呴粦", Arial, sans-serif;
+            font-size: 14px;
+            background: #f3f5f8;
+        }
+
+        table {
+            overflow-x: hidden;
+        }
+
+        .progress {
+            padding: 15px;
+        }
+
+        .progress-r {
+            padding-left: 15px;
+        }
+
+        .progress-r span {
+            font-size: 16px;
+            font-weight: bold;
+        }
+
+        .layui-progress {
+            background-color: #666;
+        }
+
+        .layui-table {
+            color: #0C0C0C;
+        }
+
+        .layui-table thead tr {
+            border-bottom: 3px solid #53adce;
+        }
+
+        .layui-table thead th {
+            font-weight: bold;
+        }
+
+        .remark {
+            padding: 0px 15px 0px 15px;
+            height: 22px;
+            line-height: 22px;
+            color: #FF5722;
+            font-size: 12px;
+            font-weight: bold;
+            float: left;
+        }
+
+        .btn-clean {
+            background-color: #FF5722;
+            color: #FFF;
+        }
+
+        .s-error {
+            font-weight: bold;
+            color: #FF5722;
+        }
+
+        .s-complete {
+            font-weight: bold;
+            color: #5FB878;
+        }
+
+        .s-none {
+            font-weight: bold;
+        }
+    </style>
+</head>
+
+<body>
+<div class="layui-clear">
+
+    <div class="layui-row progress">
+
+        <div class="layui-col-md6">
+            <div class="layui-progress layui-progress-big"
+                 lay-filter="filter-progress" lay-showpercent="yes">
+                <div class="layui-progress-bar" lay-percent="0%"
+                     id="filter-progress"></div>
+            </div>
+        </div>
+
+        <div class="layui-col-md6">
+            <div class="progress-r">
+                鍏辨墽琛屽懡浠わ細<span id="check_sumNum">0</span>涓� &nbsp;&nbsp;&nbsp;&nbsp;
+                宸叉墽琛岋細<span id="check_completeNum">0</span>涓� &nbsp;&nbsp;&nbsp;&nbsp;
+                澶辫触锛�<span id="check_errorNum">0</span>涓�
+            </div>
+        </div>
+
+    </div>
+
+    <div class="layui-row">
+        <table class="layui-hide" id="tableOrder"
+               lay-data="{id: 'tableOrder'}"></table>
+    </div>
+
+    <div class="layui-row">
+        <span class="remark">娉細鏁版嵁涓哄綋鍓嶅簱鍖鸿繎8涓皬鏃跺唴鎵ц璁板綍鍜岀粺璁★紝鍙互娓呴櫎锛屼笉褰卞搷鎵ц鏃ュ織</span>
+        <button type="button"
+                class="layui-btn layui-btn-primary btn-clean layui-btn-xs"
+                onclick="clean()">鐐瑰嚮娓呴櫎
+        </button>
+
+        <button type="button"
+                class="layui-btn layui-btn-primary btn-clean layui-btn-xs"
+                id="btn-auto" onclick="autoFlush()">鑷姩鍒锋柊涓�
+        </button>
+    </div>
+
+</div>
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:inline="javascript">
+    //涓氬姟绫诲瀷
+    var bizType = [[${bizType}]];
+    //userId
+    var userId = [[${loginUser.loginName}]];
+    var companyId = [[${loginUser.companyId}]];
+    var deptId = [[${deptId}]];//褰撳墠浜烘墍鍦ㄩ儴闂↖D
+
+    var orderList;
+
+    var autoTag = true;
+
+    var table;
+    var element;
+
+    layui.use(['table', 'element'], function () {
+        table = layui.table;
+        element = layui.element;
+        table.render({
+            elem: '#tableOrder',
+            url: '/grain/query-order-list?deptId=' + deptId,
+            width: 980,
+            height: 460,
+            cols: [
+                [
+                    {field: 'exeTime', width: 170, title: '鎵ц鏃堕棿', sort: true, align: 'center'},
+                    {field: 'depotName', width: 150, title: '鎵�灞炰粨搴�', sort: true, align: 'center'},
+                    {field: 'exeUser', width: 130, title: '妫�娴嬩汉', align: 'center'},
+                    {
+                        field: 'status', width: 120, title: '鎵ц鐘舵��', align: 'center', templet: function (d) {
+                            if ('IN_PROGRESS' == d.status) {
+                                return "<span class='s-none'>鎵ц涓�</span>";
+                            } else if ('SEND_ERROR' == d.status) {
+                                return "<span class='s-error'>鍙戦�佸け璐�</span>";
+                            } else if ('ANALYSIS_ERROR' == d.status) {
+                                return "<span class='s-error'>瑙f瀽澶辫触</span>";
+                            } else if ("TIMEOUT_ERROR" == d.status) {
+                                return "<span class='s-error'>澶勭悊瓒呮椂</span>";
+                            } else {
+                                return "<span class='s-complete'>鎴愬姛瀹屾垚</span>";
+                            }
+                        }
+                    },
+                    {field: 'errorMsg', title: '鎵ц璇存槑', align: 'center'}
+                ]
+            ],
+            page: false,
+            done: function (res, cuur, count) {
+                orderList = res.data;
+                exeProgress();
+            }
+        });
+    });
+
+    function exeProgress() {
+        //console.log("--------------exeProgress----------------");
+        //console.log(orderList);
+        var sumNum = 0, completeNum = 0, errorNum = 0, per = 0;
+        if (orderList) {
+            $.each(orderList, function (index, data) {
+                sumNum = orderList.length;
+                if ("SEND_ERROR" == data.status || "ANALYSIS_ERROR" == data.status || "TIMEOUT_ERROR" == data.status) {
+                    completeNum++;
+                    errorNum++;
+                }
+                if ("COMPLETE" == data.status) {
+                    completeNum++;
+                }
+            });
+        }
+
+        if (sumNum > 0) {
+            per = (completeNum / sumNum * 100).toFixed(1);
+        }
+        // console.log("-------per------"+per);
+        element.progress('filter-progress', per + "%");
+        //璧嬪��
+        $("#check_sumNum").text(sumNum);
+        $("#check_completeNum").text(completeNum);
+        $("#check_errorNum").text(errorNum);
+    }
+
+    /**
+     *娓呴櫎鏃ュ織
+     */
+    function clean() {
+        var data = {
+            deptId: deptId,
+            companyId: companyId,
+            bizType: bizType
+        };
+        $.ajax({
+            type: "POST",
+            url: "/grain/clean-order-list",
+            dataType: "json",
+            contentType: "application/json;charset=UTF-8",
+            data: JSON.stringify(data),
+            success: function (result) {
+                if (result.code != "0000") {
+                    layer.alert(result.data);
+                } else {
+                    layer.msg("鏃ュ織娓呴櫎瀹屾垚锛�");
+                }
+            },
+            error: function () {
+                layer.alert("绯荤粺鍚庡彴鎵ц澶辫触锛岃鍒锋柊閲嶈瘯锛�");
+            }
+        });
+    }
+
+    function autoFlush() {
+        if (autoTag) {
+            autoTag = false;
+            $("#btn-auto").text("宸插仠姝㈠埛鏂�");
+        } else {
+            autoTag = true;
+            $("#btn-auto").text("鑷姩鍒锋柊涓�");
+        }
+    }
+
+    //璁剧疆鑷姩鍒锋柊
+    var iframeTimer;
+    window.onload = function () {
+        if (iframeTimer) {
+            clearInterval(iframeTimer);
+        }
+        iframeTimer = setInterval(function () {
+            if (autoTag) {
+                table.reload("tableOrder", {
+                    url: '/grain/query-order-list?deptId=' + deptId
+                });
+            }
+        }, 6000);
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index b5d2091..a8ecfbb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
         <module>fzzy-igdss-view</module>
         <module>fzzy-igdss-web</module>
         <module>fzzy-igdss-doc</module>
+        <module>fzzy-igdss-io</module>
     </modules>
 
 

--
Gitblit v1.9.3