sgj
4 天以前 824d4e6be22a1d101897bf1be575bb5e3ed33845
Merge remote-tracking branch 'origin/master'
已修改6个文件
已添加71个文件
9336 ■■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/OrderRespEnum.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainData.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainLay.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainParam.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainPoint.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainRow.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/LayPage.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/PrintModeData.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/LogOperation.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GrainMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/LogOperationMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ExeBaseRequest.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/request/GrainReqData.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ReqStatus.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/request/ThReqData.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/response/BaseResponse.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/response/GrainResponse.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GrainService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/LogOperationService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainDataBuilder.java 636 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder01.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder03.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilder04.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/GrainPrintBuilderLay01.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-io/pom.xml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-io/src/main/java/com/fzzy/igds/io/manager/RemoteManager.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-io/src/main/java/com/fzzy/igds/io/order/ExeOrderService.java 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/RemoteGrainService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/grain/GrainController.java 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainExportBuilder.java 346 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/grain/GrainManager.java 498 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/grain/PrintBuilder-lay.js 576 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/grain/grain-check1.js 718 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/grain/grain-export.js 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/grain/grain-style.css 618 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/grain/grainPoint1.js 1348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/grain/grainPoint4.js 633 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/cpc-pic.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.gif 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/img-dnxb.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg1.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg2.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg3.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg4.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg5.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg6.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg7.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-color_03.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-li-bg.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1-h.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2-h.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3-h.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4-h.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5-h.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6-h.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-swt.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/oil-all.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/qt-bg4.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_02.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_03.png 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/grain/grain-check1.html 575 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/grain/grain-check4.html 566 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/grain/order-list.html 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}
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", "信息解析成功"),
    MSG_ERROR("MSG_ERROR", "信息解析异常"),
    MSG_TIMEOUT("MSG_TIMEOUT", "解析超时"),
    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;
    }
}
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;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainLay.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.fzzy.igds.data;
import lombok.Data;
/**
 * ç²®æƒ…数据解析对象-层信息
 */
@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;
    }
}
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;//仓库类型
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainPoint.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.fzzy.igds.data;
import lombok.Data;
/**
 * ç²®æƒ…数据解析对象-采集点对象信息,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;
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/GrainRow.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.fzzy.igds.data;
import lombok.Data;
/**
 * ç²®æƒ…数据解析对象-列信息
 */
@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;
    }
}
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 å¯¹Page<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;
    }
}
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; //异常信息
}
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;
}
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> {
}
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> {
}
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;//自定义命令ID
    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);
    }
}
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;//多仓并发:针对FZZY-TCP-V6协议使用
    public GrainReqData() {
        super();
    }
}
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", "解析异常"),
    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;
    }
}
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;//仓温湿通道
}
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;//请求代码
    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();
    }
}
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);
    }
}
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));
    }
}
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);
    }
}
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);
    }
}
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);
    }
}
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("当前仓库:{},布线规则不正确,无法解析粮情信息……", 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代表电缆根号从0开始,z=代表所在层从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("油桶仓={} è§£æžè¿‡ç¨‹ä¸­æ²¡æœ‰èŽ·å–åˆ°æ²¹é¢é«˜åº¦ä¿¡æ¯ï¼Œé»˜è®¤æ˜¾ç¤ºä¸º0", depotConf.getDepotId());
        } else {
            if (result.getOilHeight().indexOf("-") == -1) {
                result.setOilHeight(result.getOilHeight() + "-"
                        + result.getOilHeight());
                log.warn("油桶仓={} è§£æžä¸­æ²¡æœ‰èŽ·å–å»ºç­‘ç‰©çš„é«˜åº¦ä¿¡æ¯ï¼Œé»˜è®¤å»ºç­‘ç‰©é«˜åº¦ç­‰äºŽæ¶²ä½é«˜åº¦",
                        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 + "";
    }
}
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);
    }
}
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;\">天气:weather &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 >仓温:c_tIn</td><td >仓湿:c_hIn</td><td colspan=\"2\">气温:c_tOut</td><td colspan=\"2\">气湿:c_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;\">制表时间:createBillDate</span></div>");
        sb.append("</div></body></html>");
        log.debug("获取到的粮情模板={}", sb.toString());
        result.setModel(sb.toString());
        return result;
    }
}
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;\">天气:weather &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 >仓温:c_tIn</td><td >仓湿:c_hIn</td><td colspan=\"2\">气温:c_tOut</td><td colspan=\"2\">气湿:c_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;\">制表时间:createBillDate</span></div>");
        sb.append("</div></body></html>");
        log.debug("获取到的粮情模板={}", sb.toString());
        result.setModel(sb.toString());
        return result;
    }
}
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;\">天气:weather &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;\">制表时间:createBillDate</span></div>");
        sb.append("</div></body></html>");
        log.debug("获取到的粮情模板={}", sb.toString());
        result.setModel(sb.toString());
        return result;
    }
}
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;\">天气:weather &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 >仓温:c_tIn</td><td >仓湿:c_hIn</td><td colspan=\"2\">气温:c_tOut</td><td colspan=\"2\">气湿:c_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;\">制表时间:createBillDate</span></div>");
        sb.append("</div></body></html>");
        log.debug("获取到的粮情模板={}", sb.toString());
        result.setModelType("ROW");
        result.setModel(sb.toString());
        return result;
    }
}
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>
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";
    /**
     * ç”¨äºŽå­˜æ”¾æ‰€æœ‰RemoteGrainService æŽ¥å£çš„实现类
     */
    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);
    }
}
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,生成规则:igds: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,生成规则:igds: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;
    }
    /**
     * å‘½ä»¤ç¼“存生成规则:appName: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;
    }
}
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 è¿œç¨‹æ‰§è¡Œç²®æƒ…接口,需要在每个协议包中实现    ç³»ç»Ÿé»˜è®¤å®žçŽ°ä¸€ä¸ªDefault
 * @Author CZT
 * @Date 2025/12/9 10:19
 */
public interface RemoteGrainService {
    /**
     * å½“前协议名称,系统根据协议名称自动调用分机匹配的协议实现
     *
     *
     */
    String getProtocol();
    /**
     * ç²®æƒ…检测接口
     *
     * @param request è¯·æ±‚参数
     */
    GrainResponse checkGrain(ExeBaseRequest<GrainReqData> request);
}
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>
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);
    }
}
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;
    }
}
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:开头表示执行出错,正常返回文件名称
     */
    public String exportByMapData(Map<String, GrainData> dataMap, List<Depot> listDepot) {
        String result;
        try {
            //创建一个新的EXCEL
            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;
    }
    /**
     * æ ¹æ®å•元格标签替换值,需要替换的标记为c_
     *
     * @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 = è¡¨ç¤ºåœˆæ•°ï¼Œy=总根数,z= å½“前层
     * @author: Andy
     * @update-time: 2022/12/12
     */
    private String getNewCellValue02(GrainData data, String oldCellValue, List<GrainPoint> listPoints) {
        //单元格赋值 c_x_y_z å…¶ä¸­x = è¡¨ç¤ºåœˆæ•°ï¼Œy=总根数,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 + "";
    }
}
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, "执行成功");
    }
}
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("初始化模板失败!!");
        }
    });
};
/**
 * å•仓打印,如果直接返回的模板信息为NULL,重新获取下模板
 * @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 ? "正常" : 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--) { //值的格式:cell+层+行+列
                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>容重(g/L)</td><td>" + getCheckValue(qualityItemMap, "C03") + "</td>";
    } else {
        model += "<tr><td>容重(kg/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模版打印为A4
 * @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 "/";
};
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()
        });
    }
}
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;
}
/**
 * åˆ›å»ºä¸€ä¸ªA标签执行下载
 * @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();
}
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;
    }
}
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)";
        //将点击事件触发区域对象写入arr集合
        // 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];
    //当层显示时,把要显示的点添加到z_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]);
                }
            }
        }
    }
    //当列显示时,把要显示的点添加到x_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]);
                }
            }
        }
    }
    //当行显示时,把要显示的点添加到y_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);
    //给arr集合中的每一个对象添加点击事件
    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') {
                //类型为val,则弹出点信息
                // 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);
        //将显示方式切换事件加入arr数组
        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);
        }
        //将显示方式切换事件加入arr数组
        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));
        //将显示方式切换事件加入arr数组
        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("列低温");
    }
};
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') {
                //类型为val,则弹出点信息
                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;
        }
    });
};
fzzy-igdss-web/src/main/resources/static/img/web/grain/cpc-pic.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.gif
fzzy-igdss-web/src/main/resources/static/img/web/grain/fenxi-icon.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/img-dnxb.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg1.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg2.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg3.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg4.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg5.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg6.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-c-bg7.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-color_03.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-li-bg.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1-h.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon1.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2-h.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon2.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3-h.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon3.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4-h.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon4.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5-h.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon5.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6-h.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-r-icon6.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/lq-swt.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/oil-all.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/qt-bg4.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_02.png
fzzy-igdss-web/src/main/resources/static/img/web/grain/rkbk-photo_03.png
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>
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>
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}]];//当前人所在部门ID
    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'>解析失败</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>
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>