浏览代码

编码分类设置

lipenghui 13 小时之前
父节点
当前提交
d024f3df83

+ 3 - 0
src/api/pms/device/index.ts

@@ -46,6 +46,9 @@ export interface IotDeviceVO {
 
 // 设备台账 API
 export const IotDeviceApi = {
+  getMaxCode: async (params:any) => {
+    return await request.get({ url: `/rq/iot-device/max?yfCode=`+params})
+  },
   getMapDevice: async (params:any) => {
     return await request.get({ url: `/rq/iot-device/map`, params})
   },

+ 4 - 0
src/api/pms/yfclass/index.ts

@@ -12,6 +12,10 @@ export interface IotYfClassifyVO {
 
 // 设备分类 API
 export const IotYfClassifyApi = {
+  // 查询设备分类分页
+  getChildrenList: async () => {
+    return await request.get({ url: `/rq/iot-yf-classify/children-list`})
+  },
   // 查询设备分类分页
   getIotYfClassifyPage: async (params: any) => {
     return await request.get({ url: `/rq/iot-yf-classify/list`, params })

+ 4 - 0
src/locales/en.ts

@@ -586,6 +586,10 @@ export default {
     nameHolder:'Please enter DeviceName',
     code:'DeviceCode',
     codeHolder:'Please enter DeviceCode',
+    yfCode:'油服编码',
+    yfCodeHolder:'请输入油服编码',
+    yfClass:'编码分类',
+    yfClassHolder:'请输入油服编码',
     brand:'Brand',
     brandHolder:'Please enter Brand',
     moreSearch:'MoreSearch',

+ 4 - 0
src/locales/zh-CN.ts

@@ -583,6 +583,10 @@ export default {
     nameHolder:'请输入设备名称',
     code:'设备编码',
     codeHolder:'请输入设备编码',
+    yfCode:'油服编码',
+    yfCodeHolder:'请输入油服编码',
+    yfClass:'编码分类',
+    yfClassHolder:'请输入油服编码',
     brand:'品牌',
     brandHolder:'请输入品牌',
     moreSearch:'更多查询',

+ 31 - 2
src/views/pms/device/IotDeviceForm.vue

@@ -15,6 +15,21 @@
       </div>
       <div class="base-expandable-content" :class="{ 'is-expanded': baseIsExpanded }">
         <el-row>
+          <el-col :span="8">
+            <el-form-item :label="t('iotDevice.yfClass')" prop="yfClass">
+              <el-cascader
+                style="width: 100%"
+                v-model="formData.yfClass"
+                :options="yfclasses"
+                :props="{ expandTrigger: 'hover' }"
+                @change="handleYfClassChange" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="t('iotDevice.yfCode')" prop="yfCode">
+              <el-input v-model="formData.yfCode" placeholder="请输入油服设备编码" />
+            </el-form-item>
+          </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.code')" prop="deviceCode">
               <el-input v-model="formData.deviceCode" :disabled="formType==='update'" placeholder="请输入设备编码" />
@@ -22,7 +37,6 @@
           </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.name')" prop="deviceName">
-<!--              <el-input v-model="formData.deviceName" placeholder="请输入设备名称" />-->
               <lang-input v-model="formData.deviceName" placeholder="请输入设备名称" />
             </el-form-item>
           </el-col>
@@ -381,6 +395,7 @@ import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import {DeviceAttrModelApi} from "@/api/pms/deviceattrmodel";
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+import {IotYfClassifyApi} from "@/api/pms/yfclass";
 
 /** 设备台账 表单 */
 defineOptions({ name: 'DeviceDetailAdd' })
@@ -409,8 +424,11 @@ const formType = ref('') // 表单的类型:create - 新增;update - 修改
 const brandLabel = ref('') // 表单的类型:create - 新增;update - 修改
 const zzLabel = ref('') // 表单的类型:create - 新增;update - 修改
 const supplierLabel = ref('') // 表单的类型:create - 新增;update - 修改
+const yfclasses = ref([])
 const formData = ref({
   id: undefined,
+  yfClass: undefined,
+  yfCode: undefined,
   enableDate: undefined,
   deviceCode: undefined,
   deviceName: undefined,
@@ -447,6 +465,8 @@ const formData = ref({
   assetClass: undefined
 })
 const formRules = reactive({
+  yfClass: [{ required: true, message: '编码类别不能为空', trigger: 'blur' }],
+  yfCode: [{ required: true, message: '油服编码不能为空', trigger: 'blur' }],
   assetClass: [{ required: true, message: '资产类别不能为空', trigger: 'blur' }],
   deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
   deviceName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
@@ -459,7 +479,12 @@ const formRules = reactive({
 })
 
 const list = ref([])
-
+const handleYfClassChange = async (value) =>{
+  console.log(value)
+  const prefix = value.join('')
+  const last = await IotDeviceApi.getMaxCode(prefix)
+  formData.value.yfCode = prefix+last
+}
 const assetclasschange = () => {
   const assetClass = formData.value.assetClass
   DeviceAttrModelApi.getDeviceAttrModelListByDeviceCategoryId(assetClass).then(res => {
@@ -600,6 +625,7 @@ const submitForm = async () => {
       }))
       formData.value.templateJson = JSON.stringify(list.value)
     }
+    formData.value.yfClass = formData.value.yfClass.join('');
     const data = formData.value as unknown as IotDeviceVO
     if (formType.value === 'create') {
       await IotDeviceApi.createIotDevice(data)
@@ -650,6 +676,9 @@ onMounted(async () => {
     }
     formType.value = 'create';
   }
+  await IotYfClassifyApi.getChildrenList().then(res => {
+    yfclasses.value = res
+  });
 })
 /** 重置表单 */
 const resetForm = () => {

+ 33 - 1
src/views/pms/device/IotDeviceFormAdd.vue

@@ -15,6 +15,23 @@
       </div>
       <div class="base-expandable-content" :class="{ 'is-expanded': baseIsExpanded }">
         <el-row>
+          <el-col :span="8">
+            <el-form-item :label="t('iotDevice.yfClass')" prop="yfClass">
+              <el-cascader
+                style="width: 100%"
+                v-model="formData.yfClass"
+                :options="yfclasses"
+                :props="{ expandTrigger: 'hover' }"
+                clearable
+                filterable
+                @change="handleYfClassChange" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="t('iotDevice.yfCode')" prop="yfCode">
+              <el-input v-model="formData.yfCode" :disabled="formType==='update'" placeholder="请输入油服设备编码" />
+            </el-form-item>
+          </el-col>
           <el-col :span="8">
             <el-form-item :label="t('iotDevice.code')" prop="deviceCode">
               <el-input v-model="formData.deviceCode" :disabled="formType==='update'" placeholder="请输入设备编码" />
@@ -370,6 +387,7 @@ import * as ProductClassifyApi from '@/api/pms/productclassify'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import {DeviceAttrModelApi} from "@/api/pms/deviceattrmodel";
+import {IotYfClassifyApi} from "@/api/pms/yfclass";
 
 
 /** 设备台账 表单 */
@@ -398,10 +416,13 @@ const formType = ref('') // 表单的类型:create - 新增;update - 修改
 const brandLabel = ref('') // 表单的类型:create - 新增;update - 修改
 const zzLabel = ref('') // 表单的类型:create - 新增;update - 修改
 const supplierLabel = ref('') // 表单的类型:create - 新增;update - 修改
+const yfclasses = ref([])
 const formData = ref({
   id: undefined,
   deviceCode: undefined,
   deviceName: undefined,
+  yfClass: undefined,
+  yfCode: undefined,
   brand: undefined,
   brandName: undefined,
   model: undefined,
@@ -433,6 +454,8 @@ const formData = ref({
   assetClass: undefined
 })
 const formRules = reactive({
+  yfClass: [{ required: true, message: '编码类别不能为空', trigger: 'blur' }],
+  yfCode: [{ required: true, message: '油服编码不能为空', trigger: 'blur' }],
   assetClass: [{ required: true, message: '资产类别不能为空', trigger: 'blur' }],
   deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
   deviceName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
@@ -463,7 +486,12 @@ const assetclasschange = () => {
     }
   })
 }
-
+const handleYfClassChange = async (value) =>{
+  console.log(value)
+  const prefix = value.join('')
+  const last = await IotDeviceApi.getMaxCode(prefix)
+  formData.value.yfCode = prefix+last
+}
 const brandChoose = (row) => {
   formData.value.brand = row.id
   // brandLabel.value = row.value
@@ -586,6 +614,7 @@ const submitForm = async () => {
       }))
       formData.value.templateJson = JSON.stringify(list.value)
     }
+    formData.value.yfClass = formData.value.yfClass.join('');
     const data = formData.value as unknown as IotDeviceVO
     if (formType.value === 'create') {
       await IotDeviceApi.createIotDevice(data)
@@ -632,6 +661,9 @@ onMounted(async () => {
     }
     formType.value = 'create';
   }
+  await IotYfClassifyApi.getChildrenList().then(res => {
+    yfclasses.value = res
+  });
 })
 /** 重置表单 */
 const resetForm = () => {

+ 57 - 19
src/views/pms/device/monitor/TdDeviceInfo.vue

@@ -160,36 +160,74 @@ const renderChart = async () => {
   if (chartInstance) chartInstance.dispose()
 
   chartInstance = markRaw(echarts.init(chartContainer.value))
+
+  // 设置固定阈值
+  const upperLimit = 30  // 固定上限阈值
+  const lowerLimit = 12   // 固定下限阈值
+
   const option = {
-    title:{
-      text: topicName.value+'数据趋势',
-      left:'center',
+    title: {
+      text: topicName.value + '数据趋势',
+      left: 'center',
     },
-    tooltip: { trigger: 'axis', },
+    tooltip: { trigger: 'axis' },
     xAxis: {
       type: 'category',
       data: result.value.map(d => dayjs(d.timestamp).format('YYYY-MM-DD HH:mm:ss')),
-      // data: result.value.map(item => Object.keys(item)[0]),
-      axisLabel: { rotate: 45 }, // X轴标签旋转防止重叠
+      axisLabel: { rotate: 45 },
       inverse: true,
     },
-    yAxis: { type: 'value' },
+    yAxis: {
+      type: 'value',
+      // 根据固定阈值和实际数据调整Y轴范围,使阈值线更清晰
+      // min: Math.min(lowerLimit * 0.9, ...result.value.map(d => d.value || 0)),
+      // max: Math.max(upperLimit * 1.03, ...result.value.map(d => d.value || 0))
+    },
     dataZoom: [{
       type: 'slider',
       xAxisIndex: 0,
-      start: 0,  // 初始显示范围开始位置
-      end: 100   // 初始显示范围结束位置:ml-citation{ref="7" data="citationList"}
+      start: 0,
+      end: 100
     }],
-    series: [{
-      data: result.value.map(d => d.value),
-      // data: result.value.map(item => {
-      //   const key = Object.keys(item)[0]; // 获取当前元素的key
-      //   return item[key][0][topic.value]; // 提取value数组中第一个对象的属性
-      // }),
-      type: 'line',
-      smooth: true,
-      areaStyle: {} // 显示区域填充
-    }]
+    series: [
+      // 原始数据曲线
+      {
+        data: result.value.map(d => d.value),
+        type: 'line',
+        smooth: true,
+        name: '实时数据',
+        lineStyle: { color: '#409eff' }
+      },
+      // 上限阈值线(固定100)
+      {
+        data: result.value.map(() => upperLimit),
+        type: 'line',
+        name: '上限阈值(100)',
+        lineStyle: {
+          color: '#f56c6c',  // 红色虚线
+          type: 'dashed'
+        },
+        symbol: 'none',  // 不显示数据点
+        emphasis: { disabled: true }  // 禁用悬停高亮
+      },
+      // 下限阈值线(固定95)
+      {
+        data: result.value.map(() => lowerLimit),
+        type: 'line',
+        name: '下限阈值(95)',
+        lineStyle: {
+          color: '#e6a23c',  // 橙色虚线
+          type: 'dashed'
+        },
+        symbol: 'none',
+        emphasis: { disabled: true }
+      }
+    ],
+    // 添加图例显示各线条含义
+    legend: {
+      data: ['实时数据', '上限阈值(100)', '下限阈值(95)'],
+      top: 30
+    }
   }
 
   chartInstance.setOption(option)

+ 11 - 0
src/views/pms/yfclass/index.vue

@@ -63,6 +63,17 @@
       <el-table-column prop="name" label="编码分类名称" />
       <el-table-column prop="code" label="编码分类编码" />
       <el-table-column prop="sort" label="排序" />
+      <el-table-column prop="company" label="所属公司" >
+        <template #default="scope">
+          <span v-if="scope.row.company==='RH'" style="font-weight: bold">瑞恒兴域</span>
+          <span v-if="scope.row.company==='RD'" style="font-weight: bold">四川瑞都</span>
+          <span v-if="scope.row.company==='RY'" style="font-weight: bold">瑞鹰国际</span>
+          <span v-if="scope.row.company==='DF'" style="font-weight: bold">东方石油</span>
+          <span v-if="scope.row.company==='RL'" style="font-weight: bold">瑞霖技术</span>
+          <span v-if="scope.row.company==='RQ'" style="font-weight: bold">瑞气能源</span>
+          <span v-if="scope.row.company==='DM'" style="font-weight: bold">DMCC 中东</span>
+        </template>
+      </el-table-column>
       <el-table-column prop="status" label="状态">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />