czt
2026-01-08 51603d9354ddef5d8960fe0e6b3e21059da5ff66
数量检测提交1-页面数据交互
已删除1个文件
已修改10个文件
759 ■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Quantity.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/QuantityConf.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/QuantityKey.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/QuantityService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/QuantityConf.view.xml 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/security/SecurityController.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/security/manager/SecManager.java 112 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/quantity.css 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/quantity.js 290 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/quantity.html 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Quantity.java
@@ -18,7 +18,6 @@
@Entity
@Table(name = "d_quantity")
@TableName("d_quantity")
@IdClass(QuantityKey.class)
@EqualsAndHashCode(callSuper = false)
public class Quantity extends BizBaseEntity implements Serializable {
@@ -30,16 +29,14 @@
    public static String SORT_PROP = "receiveDate";
    @Id
    @Column(name = "batch_id", columnDefinition = "varchar(40) COMMENT '批次编号'")
    @Column(name = "batch_id", columnDefinition = "varchar(40) COMMENT '批次编号:仓库编码_yyyyMMddHHmmss'")
    @TableField("batch_id")
    private String batchId;
    @Id
    @Column(name = "dept_id", columnDefinition = "varchar(40) COMMENT '所属库区'")
    @TableField("dept_id")
    private String deptId;
    @Id
    @Column(name = "depot_id", columnDefinition = "varchar(40) COMMENT '所属仓库'")
    @TableField("depot_id")
    private String depotId;
@@ -64,7 +61,7 @@
    @TableField("points")
    private String points;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
    @Column(name = "receive_date", columnDefinition = "datetime COMMENT '检测时间'")
    @TableField("receive_date")
    private Date receiveDate;
@@ -80,4 +77,5 @@
    @Transient
    @TableField(exist = false)
    private Depot depotData;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/QuantityConf.java
@@ -135,6 +135,10 @@
    @TableField("url_out")
    private String urlOut;
    @Column(name = "ptz_type", columnDefinition = "varchar(40) COMMENT '云台方式'")
    @TableField("ptz_type")
    private String ptzType;
    @Column(name = "media_addr", columnDefinition = "varchar(100) COMMENT 'RTSP地址'")
    @TableField("media_addr")
    private String mediaAddr;
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/QuantityKey.java
ÎļþÒÑɾ³ý
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fzzy.igds.domain.FileInfo;
import com.fzzy.igds.domain.Quantity;
import com.fzzy.igds.mapper.FileMapper;
import com.fzzy.igds.utils.Base64Util;
import com.fzzy.igds.utils.ContextUtil;
@@ -31,6 +32,29 @@
    private FileMapper fileMapper;
    /**
     * æ ¹æ®æ¡ä»¶èŽ·å–é™„ä»¶ä¿¡æ¯
     * @param companyId
     * @param bizId
     * @return
     */
    public List<FileInfo> listFile(String companyId, String bizId) {
        if (StringUtils.isEmpty(companyId)) {
            companyId = ContextUtil.getCompanyId();
        }
        if (StringUtils.isEmpty(bizId)){
            return null;
        }
        QueryWrapper<FileInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("company_id", companyId);
        queryWrapper.eq("biz_id", bizId);
        queryWrapper.orderByAsc("create_time");
        return fileMapper.selectList(queryWrapper);
    }
    /**
     * å¼‚步执行附件保存
     * @param files     é™„件信息
     * @param bizId     ä¸šåŠ¡id
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/QuantityService.java
@@ -70,6 +70,25 @@
    }
    /**
     * æŸ¥è¯¢æ•°æ®åˆ—表
     * @param depotId
     * @param limit    æŸ¥è¯¢æ¡æ•°
     * @return
     */
    public List<Quantity> getQuantityList(String depotId, Integer limit) {
        if (StringUtils.isEmpty(depotId)) {
            return null;
        }
        QueryWrapper<Quantity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("depot_id", depotId);
        queryWrapper.orderByDesc("receive_date");
        queryWrapper.last("LIMIT " + limit);
        return quantityMapper.selectList(queryWrapper);
    }
    /**
     * æŸ¥è¯¢é…ç½®ä¿¡æ¯ï¼Œæ ¹æ®åº“区编码获取
     *
     * @param companyId
fzzy-igdss-view/src/main/java/com/fzzy/igds/QuantityConf.view.xml
@@ -17,19 +17,22 @@
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">name</Property>
        </Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="deptId">
        <Property></Property>
        <Property name="label">所属分库</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getAllData&quot;).getResult()}</Property>
          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getDeptByUserType&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">kqmc</Property>
        </Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="name">
        <Property></Property>
        <Property name="label">设备名称</Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="sn">
        <Property></Property>
@@ -134,6 +137,17 @@
          <Property name="keyProperty">dictValue</Property>
          <Property name="valueProperty">dictLabel</Property>
        </Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="ptzType">
        <Property></Property>
        <Property name="label">云台方式</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerPtzType&quot;).getResult()}</Property>
          <Property name="keyProperty">dictValue</Property>
          <Property name="valueProperty">dictLabel</Property>
        </Property>
        <Property name="required">true</Property>
      </PropertyDef>
      <PropertyDef name="urlIn">
        <Property></Property>
@@ -189,7 +203,6 @@
      <ToolBar>
        <ToolBarButton>
          <ClientEvent name="onClick">view.get(&quot;#dsMain&quot;).insert();&#xD;
            view.get(&quot;#depotId&quot;).set(&quot;readOnly&quot;,false);&#xD;
            view.get(&quot;#dgMain&quot;).show();</ClientEvent>
          <Property name="caption">新增</Property>
          <Property name="exClassName">btn1</Property>
@@ -200,7 +213,6 @@
          <ClientEvent name="onClick">&#xD;
            var select = view.get(&quot;#dataGridMain&quot;).get(&quot;selection&quot;);&#xD;
            if(select){&#xD;
            view.get(&quot;#depotId&quot;).set(&quot;readOnly&quot;,true)&#xD;
            view.get(&quot;#dgMain&quot;).show();&#xD;
            }else{&#xD;
            $notify(&quot;请选择需要修改的数据……&quot;);&#xD;
@@ -312,7 +324,7 @@
      <ClientEvent name="onShow">//根据仓库类型不同,显示不同的配置信息</ClientEvent>
      <Property name="iconClass">fa fa-tasks</Property>
      <Property name="caption">数量检测参数</Property>
      <Property name="width">60%</Property>
      <Property name="width">80%</Property>
      <Property name="closeable">false</Property>
      <Property name="height">90%</Property>
      <Buttons>
@@ -335,13 +347,13 @@
        </Button>
      </Buttons>
      <Children>
        <GroupBox layoutConstraint="padding:5">
        <FieldSet layout="padding:5">
          <Property name="caption">基本信息</Property>
          <Buttons/>
          <Children>
            <AutoForm>
              <Property name="dataSet">dsMain</Property>
              <Property name="cols">*,*,*</Property>
              <Property name="cols">*,*,*,*</Property>
              <Property name="labelSeparator">:</Property>
              <Property name="labelAlign">right</Property>
              <Property name="labelWidth">110</Property>
@@ -351,14 +363,13 @@
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">sn</Property>
                <Property name="property">sn</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement id="depotId">
                <Property name="name">depotId</Property>
                <Property name="property">depotId</Property>
                <Property name="readOnly">false</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">deptId</Property>
                <Property name="property">deptId</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
@@ -371,6 +382,11 @@
                <Property name="property">port</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">sn</Property>
                <Property name="property">sn</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">protocol</Property>
                <Property name="property">protocol</Property>
@@ -381,21 +397,16 @@
                <Property name="property">status</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">remark</Property>
                <Property name="property">remark</Property>
                <Editor/>
              </AutoFormElement>
            </AutoForm>
          </Children>
        </GroupBox>
        <GroupBox layoutConstraint="padding:5">
        </FieldSet>
        <FieldSet layout="padding:5">
          <Property name="caption">摄像头配置</Property>
          <Buttons/>
          <Children>
            <AutoForm>
              <Property name="dataSet">dsMain</Property>
              <Property name="cols">*,*,*</Property>
              <Property name="cols">*,*,*,*</Property>
              <Property name="labelSeparator">:</Property>
              <Property name="labelAlign">right</Property>
              <Property name="labelWidth">110</Property>
@@ -415,6 +426,11 @@
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">chanNum</Property>
                <Property name="property">chanNum</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">loginId</Property>
                <Property name="property">loginId</Property>
                <Property name="readOnly">false</Property>
@@ -426,18 +442,8 @@
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">chanNum</Property>
                <Property name="property">chanNum</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">playType</Property>
                <Property name="property">playType</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">urlIn</Property>
                <Property name="property">urlIn</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
@@ -445,17 +451,12 @@
                <Property name="property">snapType</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">urlOut</Property>
                <Property name="property">urlOut</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">cameraSn</Property>
                <Property name="property">cameraSn</Property>
                <Property name="name">ptzType</Property>
                <Property name="property">ptzType</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
              <AutoFormElement layoutConstraint="colSpan:3">
                <Property name="name">mediaAddr</Property>
                <Property name="property">mediaAddr</Property>
                <Property name="trigger">triggerMedia</Property>
@@ -465,10 +466,30 @@
                  </TextEditor>
                </Editor>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">urlIn</Property>
                <Property name="property">urlIn</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">urlOut</Property>
                <Property name="property">urlOut</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">cameraSn</Property>
                <Property name="property">cameraSn</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">remark</Property>
                <Property name="property">remark</Property>
                <Editor/>
              </AutoFormElement>
            </AutoForm>
          </Children>
        </GroupBox>
        <GroupBox layoutConstraint="padding:5">
        </FieldSet>
        <FieldSet layout="padding:5">
          <Property name="caption">数量检测参数</Property>
          <Buttons/>
          <Children>
@@ -515,7 +536,7 @@
              </AutoFormElement>
            </AutoForm>
          </Children>
        </GroupBox>
        </FieldSet>
      </Children>
      <Tools/>
    </Dialog>
fzzy-igdss-web/src/main/java/com/fzzy/security/SecurityController.java
@@ -4,11 +4,11 @@
import com.fzzy.igds.camera.data.ApiCameraResp;
import com.fzzy.igds.constant.CameraPlayType;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.data.GroupIndexData;
import com.fzzy.igds.data.IgdsBaseParam;
import com.fzzy.igds.data.PageResponse;
import com.fzzy.igds.data.PatrolSuperData;
import com.fzzy.igds.domain.Camera;
import com.fzzy.igds.domain.PatrolRecord;
import com.fzzy.igds.domain.*;
import com.fzzy.igds.utils.ContextUtil;
import com.fzzy.igds.utils.SystemUtil;
import com.fzzy.common.manager.CommonManager;
@@ -228,8 +228,7 @@
     * @return
     */
    @RequestMapping("/quantity")
    public String infrared(
            @RequestParam(value = "type", required = false) String type,
    public String infrared(@RequestParam(value = "type", required = false) String type,
            ModelMap view) {
        SysUser user = ContextUtil.getLoginUser();
@@ -237,17 +236,47 @@
        String deptId = ContextUtil.subDeptId(user);
        view.put("deptId", deptId);
//        List<InfraredCamera> listCamera = infraredManager.listCamera(deptId, user.getCompanyId());
//
//        if(null == listCamera){
//            listCamera = new ArrayList<>();
//            listCamera.add(new InfraredCamera());
//        }
//        view.put("listCamera", listCamera);
        //查询库区下数量检测设备
        List<QuantityConf> listCamera = secManager.getQuantityConfByDeptId(deptId);
        view.put("listCamera", listCamera);
        return prefix + "/quantity";
    }
    /**
     * æŸ¥è¯¢è®°å½•信息
     * @param param
     * @return
     */
    @RequestMapping("/quantity-list")
    @ResponseBody
    public PageResponse<List<Quantity>> quantityList(@RequestBody IgdsBaseParam param) {
        return secManager.quantityList(param);
    }
    /**
     * æŸ¥è¯¢æ›²çº¿å›¾ä¿¡æ¯
     * @param param
     * @return
     */
    @RequestMapping("/quantity-chart")
    @ResponseBody
    public PageResponse<GroupIndexData> getQuantityChart(@RequestBody IgdsBaseParam param) {
        return secManager.getQuantityChart(param);
    }
    /**
     * æŸ¥è¯¢æ›²çº¿å›¾ä¿¡æ¯
     * @param param
     * @return
     */
    @RequestMapping("/quantity-files")
    @ResponseBody
    public PageResponse<List<FileInfo>> getQuantityFiles(@RequestBody IgdsBaseParam param) {
        return secManager.getQuantityFiles(param);
    }
    /*------------------巡更轨迹页面------------------*/
fzzy-igdss-web/src/main/java/com/fzzy/security/manager/SecManager.java
@@ -5,20 +5,16 @@
import com.fzzy.igds.camera.data.ApiCameraData;
import com.fzzy.igds.camera.data.ApiCameraResp;
import com.fzzy.igds.constant.RespCodeEnum;
import com.fzzy.igds.data.PageResponse;
import com.fzzy.igds.data.PatrolSuperData;
import com.fzzy.igds.domain.Camera;
import com.fzzy.igds.domain.Dept;
import com.fzzy.igds.domain.Patrol;
import com.fzzy.igds.domain.PatrolRecord;
import com.fzzy.igds.service.CoreDeptService;
import com.fzzy.igds.service.PatrolService;
import com.fzzy.igds.service.SecCameraService;
import com.fzzy.igds.data.*;
import com.fzzy.igds.domain.*;
import com.fzzy.igds.service.*;
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.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
@@ -35,6 +31,8 @@
public class SecManager {
    @Resource
    private CommonManager commonManager;
    @Resource
    private SecCameraService secCameraService;
    @Resource
    private ApiCameraManager apiCameraManager;
@@ -43,10 +41,11 @@
    @Resource
    private CoreDeptService coreDeptService;
    @Resource
    private CommonManager commonManager;
    private QuantityService quantityService;
    @Resource
    private FileService fileService;
    /**
     *
     * @param deptId
     * @param companyId
     * @return
@@ -67,6 +66,7 @@
    /**
     * æ ¹æ®ç›‘控ID获取监控信息
     *
     * @param companyId
     * @param cameraId
     * @return
@@ -83,6 +83,7 @@
    /**
     * èŽ·å–æ’­æ”¾ä¿¡æ¯
     *
     * @param param
     * @return
     */
@@ -125,6 +126,7 @@
    /**
     * äº‘台控制
     *
     * @param param
     * @return
     */
@@ -138,6 +140,7 @@
    /**
     * é¢„置位设置
     *
     * @param param
     * @return
     */
@@ -146,7 +149,6 @@
    }
    /**
     *
     * @param params
     * @return
     */
@@ -162,11 +164,12 @@
        }
        secCameraService.refreshCache(ContextUtil.getCompanyId());
        return new PageResponse<>(RespCodeEnum.CODE_0000, "执行成功!!");
        return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "执行成功!!");
    }
    /**
     * å·¡æ£€ç»Ÿè®¡
     *
     * @return
     */
    public PatrolSuperData patrolTrack() {
@@ -230,4 +233,87 @@
        return patrolRecords;
    }
    /**
     * èŽ·å–æ•°é‡æ£€æµ‹é…ç½®ä¿¡æ¯
     *
     * @param deptId
     * @return
     */
    public List<QuantityConf> getQuantityConfByDeptId(String deptId) {
        return quantityService.getConfList(ContextUtil.getCompanyId(), deptId);
    }
    /**
     * æŸ¥è¯¢æ•°é‡æ£€æµ‹è®°å½•,默认查询4条
     *
     * @param param
     * @return
     */
    public PageResponse<List<Quantity>> quantityList(IgdsBaseParam param) {
        if (StringUtils.isEmpty(param.getDepotId())) {
            return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "参数为空!!");
        }
        List<Quantity> quantityList = quantityService.getQuantityList(param.getDepotId(), 4);
        if (null == quantityList || quantityList.isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "数据为空!!");
        }
        return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "执行成功!!", quantityList);
    }
    /**
     * æŸ¥è¯¢æ•°é‡æ£€æµ‹è®°å½•,默认查询7条,封装成图表信息
     *
     * @param param
     * @return
     */
    public PageResponse<GroupIndexData> getQuantityChart(IgdsBaseParam param) {
        if (StringUtils.isEmpty(param.getDepotId())) {
            return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "参数为空!!");
        }
        List<Quantity> quantityList = quantityService.getQuantityList(param.getDepotId(), 7);
        if (null == quantityList || quantityList.isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "数据为空!!");
        }
        GroupIndexData data = new GroupIndexData();
        for (int i = (quantityList.size() - 1); i >= 0; i--) {
            data.getXaxis().add(DateFormatUtils.format(quantityList.get(i).getReceiveDate(), "MM-dd HH:mm"));
            data.getSeriesData().add(quantityList.get(i).getWeight() + "");
        }
        return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "执行成功!!", data);
    }
    /**
     * æŸ¥è¯¢æ£€æµ‹æ•°æ®å¯¹åº”抓图
     * @param param
     * @return
     */
    public PageResponse<List<FileInfo>> getQuantityFiles(IgdsBaseParam param) {
        if (StringUtils.isEmpty(param.getKey())) {
            return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "参数为空!!");
        }
        List<FileInfo> fileList = fileService.listFile(null, param.getKey());
        if (null == fileList || fileList.isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "数据为空!!");
        }
        //判断文件是否存在
        for (FileInfo fileInfo : fileList) {
            fileInfo.setFilePath(commonManager.isImgExit(fileInfo.getFilePath(), null));
        }
        return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "执行成功!!", fileList);
    }
}
fzzy-igdss-web/src/main/resources/static/security/quantity.css
@@ -304,12 +304,19 @@
    margin-top: 5px;
}
.render_btn {
    background-color: #f1ba1f;
    color: #333;
    height: 30px;
}
.alert-item {
    border-left: 4px solid #e6a23c;
    background-color: #fdf6ec;
    padding: 10px 15px;
    margin-bottom: 10px;
    border-radius: 0 4px 4px 0;
    height: 75px;
}
.alert-item.accent {
@@ -320,6 +327,11 @@
.alert-item.gray {
    border-left-color: #909399;
    background-color: #f2f2f2;
}
.alert-item.blue {
    border-left-color: #205191;
    background-color: #dde8f1;
}
.alert-header {
@@ -342,6 +354,7 @@
    font-size: 13px;
    color: #606266;
    margin-bottom: 10px;
    margin-top: 20px;
}
.tool-grid {
@@ -526,7 +539,7 @@
}
.w-select {
    min-width: 150px;
    min-width: 250px;
    min-height: 36px;
    border-radius: 4px;
}
fzzy-igdss-web/src/main/resources/static/security/quantity.js
@@ -1,6 +1,12 @@
var layer;
var form;
var curCamera;
var firstQuantity;
var hisChart = null;   //曲线图
var listRecord;
var fileRecord;
var names = ['12-01', '12-02', '12-03', '12-04', '12-05', '12-06', '12-07'];
var data = [2560000, 2510000, 2540000, 2530000, 2490000, 2610000, 2570000];
layui.use(['layer'], function () {
    form = layui.form;
@@ -22,17 +28,13 @@
    //选择摄像头后触发的事件
    const cameraSelect = document.getElementById('select-camera');
    cameraSelect.addEventListener('change', function() {
        const selectedCamera = this.value;
        //console.log("--------------"+selectedCamera);
        video(selectedCamera);
        const selectId = this.value;
        // æ›´æ–°æ¸©åº¦èµ°åŠ¿å›¾
        // updateEchartsTemp(selectedCamera);
        ajaxData(selectId);
    });
    // åˆå§‹åŒ–ECharts温度走势图
    initEchartsTemp();
    // åˆå§‹åŒ–走势图
    initEcharts(names, data);
});
@@ -40,39 +42,283 @@
 * è§†é¢‘播放
 * @param selectId
 */
function video(selectId) {
function ajaxData(selectId) {
    curCamera = null;
    //从列表中获取摄像头信息
    curCamera = listCamera.find(camera => camera.id === selectId);
    if (!curCamera) { layer.msg('没有获取到当前摄像头信息……', {icon: 1, time: 1200});}
    curCamera = listCamera.find(camera => camera.depotId === selectId);
    if (!curCamera) {
        layer.msg('没有获取到当前摄像头信息……', {icon: 1, time: 1200});
        return;
    }
    //获取视频
    video();
    //渲染走势图
    ajaxEcharts();
    //渲染记录
    ajaxListRecord();
    //渲染抓拍图
    ajaxSnapImg();
}
/**
 * æ›´æ–°æ¸©åº¦èµ°åŠ¿å›¾
 * @param selectId
 * è¯·æ±‚图表信息
 */
function updateEchartsTemp(selectId) {
function ajaxSnapImg() {
    if(!firstQuantity){
        renderSnapImg();
        return;
    }
    fileRecord = null;
    var data = {
        cameraId: selectId
        key: firstQuantity.batchId
    };
    $.ajax({
        type: 'POST',
        url: "/security/infrared/chart-data",
        url: "/security/quantity-files",
        dataType: 'JSON',
        contentType: "application/json;charset=UTF-8",
        data: JSON.stringify(data),
        success: function (result) {
            //layer.msg("信息更新完成!!");
            if (result.code != "SUCCESS") {
                renderSnapImg();
            } else {
                fileRecord = result.data;
                renderSnapImg();
            }
        },
        error: function (result) {
           // layer.msg(result.msg);
            renderSnapImg();
        }
    });
}
/**
 * æ¸²æŸ“抓图
 * @returns {null}
 */
function renderSnapImg() {
    if (!fileRecord) return null;
    if (fileRecord.length === 0) return null;
    var record = fileRecord[0];
    if (record) {
        $("#file-time1").text(record.createTime);
        $("#file-img1").attr("src", record.filePath);
    } else {
        $("#file-time1").text("----");
        $("#file-img1").attr("src", "/img/web/security/p-snap.jpg");
    }
    record = fileRecord[1];
    if (record) {
        $("#file-time2").text(record.createTime);
        $("#file-img2").attr("src", record.filePath);
    } else {
        $("#file-time2").text("----");
        $("#file-img2").attr("src", "/img/web/security/p-snap.jpg");
    }
    record = fileRecord[2];
    if (record) {
        $("#file-time3").text(record.createTime);
        $("#file-img3").attr("src", record.filePath);
    } else {
        $("#file-time3").text("----");
        $("#file-img3").attr("src", "/img/web/security/p-snap.jpg");
    }
    record = fileRecord[3];
    if (record) {
        $("#file-time4").text(record.createTime);
        $("#file-img4").attr("src", record.filePath);
    } else {
        $("#file-time4").text("----");
        $("#file-img4").attr("src", "/img/web/security/p-snap.jpg");
    }
}
/**
 * è¯·æ±‚图表信息
 */
function ajaxEcharts() {
    var data = {
        depotId: curCamera.depotId
    };
    $.ajax({
        type: 'POST',
        url: "/security/quantity-chart",
        dataType: 'JSON',
        contentType: "application/json;charset=UTF-8",
        data: JSON.stringify(data),
        success: function (result) {
            if (result.code != "SUCCESS") {
                renderEcharts(null);
            } else {
                renderEcharts(result.data);
            }
        },
        error: function (result) {
            renderEcharts(null);
        }
    });
}
/**
 * æ¸²æŸ“图表
 * @param chartData
 */
function renderEcharts(chartData) {
    var chart = hisChart;
    if (chartData && chartData.xaxis.length > 0 && chartData.seriesData.length > 0) {
        chart.option.xAxis.data = chartData.xaxis;
        chart.option.series[0].data = chartData.seriesData;
        chart.chart.setOption(chart.option, true);
    } else {
        chart.option.xAxis.data = names;
        chart.option.series[0].data = data;
        chart.chart.setOption(chart.option, true);
    }
    hisChart = chart;
}
/**
 * è¯·æ±‚记录
 */
function ajaxListRecord() {
    firstQuantity = null;
    listRecord = null;
    var data = {
        depotId: curCamera.depotId
    };
    $.ajax({
        type: 'POST',
        url: "/security/quantity-list",
        dataType: 'JSON',
        contentType: "application/json;charset=UTF-8",
        data: JSON.stringify(data),
        success: function (result) {
            if (result.code != "SUCCESS") {
                renderListRecord();
            } else {
                listRecord = result.data;
                renderListRecord();
            }
        },
        error: function (result) {
            renderListRecord();
        }
    });
}
/**
 * æ¸²æŸ“记录
 * @returns {null}
 */
function renderListRecord() {
    if (!listRecord) return null;
    if (listRecord.length === 0) return null;
    var record = listRecord[0];
    if (record) {
        firstQuantity = record;
        $("#record_title1").text("检测重量:" + record.weight + " KG");
        $("#record_time1").text(record.receiveDate);
        $("#record_content1").text(record.remark);
    } else {
        $("#record_title1").text("检测重量:---- KG");
        $("#record_time1").text("----");
        $("#record_content1").text("检测重量为---- KG,实际重量为---- KG,误差小于-%。");
    }
    record = listRecord[1];
    if (record) {
        $("#record_title2").text("检测重量:" + record.weight + " KG");
        $("#record_time2").text(record.receiveDate);
        $("#record_content2").text(record.remark);
    } else {
        $("#record_title2").text("检测重量:---- KG");
        $("#record_time2").text("----");
        $("#record_content2").text("检测重量为---- KG,实际重量为---- KG,误差小于-%。");
    }
    record = listRecord[2];
    if (record) {
        $("#record_title3").text("检测重量:" + record.weight + " KG");
        $("#record_time3").text(record.receiveDate);
        $("#record_content3").text(record.remark);
    } else {
        $("#record_title3").text("检测重量:---- KG");
        $("#record_time3").text("----");
        $("#record_content3").text("检测重量为---- KG,实际重量为---- KG,误差小于-%。");
    }
    record = listRecord[3];
    if (record) {
        $("#record_title4").text("检测重量:" + record.weight + " KG");
        $("#record_time4").text(record.receiveDate);
        $("#record_content4").text(record.remark);
    } else {
        $("#record_title4").text("检测重量:---- KG");
        $("#record_time4").text("----");
        $("#record_content4").text("检测重量为---- KG,实际重量为---- KG,误差小于-%。");
    }
}
/**
 * è§†é¢‘播放
 * @param
 */
function video() {
    var data = {
        id: curCamera.cameraSn,
        playType: curCamera.playType
    };
    $.ajax({
        type: 'POST',
        url: "/security/get-media",
        dataType: 'JSON',
        contentType: "application/json;charset=UTF-8",
        data: JSON.stringify(data),
        success: function (result) {
            if (result.code != "SUCCESS") {
                layer.msg(result.msg, {icon: 1, time: 1200});
            } else {
                toPlay(result.playUrl);
            }
        },
        error: function (result) {
            layer.msg("未获取到播放信息!!", {icon: 1, time: 1200});
        }
    });
}
/**
 * æ’­æ”¾è§†é¢‘
 * @param url
 */
function toPlay(url) {
    var html = '';
    if (url) {
        html += '<iframe src="' + url + '" width="100%" height="100%" frameborder="0" allowfullscreen></iframe>';
    } else {
        html += '<img src="/img/web/security/p-snap.jpg">';
    }
    $("#divPlugin2").html(html);
}
// åˆå§‹åŒ–ECharts温度走势图
function initEchartsTemp() {
function initEcharts(names, data) {
    // åˆå§‹åŒ–ECharts温度走势图
    var temperatureChartDom = document.getElementById('temperatureChart');
    var temperatureChart = echarts.init(temperatureChartDom);
@@ -102,7 +348,7 @@
            {
                type: 'category',
                boundaryGap: false,
                data: ['12-01', '12-02', '12-03', '12-04', '12-05', '12-06', '12-07']
                data: names
            }
        ],
        yAxis: [
@@ -131,12 +377,14 @@
                        { offset: 1, color: 'rgba(15, 52, 96, 0.05)' }
                    ])
                },
                data: [2560000, 2510000, 2540000, 2530000, 2490000, 2610000, 2570000]
                data: data
            }
        ]
    };
    // æ¸²æŸ“图表
    option && temperatureChart.setOption(option);
    hisChart = {"chart": temperatureChart, "option": option};
    // çª—口大小变化时调整图表大小
    window.addEventListener('resize', function() {
        temperatureChart.resize();
fzzy-igdss-web/src/main/resources/templates/security/quantity.html
@@ -22,24 +22,24 @@
                    <h2>实时监控画面</h2>
                    <div class="layui-row layui-col-space10">
                        <div class="layui-inline">
                            <label class="layui-form-label">仓库列表</label>
                            <label class="layui-form-label">设备列表</label>
                            <select id="select-camera" class="layui-form-select w-select">
                                <option>请选择……</option>
                                <option th:each="camera:${listCamera}" th:value="${camera.id}" th:text="${camera.name}"></option>
                                <option th:each="camera:${listCamera}" th:value="${camera.depotId}" th:text="${camera.name}"></option>
                            </select>
                        </div>
                    </div>
                </div>
                <div class="card-body">
                    <!-- åŒè§†é¢‘展示区域 -->
                    <div class="video-container" id="video-container" style="grid-template-columns: 1fr;">
                        <!-- çƒ­æˆåƒè§†é¢‘画面 -->
                        <div class="video-box" id="thermal-video">
                            <div class="video-label">
                                <i class="layui-icon layui-icon-camera-fill"></i> çƒ­æˆåƒè§†é¢‘
                            </div>
                            <div id="divPlugin2">
                                <img th:src="@{/img/web/security/p-snap.jpg}" alt="热成像实时画面">
                    <div class="video-container" id="video-container" style="grid-template-columns: 1fr;min-height: 610px;">
<!--                        &lt;!&ndash; çƒ­æˆåƒè§†é¢‘画面 &ndash;&gt;-->
<!--                        <div class="video-box" id="thermal-video">-->
<!--                            <div class="video-label">-->
<!--                                <i class="layui-icon layui-icon-camera-fill"></i>-->
<!--                            </div>-->
                            <div id="divPlugin2" style="height: 100%">
                                <img th:src="@{/img/web/security/p-snap.jpg}" alt="">
                            </div>
                            <!-- æ¸©åº¦æ ‡è®°ç‚¹
                            <div class="temp-mark" title="异常高温点: 32°C">
@@ -63,7 +63,7 @@
                            </div>
                            -->
                            
                        </div>
<!--                        </div>-->
                    </div>
                    <!-- ç®€åŒ–的视频控制工具栏-->
@@ -86,6 +86,12 @@
                        <button class="layui-btn layui-btn-default layui-btn-sm">
                           å‡å€ <i class="layui-icon layui-icon-subtraction"></i>
                        </button>
                        <button class="layui-btn layui-btn-default layui-btn-sm">
                            å¼€å§‹æ£€æµ‹ <i class="layui-icon layui-icon-subtraction"></i>
                        </button>
                        <button class="layui-btn layui-btn-default layui-btn-sm">
                            åœæ­¢æ£€æµ‹ <i class="layui-icon layui-icon-subtraction"></i>
                        </button>
                    </div>
@@ -100,46 +106,46 @@
                <div class="card-body">
                    <div class="record-grid">
                        <!-- æ™®é€šè§†é¢‘记录 -->
                        <div class="record-item">
                        <div class="record-item" style="border: 2px solid var(--warning-color);">
                            <div class="record-img">
                                <img th:src="@{/img/web/security/p-snap.jpg}" alt="普通视频记录">
                                <img id="file-img1" th:src="@{/img/web/security/p-snap.jpg}">
                            </div>
                            <div class="record-info">
                                <div class="record-name">粮仓1号</div>
                                <div class="record-time">2025-12-03 10:00</div>
                                <div class="record-name">过程抓拍1</div>
                                <div id="file-time1" class="record-time">2025-12-03 10:00</div>
                            </div>
                        </div>
                        <!-- çƒ­æˆåƒè§†é¢‘记录 -->
                        <div class="record-item">
                        <div class="record-item" style="border: 2px solid var(--warning-color);">
                            <div class="record-img">
                                <img th:src="@{/img/web/security/p-snap-red.jpg}" alt="热成像视频记录">
                                <img id="record-img2" th:src="@{/img/web/security/p-snap.jpg}">
                            </div>
                            <div class="record-info">
                                <div class="record-name">粮仓1号</div>
                                <div class="record-time">2025-12-03 10:00</div>
                                <div class="record-name">过程抓拍2</div>
                                <div id="file-time2" class="record-time">2025-12-03 10:00</div>
                            </div>
                        </div>
                        <!-- å¼‚常事件记录 -->
                        <div class="record-item" style="border: 2px solid var(--warning-color);">
                            <div class="record-img">
                                <img th:src="@{/img/web/security/p-snap.jpg}" alt="异常事件记录">
                                <img id="record-img3" th:src="@{/img/web/security/p-snap.jpg}">
                            </div>
                            <div class="record-info">
                                <div class="record-name">粮仓3号</div>
                                <div class="record-time">2025-12-03 14:20</div>
                                <div class="record-name">过程抓拍3</div>
                                <div id="file-time3" class="record-time">2025-12-03 14:20</div>
                            </div>
                        </div>
                        <!-- çƒ­æˆåƒè§†é¢‘记录 -->
                        <div class="record-item">
                        <div class="record-item" style="border: 2px solid var(--warning-color);">
                            <div class="record-img">
                                <img th:src="@{/img/web/security/p-snap-red.jpg}" alt="热成像视频记录">
                                <img id="record-img4" th:src="@{/img/web/security/p-snap.jpg}">
                            </div>
                            <div class="record-info">
                                <div class="record-name">粮仓1号</div>
                                <div class="record-time">2025-12-03 10:00</div>
                                <div class="record-name">过程抓拍4</div>
                                <div id="file-time4" class="record-time">2025-12-03 10:00</div>
                            </div>
                        </div>
                    </div>
@@ -175,43 +181,31 @@
                <div class="card-body" style="max-height: 410px; overflow-y: hidden;">
                    <div class="alert-item accent">
                        <div class="alert-header">
                            <div class="alert-title">检测重量:2590000 KG</div>
                            <div class="alert-time">2025-12-07 10:00</div>
                            <div class="alert-title" id="record_title1">检测重量:---- KG</div>
                            <div class="alert-time" id="record_time1">----</div>
                        </div>
                        <div class="alert-content">检测重量为2590000 KG,实际重量为2550000 KG,误差小于5%。</div>
                        <div style="text-align: right;">
                            <button class="layui-btn layui-btn-xs" style="background-color: var(--primary-color);">查看三维渲染</button>
                        </div>
                        <div class="alert-content" id="record_content1">检测重量为---- KG,实际重量为---- KG,误差小于-%。</div>
                    </div>
                    <div class="alert-item">
                        <div class="alert-header">
                            <div class="alert-title">检测重量:2540000 KG</div>
                            <div class="alert-time">2025-12-06 10:00</div>
                            <div class="alert-title" id="record_title2">检测重量:---- KG</div>
                            <div class="alert-time" id="record_time2">----</div>
                        </div>
                        <div class="alert-content">检测重量为2540000 KG,实际重量为2550000 KG,误差小于5%。</div>
                        <div style="text-align: right;">
                            <button class="layui-btn layui-btn-xs" style="background-color: var(--primary-color);">查看三维渲染</button>
                        <div class="alert-content" id="record_content2">检测重量为---- KG,实际重量为---- KG,误差小于-%。</div>
                        </div>
                    <div class="alert-item blue">
                        <div class="alert-header">
                            <div class="alert-title" id="record_title3">检测重量:---- KG</div>
                            <div class="alert-time" id="record_time3">----</div>
                        </div>
                        <div class="alert-content" id="record_content3">检测重量为---- KG,实际重量为---- KG,误差小于-%。</div>
                    </div>
                    <div class="alert-item gray">
                        <div class="alert-header">
                            <div class="alert-title">检测重量:2510000 KG</div>
                            <div class="alert-time">2025-12-05 10:00</div>
                            <div class="alert-title" id="record_title4">检测重量:---- KG</div>
                            <div class="alert-time" id="record_time4">----</div>
                        </div>
                        <div class="alert-content">检测重量为2510000 KG,实际重量为2550000 KG,误差小于5%。</div>
                        <div style="text-align: right;">
                            <button class="layui-btn layui-btn-xs" style="background-color: var(--primary-color);">查看三维渲染</button>
                        </div>
                    </div>
                    <div class="alert-item gray">
                        <div class="alert-header">
                            <div class="alert-title">检测重量:2560000 KG</div>
                            <div class="alert-time">2025-12-04 10:00</div>
                        </div>
                        <div class="alert-content">检测重量为2560000 KG,实际重量为2550000 KG,误差小于5%。</div>
                        <div style="text-align: right;">
                            <button class="layui-btn layui-btn-xs" style="background-color: var(--primary-color);">查看三维渲染</button>
                        </div>
                        <div class="alert-content" id="record_content4">检测重量为---- KG,实际重量为---- KG,误差小于-%。</div>
                    </div>
                </div>
            </div>
@@ -228,15 +222,15 @@
                        <div class="tool-item-simple" style="height: 65px">
                            <div class="tool-icon-simple"><i class="layui-icon layui-icon-chart"></i></div>
                            <div class="tool-text">
                                <div class="tool-name-simple">温度变化曲线</div>
                                <div class="tool-desc">查看温度变化趋势分析</div>
                            </div>
                                <div class="tool-name-simple">数据报表</div>
                                <div class="tool-desc">查看数据报表分析</div>
                            </div>--
                        </div>
                        <div class="tool-item-simple" style="height: 65px">
                            <div class="tool-icon-simple"><i class="layui-icon layui-icon-print"></i></div>
                            <div class="tool-text">
                                <div class="tool-name-simple">导出分析报告</div>
                                <div class="tool-desc">导出温度数据及分析结果</div>
                                <div class="tool-desc">导出数据数量分析结果</div>
                            </div>
                        </div>
                    </div>