Przeglądaj źródła

Merge branch 'master' of http://git.xt.wenhq.top:8083/wenhongquan/iotc

# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/data/controller/TblEquipmentSbookController.java
#	ruoyi-ui-vue3/src/views/gateway/manager/add.vue
liwei19941102 2 lat temu
rodzic
commit
e71be76738
22 zmienionych plików z 697 dodań i 262 usunięć
  1. 3 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
  2. 3 3
      ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml
  3. 16 0
      ruoyi-system/src/main/java/com/ruoyi/data/controller/TblDataController.java
  4. 6 56
      ruoyi-system/src/main/java/com/ruoyi/data/controller/TblEquipmentSbookController.java
  5. 2 0
      ruoyi-system/src/main/java/com/ruoyi/data/domain/GateWaySensor.java
  6. 2 0
      ruoyi-system/src/main/java/com/ruoyi/data/domain/TblSensor.java
  7. 4 4
      ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/TblDatapointBo.java
  8. 3 0
      ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/TblSensorBo.java
  9. 2 0
      ruoyi-system/src/main/java/com/ruoyi/data/domain/vo/TblSensorVo.java
  10. 4 0
      ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblDatapointServiceImpl.java
  11. 14 0
      ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblSensorServiceImpl.java
  12. 1 0
      ruoyi-system/src/main/resources/mapper/data/TblSensorMapper.xml
  13. 1 7
      ruoyi-ui-vue3/src/api/data/equipment.js
  14. 8 0
      ruoyi-ui-vue3/src/api/data/equipmentSbook.js
  15. 10 10
      ruoyi-ui-vue3/src/api/data/sensor.js
  16. 2 2
      ruoyi-ui-vue3/src/router/index.js
  17. 2 0
      ruoyi-ui-vue3/src/utils/ruoyi.js
  18. 180 58
      ruoyi-ui-vue3/src/views/device/sensordash/index.vue
  19. 96 41
      ruoyi-ui-vue3/src/views/gateway/manager/add.vue
  20. 88 28
      ruoyi-ui-vue3/src/views/gateway/pointsetting/add.vue
  21. 119 32
      ruoyi-ui-vue3/src/views/gateway/pointsetting/index.vue
  22. 131 21
      ruoyi-ui-vue3/src/views/gateway/pointsetting/setting.vue

+ 3 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java

@@ -23,6 +23,7 @@ public class TableDataInfo<T> implements Serializable {
      * 总记录数
      */
     private long total;
+    private long page;
 
     /**
      * 列表数据
@@ -48,6 +49,7 @@ public class TableDataInfo<T> implements Serializable {
     public TableDataInfo(List<T> list, long total) {
         this.rows = list;
         this.total = total;
+        this.page = 0;
     }
 
     public static <T> TableDataInfo<T> build(IPage<T> page) {
@@ -55,6 +57,7 @@ public class TableDataInfo<T> implements Serializable {
         rspData.setCode(HttpStatus.HTTP_OK);
         rspData.setMsg("查询成功");
         rspData.setRows(page.getRecords());
+        rspData.setPage(page.getCurrent());
         rspData.setTotal(page.getTotal());
         return rspData;
     }

+ 3 - 3
ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml

@@ -14,9 +14,9 @@ spring:
   datasource:
     type: com.zaxxer.hikari.HikariDataSource
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
-    username: root
-    password: root
+    url: jdbc:mysql://${DBHOST:xt.wenhq.top}:${DBPORT:8583}/iotc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+    username: ${DBUSER:root}
+    password: ${DBPWD:root}
     hikari:
       auto-commit: true
       connection-test-query: SELECT 1

+ 16 - 0
ruoyi-system/src/main/java/com/ruoyi/data/controller/TblDataController.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import com.ruoyi.common.core.domain.entity.SysDictData;
@@ -47,6 +48,10 @@ public class TblDataController extends BaseController {
 
     private final ISysDictTypeService iSysDictTypeService;
 
+    private final ITblModbusTcpService iTblModbusTcpService;
+
+    private final ITblModbusRtuService iTblModbusRtuService;
+
 
     /**
      * 查询网关设备列表
@@ -79,6 +84,17 @@ public class TblDataController extends BaseController {
         }
         for(GateWaySensor gateWaySensor:gateWaySensorList){
             gateWaySensor.setSn(gateWaySensor.getTblGateway().getSn());
+            //不是assictcp
+            if(gateWaySensor.getTblGateway().getProtocalType()!=3){
+                if(gateWaySensor.getTblGateway().getProtocalId()!=null && gateWaySensor.getTblGateway().getProtocalType().intValue() == 1){
+                    TblModbusTcpVo v= iTblModbusTcpService.queryById(gateWaySensor.getTblGateway().getProtocalId());
+                    gateWaySensor.setProtocalInfo(BeanUtil.beanToMap(v));
+                }
+                if(gateWaySensor.getTblGateway().getProtocalId()!=null && gateWaySensor.getTblGateway().getProtocalType().intValue() == 2) {
+                    TblModbusRtuVo v = iTblModbusRtuService.queryById(gateWaySensor.getTblGateway().getProtocalId());
+                    gateWaySensor.setProtocalInfo(BeanUtil.beanToMap(v));
+                }
+            }
               for(SysDictData sysDictData:sysDictTypeList){
                         if(gateWaySensor.getTblGateway().getProtocalType() == Integer.valueOf(sysDictData.getDictValue())){
                             gateWaySensor.setProtocalTypeName(sysDictData.getDictLabel());

+ 6 - 56
ruoyi-system/src/main/java/com/ruoyi/data/controller/TblEquipmentSbookController.java

@@ -4,16 +4,9 @@ import java.util.List;
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 
-import com.ruoyi.data.domain.TblEquipment;
-import com.ruoyi.data.domain.TblEquipmentOrganizational;
 import com.ruoyi.data.domain.TblEquipmentSbook;
-import com.ruoyi.data.domain.TblGateway;
 import com.ruoyi.data.domain.bo.TblEquipmentBo;
-import com.ruoyi.data.domain.bo.TblEquipmentOrganizationalBo;
-import com.ruoyi.data.domain.vo.*;
-import com.ruoyi.data.service.ITblEquipmentOrganizationalService;
-import com.ruoyi.data.service.ITblEquipmentService;
-import com.ruoyi.data.service.ITblGatewayService;
+import com.ruoyi.data.domain.vo.TblEquipmentVo;
 import lombok.RequiredArgsConstructor;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.*;
@@ -30,6 +23,7 @@ import com.ruoyi.common.core.validate.EditGroup;
 import com.ruoyi.common.core.validate.QueryGroup;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.data.domain.vo.TblEquipmentSbookVo;
 import com.ruoyi.data.domain.bo.TblEquipmentSbookBo;
 import com.ruoyi.data.service.ITblEquipmentSbookService;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -48,38 +42,15 @@ public class TblEquipmentSbookController extends BaseController {
 
     private final ITblEquipmentSbookService iTblEquipmentSbookService;
 
-    private final ITblGatewayService iTblGatewayService;
-
-    private final ITblEquipmentOrganizationalService iTblEquipmentOrganizationalService;
-
-    private final ITblEquipmentService iTblEquipmentService;
-
     /**
      * 查询设备台账列表
      */
     @SaCheckPermission("data:equipmentSbook:list")
     @GetMapping("/list")
-    public TableDataInfo<TblEquipmentSbook> list(TblEquipmentSbook bo, PageQuery pageQuery) {
-        TableDataInfo<TblEquipmentSbook> listObj= iTblEquipmentSbookService.queryallPageList(bo,pageQuery);
-        List<TblEquipmentSbook> tblEquipmentVoList = listObj.getRows();
-        TblEquipmentOrganizationalBo organizationalBo = new TblEquipmentOrganizationalBo();
-        List<TblEquipmentOrganizationalVo> tblEquipmentOrganizationalVoList = iTblEquipmentOrganizationalService.queryList(organizationalBo);
-        TblEquipmentBo tblEquipmentBo = new TblEquipmentBo();
-        List<TblEquipmentVo> tblEquipmentVos = iTblEquipmentService.queryList(tblEquipmentBo);
-        for(TblEquipmentSbook tblEquipmentSbook:tblEquipmentVoList){
-            for(TblEquipmentOrganizationalVo tblEquipmentOrganizationalVo:tblEquipmentOrganizationalVoList){
-                if(tblEquipmentSbook.getEquipmentTreeId().longValue() == tblEquipmentOrganizationalVo.getId().longValue()){
-                    tblEquipmentSbook.setDeptName(tblEquipmentOrganizationalVo.getName());
-                }
-            }
-        }
-        listObj.setRows(tblEquipmentVoList);
-//        return obj;
-        return listObj;
+    public TableDataInfo<TblEquipmentSbookVo> list(TblEquipmentSbookBo bo, PageQuery pageQuery) {
+        return iTblEquipmentSbookService.queryPageList(bo, pageQuery);
     }
 
-
-
     /**
      * 导出设备台账列表
      */
@@ -111,7 +82,6 @@ public class TblEquipmentSbookController extends BaseController {
     @RepeatSubmit()
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody TblEquipmentSbookBo bo) {
-        String codeId = bo.getSn();
         return toAjax(iTblEquipmentSbookService.insertByBo(bo));
     }
 
@@ -144,27 +114,7 @@ public class TblEquipmentSbookController extends BaseController {
      */
     @SaCheckPermission("data:equipmentSbook:list")
     @GetMapping("/alllist")
-    public TableDataInfo<TblEquipmentSbookVo> alllist(TblEquipmentSbookBo bo) {
-        if(bo.getGatewayId() != null){
-            TableDataInfo<TblEquipmentSbookVo> obj= new TableDataInfo<>();
-            List<TblEquipmentSbookVo> tblEquipmentVoList = iTblEquipmentSbookService.queryList(bo);
-            TblGatewayVo tblGatewayVo = iTblGatewayService.queryById(bo.getGatewayId());
-            for(TblEquipmentSbookVo tblEquipmentSbookVo:tblEquipmentVoList){
-                tblEquipmentSbookVo.setGatewayName(tblGatewayVo.getName());
-            }
-            TblEquipmentOrganizationalBo organizationalBo = new TblEquipmentOrganizationalBo();
-            List<TblEquipmentOrganizationalVo> tblEquipmentOrganizationalVoList = iTblEquipmentOrganizationalService.queryList(organizationalBo);
-            for(TblEquipmentSbookVo tblEquipmentSbookVo:tblEquipmentVoList){
-                for(TblEquipmentOrganizationalVo tblEquipmentOrganizationalVo:tblEquipmentOrganizationalVoList){
-                    if(tblEquipmentSbookVo.getEquipmentTreeId().longValue() == tblEquipmentOrganizationalVo.getId().longValue()){
-                        tblEquipmentSbookVo.setDeptName(tblEquipmentOrganizationalVo.getName());
-                    }
-                }
-            }
-            obj.setRows(tblEquipmentVoList);
-            return obj;
-        }else{
-            return null;
-        }
+    public TableDataInfo<TblEquipmentSbookVo> alllist(TblEquipmentSbookBo bo,PageQuery query) {
+        return iTblEquipmentSbookService.queryPageList(bo,query);
     }
 }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/GateWaySensor.java

@@ -4,6 +4,7 @@ import com.ruoyi.data.domain.vo.TblGatewayVo;
 import lombok.Data;
 
 import java.util.List;
+import java.util.Map;
 
 @Data
 public class GateWaySensor {
@@ -11,6 +12,7 @@ public class GateWaySensor {
     private String sn;
 
     private String protocalTypeName;
+    private Map protocalInfo;
 
     private TblGatewayVo tblGateway;
 

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/TblSensor.java

@@ -55,6 +55,8 @@ public class TblSensor extends BaseEntity {
      * 状态
      */
     private String status;
+
+    private Long protocalId;
     /**
      * 备注
      */

+ 4 - 4
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/TblDatapointBo.java

@@ -32,7 +32,7 @@ public class TblDatapointBo extends BaseEntity {
     /**
      * 名称
      */
-    @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String name;
 
     /**
@@ -44,13 +44,13 @@ public class TblDatapointBo extends BaseEntity {
     /**
      * 数据类型
      */
-    @NotBlank(message = "数据类型不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "数据类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long dataType;
 
     /**
      * 从设备号
      */
-    @NotBlank(message = "从设备号不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "从设备号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String slaveDeviceNumber;
 
     /**
@@ -74,7 +74,7 @@ public class TblDatapointBo extends BaseEntity {
     /**
      * 变量类型
      */
-    @NotBlank(message = "变量类型不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "变量类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String valueType;
 
     /**

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/TblSensorBo.java

@@ -69,6 +69,9 @@ public class TblSensorBo extends BaseEntity {
 //    @NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
     private String status;
 
+
+    private Long protocalId;
+
     /**
      * 备注
      */

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/vo/TblSensorVo.java

@@ -75,6 +75,8 @@ public class TblSensorVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    private Long protocalId;
+
     /**
      * 备注
      */

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblDatapointServiceImpl.java

@@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.data.domain.DataPointUnit;
+import com.ruoyi.data.domain.TblSensor;
 import com.ruoyi.data.mapper.DatapointUnitMapper;
+import com.ruoyi.data.mapper.TblSensorMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import com.ruoyi.data.domain.bo.TblDatapointBo;
@@ -35,6 +37,8 @@ public class TblDatapointServiceImpl implements ITblDatapointService {
 
     private final TblDatapointMapper baseMapper;
 
+    private final TblSensorMapper sensorMapper;
+
     private final ModbusUtils modbusUtils;
 
     private final DatapointUnitMapper datapointPointMapper;

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblSensorServiceImpl.java

@@ -15,9 +15,11 @@ import com.ruoyi.data.domain.TblSensor;
 import com.ruoyi.data.mapper.TblSensorMapper;
 import com.ruoyi.data.service.ITblSensorService;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
+import java.util.stream.Collectors;
 
 /**
  * 传感器列Service业务层处理
@@ -71,6 +73,18 @@ public class TblSensorServiceImpl implements ITblSensorService {
         lqw.eq(bo.getEquipmentTreeId() != null, TblSensor::getEquipmentTreeId, bo.getEquipmentTreeId());
         lqw.eq(StringUtils.isNotBlank(bo.getEquipmentName()), TblSensor::getEquipmentName, bo.getEquipmentName());
         lqw.eq(bo.getConfigUuid() != null, TblSensor::getConfigUuid, bo.getConfigUuid());
+        if(bo.getParams()!=null && bo.getParams().get("notypes")!=null){
+            lqw.notIn(TblSensor::getProtocalType, Arrays.stream(bo.getParams().get("notypes").toString().split(",")).map(i->Long.parseLong(i)).collect(Collectors.toList()));
+        }
+        if(bo.getParams()!=null && bo.getParams().get("deviceids")!=null){
+            lqw.in(TblSensor::getDeviceId, Arrays.stream(bo.getParams().get("deviceids").toString().split(",")).map(i->Long.parseLong(i)).collect(Collectors.toList()));
+        }
+        if(bo.getParams()!=null && bo.getParams().get("sn")!=null){
+            lqw.like(TblSensor::getSn, "%"+bo.getParams().get("sn")+"%");
+        }
+        if(bo.getParams()!=null && bo.getParams().get("desc")!=null){
+            lqw.like(TblSensor::getSensorDesc, "%"+bo.getParams().get("desc")+"%");
+        }
         return lqw;
     }
 

+ 1 - 0
ruoyi-system/src/main/resources/mapper/data/TblSensorMapper.xml

@@ -11,6 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="deviceId" column="device_id"/>
         <result property="sensorType" column="sensor_type"/>
         <result property="protocalType" column="protocal_type"/>
+        <result property="protocalId" column="protocal_id"/>
         <result property="sensorDesc" column="sensor_desc"/>
         <result property="status" column="status"/>
         <result property="remark" column="remark"/>

+ 1 - 7
ruoyi-ui-vue3/src/api/data/equipment.js

@@ -10,13 +10,7 @@ export function listEquipment(query) {
 }
 
 
-export function listGatewayEquipments(query) {
-  return request({
-    url: '/data/equipment/alllist',
-    method: 'get',
-    params: query
-  })
-}
+
 
 // 查询设备详细
 export function getEquipment(id) {

+ 8 - 0
ruoyi-ui-vue3/src/api/data/equipmentSbook.js

@@ -17,6 +17,14 @@ export function getEquipmentSbook(id) {
   })
 }
 
+export function listGatewayEquipmentSbook(query) {
+  return request({
+    url: '/data/equipmentSbook/alllist',
+    method: 'get',
+    params: query
+  })
+}
+
 // 新增设备台账
 export function addEquipmentSbook(data) {
   return request({

+ 10 - 10
ruoyi-ui-vue3/src/api/data/sensorSbook.js → ruoyi-ui-vue3/src/api/data/sensor.js

@@ -1,44 +1,44 @@
 import request from '@/utils/request'
 
 // 查询传感器台账列表
-export function listSensorSbook(query) {
+export function listSensor(query) {
   return request({
-    url: '/data/sensorSbook/list',
+    url: '/data/sensor/list',
     method: 'get',
     params: query
   })
 }
 
 // 查询传感器台账详细
-export function getSensorSbook(id) {
+export function getSensor(id) {
   return request({
-    url: '/data/sensorSbook/' + id,
+    url: '/data/sensor/' + id,
     method: 'get'
   })
 }
 
 // 新增传感器台账
-export function addSensorSbook(data) {
+export function addSensor(data) {
   return request({
-    url: '/data/sensorSbook',
+    url: '/data/sensor',
     method: 'post',
     data: data
   })
 }
 
 // 修改传感器台账
-export function updateSensorSbook(data) {
+export function updateSensor(data) {
   return request({
-    url: '/data/sensorSbook',
+    url: '/data/sensor',
     method: 'put',
     data: data
   })
 }
 
 // 删除传感器台账
-export function delSensorSbook(id) {
+export function delSensor(id) {
   return request({
-    url: '/data/sensorSbook/' + id,
+    url: '/data/sensor/' + id,
     method: 'delete'
   })
 }

+ 2 - 2
ruoyi-ui-vue3/src/router/index.js

@@ -171,7 +171,7 @@ export const constantRoutes = [
         path: "",
         component: () => import("@/views/gateway/pointsetting/setting"),
         name: "PointSetting" ,
-        meta: { title: "点表配置", activeMenu: "/gateway/pointsetting/setting" },
+        meta: { title: "点表配置", activeMenu: "/gateway/pointsetting" },
       },
     ],
   },
@@ -184,7 +184,7 @@ export const constantRoutes = [
         path: "",
         component: () => import("@/views/gateway/pointsetting/add"),
         name: "PointSettingAdd" ,
-        meta: { title: "点表配置新增", activeMenu: "/gateway/pointsetting/add" },
+        meta: { title: "点表配置新增", activeMenu: "/gateway/pointsetting" },
       },
     ],
   },

+ 2 - 0
ruoyi-ui-vue3/src/utils/ruoyi.js

@@ -174,6 +174,7 @@ export function handleTree(data, id, parentId, children) {
       childrenListMap[parentId] = [];
     }
     nodeIds[d[config.id]] = d;
+    d["spread"]= true;
     childrenListMap[parentId].push(d);
   }
 
@@ -194,6 +195,7 @@ export function handleTree(data, id, parentId, children) {
     }
     if (o[config.childrenList]) {
       for (let c of o[config.childrenList]) {
+        c["spread"]= true;
         adaptToChildrenList(c);
       }
     }

+ 180 - 58
ruoyi-ui-vue3/src/views/device/sensordash/index.vue

@@ -6,7 +6,7 @@
           <template #header>
             <div class="card-header">
               <span>设备区域</span>
-              <div>
+              <div style="display: none">
                 <el-button type="primary" >
                   添加
                 </el-button>
@@ -21,7 +21,11 @@
               v-model:selectedKey="selectedKey"
               @node-click="handleClick"
             >
+              <template #title="{ data }">
+                {{ data.name }}
+              </template>
             </LayTree>
+
           </div>
         </el-card>
       </el-col>
@@ -38,9 +42,9 @@
                   align-items: center;
                 "
               >
-                <div style="font-size: 12px; width: 100px;">监测点编号:</div>
+                <div style="font-size: 12px; width: 100px;">传感器编号:</div>
                 <el-input
-                  v-model="searchform.devicename"
+                  v-model="searchform.sn"
                   placeholder="请输入"
                 ></el-input>
               </div>
@@ -54,14 +58,14 @@
               >
                 <div style="font-size: 12px; width: 80px;margin-right: 10px;text-align: right;">描述:</div>
                 <el-input
-                  v-model="searchform.devicename"
+                  v-model="searchform.desc"
                   placeholder="请输入"
                 ></el-input>
               </div>
             </div>
             <div>
-              <el-button type="primary" plain>重置</el-button>
-              <el-button type="primary">搜索</el-button>
+              <el-button type="primary" plain @click="initdata">重置</el-button>
+              <el-button type="primary" @click="getalldata">搜索</el-button>
             </div>
           </div>
         </el-card>
@@ -72,19 +76,16 @@
               <span>传感器台账</span>
               <div>
                 <el-button type="primary" @click="goadd">添加</el-button>
-                <el-button type="danger">批量删除</el-button>
-                <el-button type="primary" plain>显示字段</el-button>
+                <el-button type="danger" @click="deleteall">批量删除</el-button>
+                <el-button type="primary" plain  @click="ziduanshow=true">显示字段</el-button>
               </div>
             </div></template>
 
           <el-row>
             <el-col :span="24" style="padding-left: 10px">
-              <el-table :data="devicetabledata" :border="true">
-                <el-table-column label="传感器编号"></el-table-column>
-                <el-table-column label="传感器名称"></el-table-column>
-                <el-table-column label="描述"></el-table-column>
-                <el-table-column label="状态"></el-table-column>
-                <el-table-column label="类型"></el-table-column>
+              <el-table :data="devicetabledata" ref="tableref" :border="true">
+                <el-table-column type="selection" width="55" />
+                <el-table-column v-for="item in cloumdata.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
 
                 <el-table-column label="操作">
                   <template #default="scope">
@@ -108,7 +109,7 @@
                           <el-icon><VideoPlay /></el-icon>
                         </el-tooltip>
                       </el-button>
-                      <el-popconfirm title="确定删除该标签?">
+                      <el-popconfirm title="确定删除该传感器?" @confirm="deleterow(scope.row)">
                         <template #reference>
                           <el-button link
                           ><el-tooltip effect="dark" content="删除"
@@ -128,7 +129,10 @@
                              small
                              background
                              layout="prev, pager, next"
-                             :total="50"
+                             :total="pagedata.total"
+                             :page-size="pagedata.size"
+                             :current-page="pagedata.current"
+                             @current-change="onchangepage"
                              class="mt-4"
               />
             </el-col>
@@ -197,80 +201,197 @@
       </template>
     </el-dialog>
 
+    <el-dialog
+      title="字段显示"
+      v-model="ziduanshow"
+      width="50%"
+      @close="ziduanshow = false"
+    >
+      <div style="display: flex;flex-wrap: wrap;align-content: center;justify-content: center;align-items: center;">
+        <el-checkbox v-for="item in cloumdata" v-model="item.visible" :label="item.label" size="large" />
+      </div>
 
+    </el-dialog>
   </div>
 </template>
 
-<script setup lang="ts" name="Units">
+<script setup>
 import {ref} from "vue";
-import { LayTree } from "@layui/layui-vue";
+import {LayTree} from "@layui/layui-vue";
 import "@layui/layui-vue/lib/index.css";
 import {useRoute, useRouter} from "vue-router";
+import {listEquipmentOrganizational} from "@/api/data/equipmentOrganizational"
+import {listEquipmentSbook} from "@/api/data/equipmentSbook"
+import {listSensor,delSensor,addSensor,updateSensor} from "@/api/data/sensor"
+import {delGateway} from "@/api/data/gateway";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+const {proxy} = getCurrentInstance();
+const {protocal_type, sensor_type, sensor_status} = proxy.useDict("protocal_type", "sensor_type", "sensor_status");
 
 
 const route = useRoute();
 const router = useRouter();
+const ziduanshow = ref(false);
+
+const tableref  = ref(null);
+
+const cloumdata = ref([
+  {label: '传感器编号', prop: 'sn', visible: true},
+  {label: '传感器名称', prop: 'name', visible: true},
+  {label: '描述', prop: 'sensorDesc', visible: true},
+  {label: '状态', prop: 'statusname', visible: true},
+  {label: '类型', prop: 'sensorType', visible: true},
+])
 
 
-const goadd = ()=>{
+const onchangepage = (page) => {
+  pagedata.value.current = page;
+  getalldata();
+}
+const pagedata = ref({
+  total:0,
+  size:10,
+  current:1
+});
+
+
+const deleterow =(item)=>{
+  delSensor(item.id).then((res)=>{
+    ElMessage.success("删除成功");
+    getalldata();
+  })
+}
+
+const deleteall = ()=>{
+  let selected =  tableref.value.getSelectionRows();
+  if(selected.length==0) {
+    ElMessage.warning("请选择要删除的行");
+    return;
+  }
+
+  if (selected.length > 0) {
+    ElMessageBox.confirm(
+      `是否删除${selected.length}条数据`,
+      "警告",
+      {
+        confirmButtonText: "确认",
+        cancelButtonText: "取消",
+        type: 'warning',
+      }
+    ).then(() => {
+
+      delSensor(selected.map(i => i.id).join(",")).then((res) => {
+        ElMessage.success("删除成功");
+        getalldata();
+      })
+
+    });
+  }
+
+}
+
+
+const initdata = ()=>{
+  searchform.value.sn = '';
+  searchform.value.desc = '';
+  pagedata.value = {
+    total:0,
+    size:10,
+    current:1
+  }
+}
+
+const goadd = () => {
   router.push("/device/sensordash/add")
 }
 
+
+
+const currentnode = ref(null);
+const getalldata = () => {
+  const getdeviceid = (node) => {
+    if (node.children) {
+      return node.children.map(item => {
+        return getdeviceid(item);
+      }).join(",")
+    } else {
+      if ((node.id + "").indexOf("device") > -1) {
+        return node.id;
+      } else {
+        return "";
+      }
+    }
+  }
+  let deviceids = getdeviceid(currentnode.value).split(",").filter(i => i != "").join(",");
+  if (deviceids != "") {
+    deviceids = deviceids.replaceAll("device_", "")
+    listSensor({...pagedata, params: {deviceids: deviceids,...searchform.value}}).then(res => {
+      const {rows,total,page,size} = res;
+      pagedata.value = {total:total,current:page, size:10};
+      devicetabledata.value = rows.map(item => {
+        try{
+          var statusname = sensor_status.value.find(i => i.value == item.status).label;
+          item["statusname"] = statusname;
+        }catch (e) {
+
+        }
+        return item;
+      });
+    })
+  }else{
+    pagedata.value = {total:0,current:1, size:10};
+    devicetabledata.value=[];
+  }
+}
+
 const handleClick = (node) => {
-  console.log("Click Node:" + JSON.stringify(node));
+  //循环获取子的id
+  currentnode.value = node;
+  getalldata();
 };
 const selectedKey = ref(4);
-const data = ref([
-  {
-    title: "集团公司",
-    id: 1,
-    checked: true,
-    spread: true,
-    children: [
-      {
-        title: "示范项目",
-        id: 2,
-        spread: true,
-        children: [
-          {
-            title: "监测站",
-            id: 4,
-            href: "https://www.layui.com/",
-          },
-          {
-            title: "用能区域",
-            id: 5,
-            href: "https://www.layui.com/",
-          },
-
-        ],
-      },
-      {
-        title: "虚拟项目",
-        id: 3,
-        href: "https://www.layui.com/",
-      },
+const data = ref([]);
+
+
+const getTreedata = () => {
+  listEquipmentOrganizational({pageSize: 10000}).then(res => {
+    const {rows, total, page, size} = res;
+    //获取设备数据
+    listEquipmentSbook({page: 1, pageSize: 100000}).then(res1 => {
+      res1.rows.forEach(item => {
+        item["parentId"] = item.equipmentTreeId;
+        item["id"] = "device_" + item.id;
+        rows.push(item);
+        data.value = proxy.handleTree(rows, "id", "parentId");
+      })
+    })
+  })
+}
+getTreedata();
 
-    ],
-  },
-]);
 
-const devicetabledata = ref([1]);
+const devicetabledata = ref([]);
 const searchform = ref({
-  devicename: "",
-  devicesn:""
+  sn: "",
+  desc: ""
 });
 
 
 const cdbdshow = ref(false);
-const cdbd = ()=>{
+const cdbd = () => {
   cdbdshow.value = true;
 }
 
 
-
 </script>
 
+<style lang="scss">
+.layui-tree .layui-this .layui-tree-txt {
+  color: #038de0 !important;
+}
+</style>
+
 <style lang="scss" scoped>
 .card-header {
   display: flex;
@@ -278,6 +399,7 @@ const cdbd = ()=>{
   justify-content: space-between;
 }
 
+
 .tree {
   *,
   *:before,

+ 96 - 41
ruoyi-ui-vue3/src/views/gateway/manager/add.vue

@@ -141,12 +141,12 @@
       </el-row>
     </el-card>
 
-    <el-card class="box-card" style="margin-top: 20px">
+    <el-card class="box-card" style="margin-top: 20px" v-if="route.query['type']==1">
       <template #header>
         <div class="card-header">
           <span>设备台账</span>
           <div>
-            <el-button type="primary" plain @click="addshow = true">添加</el-button>
+            <el-button type="primary" plain @click="adddevice">添加</el-button>
           </div>
         </div>
       </template>
@@ -155,7 +155,18 @@
           <el-col :span="24">
             <el-table :data="tabledata" border>
               <el-table-column v-for="item in columns.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
-              <el-table-column label="操作" fixed="right" ></el-table-column>
+              <el-table-column label="操作" fixed="right" >
+                <template #default="scope">
+                <el-popconfirm title="解绑该设备?" @confirm="deleterow(scope.row)">
+                  <template #reference>
+                    <el-button link
+                    ><el-tooltip effect="dark" content="删除"
+                    ><el-icon><Delete /></el-icon></el-tooltip
+                    ></el-button>
+                  </template>
+                </el-popconfirm>
+                </template>
+              </el-table-column>
 
             </el-table>
           </el-col>
@@ -183,25 +194,28 @@
       title="设备台账"
       v-model="addshow">
 
-      <el-table height="400px">
+      <el-table :data="alldevice" ref="tableref" height="400px">
         <el-table-column type="selection" width="55"  fixed="left" />
         <el-table-column v-for="item in columns.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
       </el-table>
 
       <div style="text-align: center;display: flex;justify-content: center;margin-top: 10px" >
-
         <el-pagination style="float: right;"
                        small
                        background
                        layout="prev, pager, next"
-                       :total="pagedata.total"
-                       :page-size="pagedata.size"
-                       :current-page="pagedata.current"
-                       @current-change="onchangepage"
+                       :total="pagedata1.total"
+                       :page-size="pagedata1.size"
+                       :current-page="pagedata1.current"
+                       @current-change="onchangepage1"
                        class="mt-4"
         />
 
       </div>
+      <div slot="footer" class="dialog-footer" style="text-align: right" >
+        <el-button @click="addshow = false">取 消</el-button>
+        <el-button type="primary" @click="dosave">保 存</el-button>
+      </div>
 
 
     </el-dialog>
@@ -216,47 +230,44 @@ import {useRoute, useRouter} from "vue-router";
 
 const {proxy} = getCurrentInstance();
 const {gateway_status, flow_units, protocal_type} = proxy.useDict("gateway_status", "flow_units", "protocal_type");
-import {listModbusRtu} from "@/api/data/modbusRtu";
+import {delModbusRtu, listModbusRtu} from "@/api/data/modbusRtu";
 import {listModbusTcp} from "@/api/data/modbusTcp";
 import {updateGateway} from "@/api/data/gateway";
-import {listGatewayEquipments} from "@/api/data/equipmentSbook"
+import {listGatewayEquipmentSbook,updateEquipmentSbook} from "@/api/data/equipmentSbook"
 import {ElMessage} from "element-plus";
+import {cloneDeep} from "lodash";
 
 
 const route = useRoute();
 const router = useRouter();
 
 const columns = ref([
-  // {label: '上层位置', prop: 'v', visible: true},
-  {label: '上层位置', prop: 'deptName', visible: true},
+  {label: '上层位置', prop: 'equipmentTreeId', visible: true},
   {label: '设备编码', prop: 'sn', visible: true},
   {label: '备用编码', prop: 'spareSn', visible: true},
   {label: '设备名称', prop: 'name', visible: true},
-  //{label: '设备信息', prop: 'dateBits', visible: true},
-  //{label: '所属公司', prop: 'parity', visible: true},
+  {label: '设备信息', prop: 'equipmentInfoId', visible: true},
+  {label: '所属公司', prop: 'deptId', visible: true},
   {label: '所属组织机构', prop: 'deptName', visible: true},
-  {label: '所属类型', prop: 'apiUrl', visible: true},
-  {label: '负责人', prop: 'uuid', visible: true},
+  {label: '所属类型', prop: 'equipmentTypeId', visible: true},
+  {label: '负责人', prop: 'personInCharge', visible: true},
   {label: '安装日期', prop: 'installationDate', visible: true},
   {label: '安装地点地址', prop: 'address', visible: true},
-  // {label: '关联设备Id', prop: 'protocolDesc', visible: true},
-  {label: '标签', prop: 'protocolDesc', visible: true},
-  {label: '状态', prop: 'protocolDesc', visible: true},
-  {label: '保修期结束日期', prop: 'protocolDesc', visible: true},
-  {label: '制造日期', prop: 'protocolDesc', visible: true},
-  {label: '资产编码', prop: 'protocolDesc', visible: true},
-  {label: '资产编号', prop: 'protocolDesc', visible: true},
-  {label: '使用证编号', prop: 'protocolDesc', visible: true},
-  {label: '安全级别', prop: 'protocolDesc', visible: true},
-  {label: '变动日期', prop: 'protocolDesc', visible: true},
-  {label: '供货厂家', prop: 'protocolDesc', visible: true},
-  {label: '创建人', prop: 'protocolDesc', visible: true},
-  {label: '创建时间', prop: 'protocolDesc', visible: true},
-  {label: '更新人', prop: 'protocolDesc', visible: true},
-  {label: '更新时间', prop: 'protocolDesc', visible: true},
-  {label: '备注', prop: 'protocolDesc', visible: true},
-])
-
+  {label: '所属网关', prop: 'gatewayId', visible: true},
+  {label: '标签', prop: 'tagids', visible: true},
+  {label: '状态', prop: 'status', visible: true},
+  {label: '保修期结束日期', prop: 'endOfWarrantyPeriod', visible: true},
+  {label: '制造日期', prop: 'manufacturingDate', visible: true},
+  {label: '资产编码', prop: 'assetNo', visible: true},
+  {label: '资产编号', prop: 'serialNumber', visible: true},
+  {label: '使用证编号', prop: 'useCertificateNo', visible: true},
+  {label: '安全级别', prop: 'usefulLife', visible: true},
+  {label: '变动日期', prop: 'changeDate', visible: true},
+  {label: '供货厂家', prop: 'supplier', visible: true},
+  {label: '备注', prop: 'remark', visible: true},
+
+]);
+const tableref = ref(null);
 const currentgateway = ref({
   "sn": "",
   "name": "",
@@ -275,6 +286,32 @@ const currentgateway = ref({
 });
 
 
+const adddevice = () => {
+  addshow.value = true;
+  getalldevicedata();
+}
+const deleterow =(item)=>{
+  item.gatewayId = 0;
+  updateEquipmentSbook(item).then((res)=>{
+    ElMessage.success("解绑成功");
+    getalldata();
+  })
+}
+
+const dosave = () => {
+  let data = tableref.value.getSelectionRows();
+  if(data.length==0) {
+    ElMessage.warning("请选择要关联的设备");
+    return;
+  }
+  data[0].gatewayId = currentgateway.value.id;
+  updateEquipmentSbook(cloneDeep(data[0])).then(res => {
+    ElMessage.success("关联成功");
+    getalldata();
+  });
+
+  addshow.value = false;
+}
 const savedata = () => {
   updateGateway(currentgateway.value).then(res => {
     ElMessage.success("修改成功")
@@ -299,6 +336,7 @@ const initdata = () => {
   };
 }
 
+const alldevice = ref([]);
 
 const protocallist = ref([]);
 
@@ -326,12 +364,29 @@ const pagedata = ref({
   size: 10,
   current: 1
 });
+
+const getalldevicedata = () => {
+  listGatewayEquipmentSbook({gatewayId:0, ...pagedata1.value}).then(res => {
+    const {rows,total,page,size} = res;
+    alldevice.value = rows;
+    pagedata1.value = {total:total,current:page, size:10};
+  })
+}
+const onchangepage1 = (page) => {
+  pagedata1.value.current = page;
+  getalldevicedata();
+}
+
+const pagedata1 = ref({
+  total: 0,
+  size: 10,
+  current: 1
+});
 const getalldata = () => {
-  console.log(currentgateway.value);
-  var obj = {gatewayId:currentgateway.value.id}
-  listGatewayEquipments(obj).then(res => {
-    tabledata.value = res.rows;
-    console.log(tabledata.value)
+  listGatewayEquipmentSbook({...pagedata.value,gatewayId:currentgateway.value.id}).then(res => {
+    const {rows,total,page,size} = res;
+    tabledata.value = rows;
+    pagedata.value = {total:total,current:page, size:10};
   })
 }
 
@@ -344,11 +399,11 @@ onMounted(() => {
   if (route.query["type"] == 1) {
     if (localStorage.getItem("gatewaydata")) {
       currentgateway.value = JSON.parse(localStorage.getItem("gatewaydata"))
-      getalldata();
     } else {
       route.query["type"] = 0;
     }
   }
+  getalldata();
 })
 
 

+ 88 - 28
ruoyi-ui-vue3/src/views/gateway/pointsetting/add.vue

@@ -3,10 +3,10 @@
     <el-card class="box-card">
       <template #header>
         <div class="card-header">
-          <span>点表配置-新增</span>
+          <span>点表配置-{{route.query['type']==1?'编辑':'新增'}}</span>
           <div>
-            <el-button type="warning" @click="">复位</el-button>
-            <el-button type="primary" @click="">保存</el-button>
+            <el-button type="warning" @click="initdata">复位</el-button>
+            <el-button type="primary" @click="savedata">保存</el-button>
             <el-button type="primary" plain @click="router.back();">返回</el-button>
           </div>
         </div>
@@ -24,17 +24,17 @@
 
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-input v-model="currentpoint.name" placeholder="请输入"/>
                 </div>
               </el-descriptions-item>
               <el-descriptions-item>
                 <template #label>
                   <div style="display: inline-block;min-width: 100px;text-align: right">
-                    <span style="color: red">*</span> 设备
+                    <span style="color: red">*</span> 传感器名称
                   </div>
                 </template>
                 <div class="content-w">
-                  XXX
+                  {{currentsensor?.name}}
                 </div>
               </el-descriptions-item>
 
@@ -45,7 +45,9 @@
                   </div>
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-select v-model="currentpoint.dataType" placeholder="请选择">
+                    <el-option v-for="item in data_type" :key="parseInt(item.value)" :label="item.label" :value="parseInt(item.value)"></el-option>
+                  </el-select>
                 </div>
               </el-descriptions-item>
               <el-descriptions-item >
@@ -55,7 +57,7 @@
                   </div>
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-input v-model="currentpoint.valueType" placeholder="请输入"/>
                 </div>
               </el-descriptions-item>
 
@@ -66,7 +68,7 @@
                   </div>
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-input v-model="currentpoint.addr" placeholder="请输入"/>
                 </div>
               </el-descriptions-item>
 
@@ -77,7 +79,7 @@
                   </div>
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-input v-model="currentpoint.addrOffset" placeholder="请输入"/>
                 </div>
               </el-descriptions-item>
 
@@ -88,7 +90,7 @@
                   </div>
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-input v-model="currentpoint.len" placeholder="请输入"/>
                 </div>
               </el-descriptions-item>
               <el-descriptions-item >
@@ -98,21 +100,12 @@
                   </div>
                 </template>
                 <div class="content-w">
-                  <el-input placeholder="请输入"/>
+                  <el-input v-model="currentpoint.slaveDeviceNumber" placeholder="请输入"/>
                 </div>
               </el-descriptions-item>
 
 
-              <el-descriptions-item :span="2">
-                <template #label>
-                  <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
-                    描述
-                  </div>
-                </template>
-                <div class="content-w" style="min-width: 400px">
-                  <el-input type="textarea" :line-count="5"  show-word-limit maxlength="200" placeholder="请输入描述"/>
-                </div>
-              </el-descriptions-item>
+
               <el-descriptions-item :span="2">
                 <template #label>
                   <div style="display: inline-block;min-width: 100px;text-align: right;    vertical-align: top;">
@@ -120,7 +113,7 @@
                   </div>
                 </template>
                 <div class="content-w" style="min-width: 400px">
-                  <el-input type="textarea" :line-count="5"  show-word-limit maxlength="200" placeholder="请输入备注"/>
+                  <el-input type="textarea" :line-count="5" v-model="currentpoint.remark"  show-word-limit maxlength="200" placeholder="请输入备注"/>
                 </div>
               </el-descriptions-item>
             </el-descriptions>
@@ -138,17 +131,84 @@
   </div>
 </template>
 
-<script setup lang="ts" name="Units">
-import {ref} from "vue";
+<script setup  name="Units">
+import {onMounted, ref} from "vue";
 import {useRoute, useRouter} from "vue-router";
-import ModbusTcp from "@/views/data/modbusTcp/index.vue";
+import {addDatapoint,updateDatapoint} from "@/api/data/datapoint";
+import {ElMessage} from "element-plus";
+const {proxy} = getCurrentInstance();
+const {data_type} = proxy.useDict("data_type");
+
 
 
 const route = useRoute();
 const router = useRouter();
 
-const tjdata = ref([]);
-const zxdata = ref([]);
+const currentpoint = ref({
+  "name": "",
+  "sensorId": 0,
+  "dataType": 1,
+  "slaveDeviceNumber": null,
+  "addr": 0,
+  "addrOffset": 0,
+  "len": 0,
+  "valueType": "",
+  "remark": null,
+  "unitName": null,
+  "unitType": null,
+  "toOffset": 0
+});
+const initdata = ()=>{
+  currentpoint.value = {
+    "name": "",
+    "sensorId": currentsensor.value.id,
+    "dataType": 1,
+    "slaveDeviceNumber": null,
+    "addr": 0,
+    "addrOffset": 0,
+    "len": 0,
+    "valueType": "",
+    "remark": null,
+    "unitName": null,
+    "unitType": null,
+    "toOffset": 0
+  }
+}
+
+const currentsensor = ref();
+
+const savedata = ()=>{
+  if(route.query['type']==1){
+    updateDatapoint(currentpoint.value).then(res=>{
+      ElMessage.success("修改成功");
+      router.back();
+    })
+  }else{
+    addDatapoint(currentpoint.value).then(res=>{
+      ElMessage.success("添加成功");
+      router.back();
+    })
+  }
+}
+
+onMounted(()=>{
+  let data = localStorage.getItem("currentpoint");
+  if(route.query['type']==1 && ( data == null||data == undefined)){
+    router.back();
+    return;
+  }
+  currentpoint.value = JSON.parse(data);
+  let data1 = localStorage.getItem("currentsensor");
+  if(data1 == null||data1 == undefined){
+    router.back();
+    return;
+  }
+  currentsensor.value = JSON.parse(data1);
+  if(route.query['type']==0){
+    initdata();
+  }
+
+})
 
 
 </script>

+ 119 - 32
ruoyi-ui-vue3/src/views/gateway/pointsetting/index.vue

@@ -11,10 +11,10 @@
                   align-items: center;
                 "
           >
-            <div style="font-size: 12px; width: 80px">设备编码:</div>
+            <div style="font-size: 12px; width: 100px">传感器编码:</div>
             <el-input
-              v-model="searchform.protocolname"
-              placeholder="设备编码"
+              v-model="searchform.sn"
+              placeholder="传感器编码"
             ></el-input>
           </div>
 
@@ -27,16 +27,16 @@
                   margin-left: 10px;
                 "
           >
-            <div style="font-size: 12px; width: 80px">设备名称:</div>
+            <div style="font-size: 12px; width: 100px">传感器名称:</div>
             <el-input
-              v-model="searchform.protocolname"
-              placeholder="设备名称"
+              v-model="searchform.name"
+              placeholder="传感器名称"
             ></el-input>
           </div>
         </div>
         <div>
-          <el-button type="primary" plain>重置</el-button>
-          <el-button type="primary">搜索</el-button>
+          <el-button type="primary" plain @click="initdata">重置</el-button>
+          <el-button type="primary" @click="getalldata">搜索</el-button>
         </div>
       </div>
 
@@ -46,8 +46,8 @@
     <el-card class="box-card" style="margin-top: 15px">
       <template #header>
         <div class="card-header">
-          <span>点表管理</span>
-          <div>
+          <span>传感器列表</span>
+          <div style="display: none">
             <el-button type="primary" @click="goadd">添加</el-button>
             <el-button type="danger">批量删除</el-button>
             <el-button type="primary" plain>显示字段</el-button>
@@ -61,22 +61,23 @@
         <el-row>
           <el-col :span="24">
             <el-table :data="tabledata" border>
-              <el-table-column type="selection" width="55" />
-              <el-table-column label="设备编码"></el-table-column>
-              <el-table-column label="设备名称"></el-table-column>
-              <el-table-column label="备用编码"></el-table-column>
-              <el-table-column label="点表数"></el-table-column>
-              <el-table-column label="上层位置"></el-table-column>
-              <el-table-column label="设备型号"></el-table-column>
-              <el-table-column label="设备模板"></el-table-column>
-              <el-table-column label="所属类型"></el-table-column>
-              <el-table-column label="负责人"></el-table-column>
-              <el-table-column label="设备用途"></el-table-column>
-              <el-table-column label="安装日期"></el-table-column>
-              <el-table-column label="安装地点地址"></el-table-column>
-              <el-table-column label="经纬度"></el-table-column>
-              <el-table-column label="状态"></el-table-column>
-              <el-table-column label="操作" fixed="right" ></el-table-column>
+              <el-table-column v-for="item in cloumdata.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
+              <el-table-column label="操作" fixed="right" >
+                <template #default="scope">
+                  <div>
+                    <el-button v-if="scope.row.protocalType!=3"
+                      link @click="goadd(scope.row)"
+                    >
+                      <el-tooltip effect="dark" content="查看点表配置">
+                        <el-icon>
+                          <Memo />
+                        </el-icon>
+                      </el-tooltip>
+                    </el-button>
+                  </div>
+                </template>
+
+              </el-table-column>
 
             </el-table>
           </el-col>
@@ -85,7 +86,10 @@
                            small
                            background
                            layout="prev, pager, next"
-                           :total="50"
+                           :total="pagedata.total"
+                           :page-size="pagedata.size"
+                           :current-page="pagedata.current"
+                           @current-change="onchangepage"
                            class="mt-4"
             />
           </el-col>
@@ -99,23 +103,106 @@
   </div>
 </template>
 
-<script setup lang="ts" >
-import {ref} from "vue";
+<script setup  >
+import {ref, watchEffect} from "vue";
 import {useRoute, useRouter} from "vue-router";
+import { listSensor} from "@/api/data/sensor";
+import { listModbusRtu} from "@/api/data/modbusRtu";
+import { listModbusTcp} from "@/api/data/modbusTcp";
+const {proxy} = getCurrentInstance();
+const { protocal_type,sensor_type} = proxy.useDict( "protocal_type","sensor_type");
+
 
 
 const route = useRoute();
 const router = useRouter();
 
+
+const cloumdata = ref([
+  {label: '传感器编码', prop:'sn',visible:true},
+  {label: '传感器名称', prop:'name',visible:true},
+  {label: '类型', prop:'sensorType',visible:true},
+  {label: '协议类型', prop:'pname',visible:true},
+  {label: '协议名称', prop:'sname',visible:true},
+  {label: '描述', prop:'sensorDesc',visible:true},
+  {label: '备注', prop:'remark',visible:true},
+]);
+
 const searchform = ref({
-  protocolname: '',
+  name: '',
+  sn:''
 })
 
-const tabledata = ref([1])
-const goadd = ()=>{
+const pagedata = ref({
+  total:0,
+  size:10,
+  current:1
+});
+const initdata = ()=>{
+  searchform.value = {
+    protocolName: '',
+  }
+  pagedata.value = {
+    total:0,
+    size:10,
+    current:1
+  }
+}
+const onchangepage = (page) => {
+  pagedata.value.current = page;
+  getalldata();
+}
+const tabledata = ref([])
+const goadd = (item)=>{
+  localStorage.setItem("currentsensor",JSON.stringify(item));
   router.push("/gateway/pointsetting/setting");
 }
 
+const rtudata = ref([]);
+const tcpdata = ref([]);
+const getdata = ()=>{
+  listModbusRtu({pageSize:10000}).then(res=>{
+    const {rows,total,page,size} = res;
+    rtudata.value = rows;
+  })
+
+  listModbusTcp({pageSize:10000}).then(res=>{
+    const {rows,total,page,size} = res;
+    tcpdata.value = rows;
+  })
+}
+getdata();
+
+watchEffect(()=>{
+  tabledata.value = tabledata.value.map(item=>{
+    item["pname"] = (protocal_type.value??[]).find(i=>i.value == item.protocalType).label;
+
+    let protacalname = "自定义协议";
+    try{
+      if(item.protocalType==2){
+        protacalname = rtudata.value.find(i=>i.id == item.protocalId).protocolName;
+      }else if(item.protocalType==1) {
+        protacalname = tcpdata.value.find(i => i.id == item.protocalId).protocolName;
+      }
+    }catch (e){}
+
+    item["sname"] = protacalname;
+    return item;
+  });
+})
+
+const getalldata = () => {
+  listSensor({...searchform.value,pageSize:pagedata.value.size,pageNum:pagedata.value.current,params:{notypes:"3"}}).then(res => {
+    const {rows,total,page,size} = res;
+    pagedata.value = {total:total,current:page, size:10};
+    tabledata.value = rows.map(item=>{
+      item["pname"] = (protocal_type.value??[]).find(i=>i.value+"" == item.protocalType).label;
+      return item;
+    });
+  })
+}
+getalldata()
+
 
 </script>
 

+ 131 - 21
ruoyi-ui-vue3/src/views/gateway/pointsetting/setting.vue

@@ -13,7 +13,7 @@
           >
             <div style="font-size: 12px; width: 80px">点名称:</div>
             <el-input
-              v-model="searchform.protocolname"
+              v-model="searchform.name"
               placeholder="点名称"
             ></el-input>
           </div>
@@ -21,8 +21,8 @@
 
         </div>
         <div>
-          <el-button type="primary" plain>重置</el-button>
-          <el-button type="primary">搜索</el-button>
+          <el-button type="primary" plain @click="initdata">重置</el-button>
+          <el-button type="primary" @click="getalldata">搜索</el-button>
           <el-button type="primary" plain @click="router.back()">返回</el-button>
         </div>
       </div>
@@ -33,13 +33,13 @@
     <el-card class="box-card" style="margin-top: 15px">
       <template #header>
         <div class="card-header">
-          <span>点表配置:xx设备</span>
+          <span>点表配置:{{currentsensor?.name}} 传感器</span>
           <div>
             <el-button type="primary" @click="goadd">添加</el-button>
-            <el-button type="primary" plain>导入</el-button>
-            <el-button type="primary" plain>导出</el-button>
-            <el-button type="danger">批量删除</el-button>
-            <el-button type="primary" plain>显示字段</el-button>
+<!--            <el-button type="primary" plain>导入</el-button>-->
+<!--            <el-button type="primary" plain>导出</el-button>-->
+            <el-button type="danger" @click="deleteall">批量删除</el-button>
+<!--            <el-button type="primary" plain>显示字段</el-button>-->
           </div>
         </div>
 
@@ -49,16 +49,35 @@
       <div>
         <el-row>
           <el-col :span="24">
-            <el-table :data="tabledata" border>
+            <el-table :data="tabledata" ref="tableref" border>
               <el-table-column type="selection" width="55" />
-              <el-table-column label="点名称"></el-table-column>
-              <el-table-column label="数据类型"></el-table-column>
-              <el-table-column label="从设备号"></el-table-column>
-              <el-table-column label="起始地址"></el-table-column>
-              <el-table-column label="起始地址偏移量"></el-table-column>
-              <el-table-column label="待读寄存器的个数"></el-table-column>
-              <el-table-column label="变量类型"></el-table-column>
-              <el-table-column label="操作" fixed="right" ></el-table-column>
+              <el-table-column v-for="item in cloumdata.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
+              <el-table-column label="操作" fixed="right" >
+                <template #default="scope">
+                  <div>
+
+                    <el-button
+                      link  @click="editpoint(scope.row,2)"
+                    >
+                      <el-tooltip effect="dark" content="编辑">
+                        <el-icon>
+                          <Edit />
+                        </el-icon>
+                      </el-tooltip>
+                    </el-button>
+
+                    <el-popconfirm title="确定删除该点位?" @confirm="deleterow(scope.row)">
+                      <template #reference>
+                        <el-button link
+                        ><el-tooltip effect="dark" content="删除"
+                        ><el-icon><Delete /></el-icon></el-tooltip
+                        ></el-button>
+                      </template>
+                    </el-popconfirm>
+                  </div>
+                </template>
+
+              </el-table-column>
 
             </el-table>
           </el-col>
@@ -67,7 +86,10 @@
                            small
                            background
                            layout="prev, pager, next"
-                           :total="50"
+                           :total="pagedata.total"
+                           :page-size="pagedata.size"
+                           :current-page="pagedata.current"
+                           @current-change="onchangepage"
                            class="mt-4"
             />
           </el-col>
@@ -82,22 +104,110 @@
 </template>
 
 <script setup lang="ts" name="Units">
-import {ref} from "vue";
+import {onMounted, ref} from "vue";
 import {useRoute, useRouter} from "vue-router";
+import {listDatapoint,addDatapoint,delDatapoint,updateDatapoint} from "@/api/data/datapoint"
+import {ElMessage, ElMessageBox} from "element-plus";
 
 
 const route = useRoute();
 const router = useRouter();
 
 const searchform = ref({
-  protocolname: '',
+  name: '',
 })
+const initdata = ()=>{
+  searchform.value = {
+    name: '',
+  }
+}
+
+const cloumdata = ref([
+  {label: '点名称', prop:'name',visible:true},
+  {label: '数据类型', prop:'dataType',visible:true},
+  {label: '从设备号', prop:'slaveDeviceNumber',visible:true},
+  {label: '起始地址', prop:'addr',visible:true},
+  {label: '起始地址偏移量', prop:'addrOffset',visible:true},
+  {label: '待读寄存器的个数', prop:'len',visible:true},
+  {label: '变量类型', prop:'valueType',visible:true},
+]);
+
+const tableref = ref(null);
 
 const tabledata = ref([1])
 const goadd = ()=>{
-  router.push("/gateway/pointsetting/add");
+  router.push("/gateway/pointsetting/add?type=0");
+}
+
+const pagedata = ref({
+  total:0,
+  size:10,
+  current:1
+});
+const onchangepage = (page) => {
+  pagedata.value.current = page;
+  getalldata();
 }
+const currentsensor = ref(null)
+
+const getalldata = ()=>{
+  listDatapoint({...searchform.value,pageSize:pagedata.value.size,pageNum:pagedata.value.current,sensorId:currentsensor.value.id}).then(res => {
+    const {rows,total,page,size} = res;
+    pagedata.value = {total:total,current:page, size:10};
+    tabledata.value = rows
+  })
+
+}
+
 
+const editpoint =(item)=>{
+  localStorage.setItem("currentpoint",JSON.stringify(item));
+  router.push("/gateway/pointsetting/add?type=1");
+}
+const deleterow =(item)=>{
+  delDatapoint(item.id).then((res)=>{
+    ElMessage.success("删除成功");
+    getalldata();
+  })
+}
+
+const deleteall = ()=>{
+  let selected =  tableref.value.getSelectionRows();
+  if(selected.length==0) {
+    ElMessage.warning("请选择要删除的行");
+    return;
+  }
+
+  if (selected.length > 0) {
+    ElMessageBox.confirm(
+      `是否删除${selected.length}条数据`,
+      "警告",
+      {
+        confirmButtonText: "确认",
+        cancelButtonText: "取消",
+        type: 'warning',
+      }
+    ).then(() => {
+
+      delDatapoint(selected.map(i => i.id).join(",")).then((res) => {
+        ElMessage.success("删除成功");
+        getalldata();
+      })
+
+    });
+  }
+
+}
+
+
+onMounted(()=>{
+  let data = localStorage.getItem("currentsensor");
+  if(data == null||data == undefined){
+    router.back()
+  }
+  currentsensor.value = JSON.parse(data);
+  getalldata();
+})
 
 </script>