YangJian0701 11 ماه پیش
والد
کامیت
11bbccc9a4
50فایلهای تغییر یافته به همراه5417 افزوده شده و 1635 حذف شده
  1. 0 1
      src/App.vue
  2. 22 4
      src/api/equipmentManagement/management.js
  3. BIN
      src/assets/img/151.png
  4. 3 10
      src/components/suspension-panel.vue
  5. 118 91
      src/router/index.js
  6. 45 169
      src/router/modules/asyncRouter.js
  7. 9 9
      src/store/index.js
  8. 9 10
      src/utils/base.js
  9. 0 0
      src/views/MovingRing/MovingRingMonitoring.vue
  10. 0 0
      src/views/MovingRing/MovingRingMonitoring1.vue
  11. 1 14
      src/views/MovingRing/index.vue
  12. 0 0
      src/views/MovingRing/js/MovingData.js
  13. 0 0
      src/views/MovingRing/js/MovingRingApi.js
  14. 23 0
      src/views/MovingRing/js/goods.js
  15. 50 0
      src/views/MovingRing/js/initParam.js
  16. 42 0
      src/views/MovingRing/js/qiliuyun.js
  17. 56 0
      src/views/MovingRing/js/rules.js
  18. 56 0
      src/views/MovingRing/js/websocketfun.js
  19. 0 0
      src/views/MovingRing/modules/MovingModel.vue
  20. 0 0
      src/views/MovingRing/modules/MovingRingMonitoringDIR.vue
  21. 0 0
      src/views/MovingRing/modules/MovingRingNoData.vue
  22. 95 0
      src/views/MovingRing/modules/newNotices.vue
  23. 1 1
      src/views/Theorder/Theorder.vue
  24. 0 0
      src/views/Theorder/address.vue
  25. 0 0
      src/views/Theorder/courier.vue
  26. 12 0
      src/views/Theorder/index.vue
  27. 23 0
      src/views/Theorder/js/goods.js
  28. 50 0
      src/views/Theorder/js/initParam.js
  29. 42 0
      src/views/Theorder/js/qiliuyun.js
  30. 56 0
      src/views/Theorder/js/rules.js
  31. 56 0
      src/views/Theorder/js/websocketfun.js
  32. 95 0
      src/views/Theorder/modules/newNotices.vue
  33. 156 0
      src/views/Theorder/modules/webscoket.vue
  34. 0 0
      src/views/Theorder/preview.vue
  35. 2 2
      src/views/ToolSystem/MyPerf.vue
  36. 1 1
      src/views/ToolSystem/Perf.vue
  37. 0 363
      src/views/ToolSystem/modules/MovingModel2.vue
  38. 1 2
      src/views/companyManagement/Company.vue
  39. 568 0
      src/views/equipmentManagement/abandonDeviceCallthepolice.vue
  40. 600 0
      src/views/equipmentManagement/abandonDeviceChartShow.vue
  41. 811 0
      src/views/equipmentManagement/abandonDeviceDataShow.vue
  42. 692 0
      src/views/equipmentManagement/abandonDeviceEquipment.vue
  43. 1473 0
      src/views/equipmentManagement/abandonDeviceManagement.vue
  44. 0 542
      src/views/equipmentManagement/callthepolice - 副本.vue
  45. 10 3
      src/views/equipmentManagement/callthepolice.vue
  46. 189 136
      src/views/equipmentManagement/management.vue
  47. 0 265
      src/views/layout/Topmenu copy.vue
  48. 24 8
      src/views/layout/Topmenu.vue
  49. 26 4
      src/views/layout/index.vue
  50. BIN
      冷链3.0.rar

+ 0 - 1
src/App.vue

@@ -29,7 +29,6 @@
 		},
 		
 		mounted() {
-            console.log(this.$route)
 			// //console.log(navigator.userAgent.indexOf('Chrome') > -1) //Opera浏览器 Firefox浏览器 Chrome浏览器 Safari浏览器 compatible(ie)是当前浏览器true
 			const that = this;
 			AOS.init();

+ 22 - 4
src/api/equipmentManagement/management.js

@@ -34,13 +34,31 @@ const DevApi = {
 	DevSenDel: '/v3/DeviceSensor/Del',//单个传感器设置删除
 
     getDepartment: '/v3/JWX/getDepartment',//单位拉去数据
-    getColdEquipment: '/v3/JWX/getColdEquipment',//单位拉去数据
-    sensorUpload: '/v3/JWX/sensorUpload',//单位拉去数据
-    probeUpload: '/v3/JWX/probeUpload',//单位拉去数据
+    getColdEquipment: '/v3/JWX/getColdEquipment',//绑定设备
+    probeUpload: '/v3/JWX/probeUpload',//传感器探头信息上传
+    sensorUpload: '/v3/JWX/sensorUpload',//中继器基础信息上传
+    createMaintainInfo: '/v3/JWX/createMaintainInfo',//
+    probeRefUpload: '/v3/JWX/probeRefUpload',//冷链设备传感器(探头)关联关系上传接口
+    
+
+    findMaintainInfo: '/v3/JWX/findMaintainInfo',//回显
 
-    probeRefUpload: '/v3/JWX/probeRefUpload',//单位拉去数据
     
 }
+export function findMaintainInfo(data){
+	return axios({
+		url:DevApi.findMaintainInfo,
+		method: 'post',
+		data:data
+	})
+}
+export function createMaintainInfo(data){
+	return axios({
+		url:DevApi.createMaintainInfo,
+		method: 'post',
+		data:data
+	})
+}
 export function probeRefUpload(data){
 	return axios({
 		url:DevApi.probeRefUpload,

BIN
src/assets/img/151.png


+ 3 - 10
src/components/suspension-panel.vue

@@ -80,9 +80,7 @@
 </template>
 
 <script>
-import {
-		mapGetters
-	} from "vuex"
+import { mapGetters } from "vuex"
 import { noticeGetList,noticeIsReadBulletin } from "@/api/notices.js";
 export default {
     computed: mapGetters(["showFirm"]),
@@ -141,9 +139,10 @@ export default {
         },
         async initializeFun(){
             const {data:result} = await this.notApi()
-            // console.log('新消息',result,this.$store.state.previousRoute)
             if (result.Code==200) {
                 let res = result.Data.Data || []
+                // console.log('新消息',res)
+
                 if(res.length>0){
                     this.outerVisible = true
                     // if(this.$store.state.previousRoute.name == 'login')this.outerVisible = true
@@ -215,12 +214,6 @@ export default {
   /* 修改标题栏样式 */
   color: #fff;
 }
-.custom-dialog .el-dialog__title,.el-tabs__item,.systemMsg_mani,.el-pagination__total,.el-pagination__jump{
-    // color: #fff;
- }
-.custom-dialog .el-dialog__body {
-  /* 修改内容区域样式 */
-}
 .custom-dialog  .el-pagination.is-background .el-pager li {
     margin: 0 5px;
     background-color: #979da3;

+ 118 - 91
src/router/index.js

@@ -3,6 +3,9 @@ import VueRouter from "vue-router";
 import layout from "@/views/layout/layout"
 import intelligentrouterData from "./modules/intelligentrouter.js"
 import storts from "../store/index"
+import {
+    infos
+} from "../api/login.js"
 Vue.use(VueRouter);
 
 const routes = [
@@ -33,12 +36,30 @@ const routes = [
         path: "/layout",
         name: "layout",
         hidden: false,
+        redirect: '/home/workbench',
         meta: {
             title: '工作台',
         },
-        redirect: '/home/workbench',
         component: layout,
-        children: []
+        children: [{
+            path: '/home',
+            name: 'home',
+            redirect: '/home/workbench',
+            icon: "icon-shouye",
+            component: () => import('@/views/home/index.vue'),
+            meta: {
+                title: '首页',
+            },
+            children: [{
+                path: '/home/workbench',
+                name: 'workbench',
+                icon: "icon-shouye",
+                component: () => import('@/views/home/workbench.vue'),
+                meta: {
+                    title: '工作台',
+                },
+            }]
+        }]
     },
     {
         path: '/msgAlert',
@@ -58,104 +79,110 @@ const router = new VueRouter({
     routes,
 });
 //登录拦截//未登录返回到登录界面
-router.beforeEach(async(to,from, next) => {
+router.beforeEach(async (to, from, next) => {
     storts.dispatch('SETROUTE', from);
-    let token = storts.state.userInfo.token
-
-    if(token){//有token,放行
-        console.log('flag',storts.state.isLoadingNav);
-        if(to.path=='/'){
-            console.log('去登录');
-            next()
-            storts.dispatch('SET_LOADING_NAV', false);
-            return;
-        }
-        if(storts.state.isLoadingNav){//已获取导航,不用获取
-            console.log('已获取导航');
-            storts.dispatch('SET_LOADING_NAV', true);
-            next()  
-        }else{//未获取导航 立即获取
-            await _setMenu()
-            console.log('未获取导航',to.path,from.path);
-            next({path:to.path,replace:true});
-            // next()  
-            storts.dispatch('SET_LOADING_NAV', true);
-        }
-    }else{//没有token,去登陆页
-        console.log('没有token,去登陆页');
-        
-        storts.dispatch('SET_LOADING_NAV', false);
-        to.path!='/'?next('/'):next();
-    }
-    return;
     
-    if (storts.state.userInfo.token) {//存在token
-        if(from.path=='/index' && to.path!='/'){
-            if (storts.state.nav.length == 0) {
-                await _setMenu()
-                console.log('重新加载菜单222')
-                next({path:to.path});
-            } else {
-                next();
-            }
-            return;
+    if(storts.state.nav.length==0){
+        if(to.path == '/'){
+            next()
         }else{
-            console.log('从其他界面进入',to,from)
-            if (storts.state.nav.length == 0) {
-                await _setMenu()
-                return next({path:to.path});
+            if(to.path.includes('/msgAlert')){//处理短信链接跳转
+                document.title = to.meta.title
+                next()	
+                return
             }
-            next(); 
+            //获取数据
+            let res = await getNavData();
+            //处理路由配置数据
+            let dynamicRouter = await addDynamic(res)
+            dynamicRouter.map(item=>{
+                routes[3].children.push(item)
+                router.addRoute('layout', item);
+            })
+            //动态添加路由
+            // router.addRoutes(dynamicRouter)
+            // router.addRoute('layout', dynamicRouter);
+            
+            //vuex数据缓存
+            storts.dispatch('SETNAV', dynamicRouter) //缓存到vuex
+            //判断是否有标题,赋值标题
+            to.meta.title ? document.title = to.meta.title : document.title = '宝智达-冷链系统3.0'
+            next({path:to.path})//不写刷新会白屏
         }
-    } else {//不存在token
-        to.path!='/'?next('/'):next();
-        console.log('不存在token',to,from);
-        return;
+    }else{
+        if(to.path == '/'){
+            storts.dispatch('SETPANY', {T_name:'',bl:false,plan:''}) //显示公司  登录页不显示
+            storts.dispatch('SETNAV', []) //缓存到vuex
+        }
+        next()//不写刷新会白屏
     }
-    // if (!storts.state.userInfo.token && to.path!='/') {//不存在token & 当前不为登录页
-    //     next('/'); 
-    // } else {//有token
-    //     if(from.path=='/index'&& to.path!='/'){
-    //         console.log('重新加载菜单')
-    //         _setMenu(to,next)
-    //     }
-    //     if (storts.state.nav.length == 0) {
-    //         if (!storts.state.isLoadingNav) {
-    //             _setMenu(to,next)
-    //         } else {
-    //             next();
-    //         }
-    //     } else {
-    //         next();
-    //     }
-    // }
-
-});
-
-function _setMenu() {
-    return new Promise((resolve) => {
-        storts.dispatch('generateRoutes').then(routes => {
-            // 先移除已存在的路由
-            const existingRoutes = router.getRoutes();
-            routes.forEach(route => {
-                if (!existingRoutes.some(existingRoute => existingRoute.name === route.name)) {
-                    router.addRoute('layout', route);
-                }
-            });
-            storts.dispatch('SETNAV', routes);
-            resolve(true)
-        }).catch(() => {
-            resolve(false)
-        });
+})
+//获取数据
+function getNavData(){
+    return new Promise(resolve=>{
+        infos({}).then(res => {
+            const {Permission:resIt} = res.data.Data
+            storts.dispatch('SETPER', resIt) //缓存权限到vuex
+            resolve(res.data.Data.Data)
+        })
     })
-    
 }
 
-function _setdatas(){
-    storts.commit('setuserInfo', {
-        username: '',
-        password: '',
-        token: ''
+
+function addDynamic(result, parentPath = '', level = 0) {
+    routes[3].children = []
+    return result.map(item=>{
+        const currentPath = parentPath ? `${parentPath}/${item.T_permission}` : `/${item.T_permission}`;
+        const children = item.Children && item.Children.length > 0 
+            ? addDynamic(item.Children, currentPath, level + 1) 
+            : [];
+        const route = {
+            path:currentPath,
+            name: item.T_permission || '',
+            icon: item.T_icon,
+            id:item.Id,
+            component: level == 0 
+            ? () => import(`@/views/${item.T_permission}/index.vue`)
+            : () => import(`@/views/${parentPath.slice(1)}/${item.T_permission}.vue`),
+            meta: {
+                title: item.T_name,
+            },
+            children:children,
+        }
+        return route
     })
+    // result.forEach(item=>{
+    //     routes[3].children.push({
+    //         path: '/'+item.T_permission,
+    //         name: item.T_permission || '',
+    //         icon: item.T_icon,
+    //         component: () => import(`@/views/${item.T_permission}/index.vue`),
+    //         meta: {
+    //             title: item.T_name,
+    //         },
+    //         children:addDynamicEr(item),
+    //         // redirect:addDynamicEr(item)[0].path
+    //     })
+    // })
+    // return routes
 }
+
+// function addDynamic(result, parentPath = '', level = 0) {
+//     routes[3].children = []
+//     result.forEach(item=>{
+//         routes[3].children.push({
+//             path: '/'+item.T_permission,
+//             name: item.T_permission || '',
+//             icon: item.T_icon,
+//             component: () => import(`@/views/${item.T_permission}/index.vue`),
+//             meta: {
+//                 title: item.T_name,
+//             },
+//             children:addDynamicEr(item),
+//             // redirect:addDynamicEr(item)[0].path
+//         })
+//     })
+//     return routes
+// }
+
 export default router;

+ 45 - 169
src/router/modules/asyncRouter.js

@@ -1,175 +1,51 @@
-import Vue from "vue";
-import VueRouter from "vue-router";
-import layout from "@/views/layout/layout"
-import intelligentrouterData from "./modules/intelligentrouter.js"
-import storts from "../store/index"
-import {
-	infos
-} from "../api/login.js"
-Vue.use(VueRouter);
+import storts from "@/store/index"
+import router from '@/router/index.js';
+import {infos} from "@/api/login.js"
+// 动态添加路由的函数
+export async function asyncRouter() {
+    try {
+        const response = await infos({})
+        const {data:result} = response 
 
-const routes = [
-	{
-		path: "",
-		name: "login",
-		hidden: true,
-		meta: {
-			title: '你好,请登录',
-		},
-		component: () => import('@/views/login.vue')
-	}, {
-		path: "/index",
-		name: "index",
-		hidden: true,
-		meta: {
-			title: '宝智达冷链系统v3.0',
-		},
-		component: () => import('@/views/layout/index.vue')
-	},
-    {
-		path: '*',
-		name: "error",
-		hidden:true,
-		component: () => import('@/components/error.vue'),
-	},
-	{
-		path: "/layout",
-		name: "layout",
-		hidden: false,
-		redirect: '/home/workbench',
-		meta: {
-			title: '工作台',
-		},
-		component: layout,
-		children: [{
-			path: '/home',
-			name: 'home',
-			redirect: '/home/workbench',
-			icon: "icon-shouye",
-			component: () => import('@/views/workbench/index.vue'),
-			meta: {
-				title: '首页',
-			},
-			children: [{
-				path: '/home/workbench',
-				name: 'workbench',
-				icon: "icon-shouye",
-				component: () => import('@/views/workbench/workbench.vue'),
-				meta: {
-					title: '工作台',
-				},
-			}]
-		}]
-	},
-    {
-		path: '/msgAlert',
-		name: "msgAlert",
-		hidden:true,
-        meta: {
-			title: '短信通知',
-		},
-		component: () => import('@/views/msgAlert.vue'),
-	},
-	...intelligentrouterData.intelligentrouterData
-];
+        storts.commit('SETPER', result.Data.Permission) //缓存权限到vuex
 
-const router = new VueRouter({
-	mode: "hash", //hash
-	base: process.env.BASE_URL,
-	routes,
-});
-//全局后置路由守卫----初始化时执行,每次路由切换后执行
-// router.afterEach(async (to,from)=>{
-// 	if(to.path=='/index' && from.path=='/companyManagement/Company' ){//登录进来的
-// 		router.options.routes[3].children = []
-// 		storts.dispatch('SETNAV', []) //缓存到vuex
-		
-// 		let res = await getNavData();
-// 		//处理路由配置数据
-// 		let dynamicRouter = addDynamic(res)
-// 		//动态添加路由
-// 		router.addRoutes(dynamicRouter)
-		
-// 		//vuex数据缓存
-// 		storts.dispatch('SETNAV', res) //缓存到vuex
-// 	}
-// })
-//登录拦截//未登录返回到登录界面
-router.beforeEach(async (to, from, next) => {
-    storts.dispatch('SETROUTE', from);
-    console.log('登录拦截','新:',to.path,'旧:', from.path,storts.state.nav)
-	if(storts.state.nav.length==0){
-		if(to.path == '/'){
-			next()
-		}else{
-            if(to.path.includes('/msgAlert')){//处理短信链接跳转
-                document.title = to.meta.title
-                next()	
-                return
+        const routes = formatRoutes(result.Data.Data);
+        storts.commit('SETNAV', routes);
+
+        const existingRoutes = router.getRoutes();
+        routes.forEach(route => {
+            if (!existingRoutes.some(existingRoute => existingRoute.name === route.name)) {
+                router.addRoute('layout', route);
             }
-			//获取数据
-			let res = await getNavData();
-			//处理路由配置数据
-			let dynamicRouter = addDynamic(res)
-			//动态添加路由
-            router.addRoutes(dynamicRouter)
-			//vuex数据缓存
-			storts.dispatch('SETNAV', res) //缓存到vuex
-			//判断是否有标题,赋值标题
-			to.meta.title ? document.title = to.meta.title : document.title = '宝智达-冷链系统3.0'
-            next({path:to.path})//不写刷新会白屏
-		}
-	}else{
-		if(to.path == '/'){
-			storts.dispatch('SETPANY', {T_name:'',bl:false,plan:''}) //显示公司  登录页不显示
-			storts.dispatch('SETNAV', []) //缓存到vuex
-		}
-		next()//不写刷新会白屏
-	}
-})
-//获取数据
-function getNavData(){
-	return new Promise(resolve=>{
-		infos({}).then(res => {
-			const {Permission:resIt} = res.data.Data
-			storts.dispatch('SETPER', resIt) //缓存权限到vuex
-			resolve(res.data.Data.Data)
-		})
-	})
-}
-function addDynamic(result) {
-	routes[3].children = []
-	result.forEach(item=>{
-		routes[3].children.push({
-			path: '/'+item.T_permission,
-			name: item.T_permission || '',
-			icon: item.T_icon,
-			component: () => import(`@/views/${item.T_permission}/index.vue`),
-			meta: {
-				title: item.T_name,
-			},
-			children:addDynamicEr(item),
-			// redirect:addDynamicEr(item)[0].path
-		})
-	})
-	return routes
+        });
+        return routes 
+    } catch (error) {
+        console.error('获取导航数据失败', error);
+        return [];
+    }
 }
 
-function addDynamicEr(result){
-	var arr = []
-	result.Children.forEach(item=>{
-		arr.push({
-			path:  '/' + result.T_permission + "/" + item.T_permission,
-			name: item.T_permission || '',
-			icon: item.T_icon,
-			component: () => import(`@/views/${result.T_permission}/${item.T_permission}.vue`),
-			meta: {
-				title: item.T_name,
-			},
-			Children: item.Children
-		})
-	})
-	return arr
-}
 
-export default router;
+function formatRoutes(data, parentPath = '', level = 0) {
+    return data.map(item => {
+        const currentPath = parentPath ? `${parentPath}/${item.T_permission}` : `/${item.T_permission}`;
+        const children = item.Children && item.Children.length > 0 
+            ? formatRoutes(item.Children, currentPath, level + 1) 
+            : [];
+        const route = {
+            path: currentPath,
+            name: item.T_permission,
+            icon: item.T_icon,
+            component: level == 0 
+                ? () => import(`@/views/${item.T_permission}/index.vue`)
+                : () => import(`@/views/${parentPath.slice(1)}/${item.T_permission}.vue`),
+                urls: level == 0 
+                ? `@/views/${item.T_permission}/index.vue`
+                :`@/views/${parentPath.slice(1)}/${item.T_permission}.vue`,
+            meta: { title: item.T_name},
+            children: children,
+            // ...(level === 0 && children.length > 0 && { redirect: children[0].path }), // 仅在level为0时添加redirect
+        };
+        return route;
+    });
+}

+ 9 - 9
src/store/index.js

@@ -34,8 +34,8 @@ export default new Vuex.Store({
 		permission:[],//按钮权限列表
 		searchs:false,//是否显示搜索弹窗
         previousRoute:null,//上一个路由
-		isLoadingNav: false,
 	},
+    
 	getters:{//计算属性
 		previousRoute:state=>state.previousRoute,
 		permission:state=>state.permission,
@@ -47,9 +47,6 @@ export default new Vuex.Store({
 	},
 	mutations: {
         
-        SET_LOADING_NAV(state, data) {
-            state.isLoadingNav = data
-        },
         SETROUTE(state,data){//按钮权限列表
 			state.previousRoute = data
 		},
@@ -67,7 +64,6 @@ export default new Vuex.Store({
 		},
 		SETNAV(state,data){///////////////////
 			state.nav = data
-			//console.log('重新设置菜单2',data)
 		},
 		setuserInfo(state, data) {
 			state.userInfo = data
@@ -111,13 +107,17 @@ export default new Vuex.Store({
 		SETDATA({commit},data){//获取数据展示中的 iframe链接所需的参数
 			commit('SETDATA',data)
 		},
-        SET_LOADING_NAV({commit},data){
-			//console.log('重新设置菜单1',data)
-			commit('SET_LOADING_NAV',data)
-		},
 	},
 	modules: {},
 });
+
+/**
+ * 
+ * @param {} data 路由列表
+ * @param {*} parentPath 拼接的组件地址
+ * @param {*} level 用于判断子选项层级
+ * @returns 
+ */
 function formatRoutes(data, parentPath = '', level = 0) {
     return data.map(item => {
         const currentPath = parentPath ? `${parentPath}/${item.T_permission}` : `/${item.T_permission}`;

+ 9 - 10
src/utils/base.js

@@ -2,19 +2,18 @@ let baseURL = ''
 //是否在控制台显示请求日志,本地环境启用,打包环境禁用
 let showHttpLog = false 
 
-baseURL = 'http://coldtest.coldbaozhida.com:9999/api/'//测试通用地址
-// baseURL = 'https://cold.coldbaozhida.com/api/'//生产通用地址
+// baseURL = 'http://coldtest.coldbaozhida.com:9999/api/'//测试通用地址
+baseURL = 'https://cold.coldbaozhida.com/api/'//生产通用地址
 
-baseURLGood = 'http://coldtest.coldbaozhida.com:9999/Cold_GoodsOrder'//测试订单
-// baseURLGood = 'https://cold.coldbaozhida.com/Cold_GoodsOrder'//生产订单
+// baseURLGood = 'http://coldtest.coldbaozhida.com:9999/Cold_GoodsOrder'//测试订单
+baseURLGood = 'https://cold.coldbaozhida.com/Cold_GoodsOrder'//生产订单
+// 
+// baseURLWork = 'http://coldtest.coldbaozhida.com:9999/Cold_WorkOrder'//测试工单系统
+baseURLWork = 'https://cold.coldbaozhida.com/Cold_WorkOrder'//生产工单系统
 
-baseURLWork = 'http://coldtest.coldbaozhida.com:9999/Cold_WorkOrder'//测试工单系统
-
-baseURLPush = 'http://coldtest.coldbaozhida.com:9999/ColdDataPush'//金卫信
+baseURLPush = 'https://cold.coldbaozhida.com/ColdDataPush'//生产金卫信
+// baseURLPush = 'http://coldtest.coldbaozhida.com:9999/ColdDataPush'//测试金卫信
  
-// baseURLWork = 'https://cold.coldbaozhida.com/Cold_WorkOrder'//生产工单系统
-
-
 baseURLColdMonitor = "https://cold.coldbaozhida.com/"//环动
 
 

+ 0 - 0
src/views/ToolSystem/MovingRingMonitoring.vue → src/views/MovingRing/MovingRingMonitoring.vue


+ 0 - 0
src/views/ToolSystem/MovingRingMonitoring1.vue → src/views/MovingRing/MovingRingMonitoring1.vue


+ 1 - 14
src/views/PerfManagement/index.vue → src/views/MovingRing/index.vue

@@ -5,20 +5,7 @@
 </template>
 
 <script>
-	export default {
-		data(){
-			return {
-				navlist:[]
-			}
-		},
-		components: {
-		}
-	}
 </script>
 
-<style lang="scss">
-	.ssf{
-		height: 100%;
-		overflow-y: auto;
-	}
+<style>
 </style>

+ 0 - 0
src/views/ToolSystem/js/MovingData.js → src/views/MovingRing/js/MovingData.js


+ 0 - 0
src/views/ToolSystem/js/MovingRingApi.js → src/views/MovingRing/js/MovingRingApi.js


+ 23 - 0
src/views/MovingRing/js/goods.js

@@ -0,0 +1,23 @@
+export const goods = "image/*,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+
+/**
+ * 设备类型
+ */
+export const deviceType = [
+    {
+        label: '保温箱',
+        value: '保温箱'
+    },
+    {
+        label: '冷藏车',
+        value: '冷藏车'
+    },
+    {
+        label: '其他',
+        value: '其他'
+    }
+]
+
+
+
+export const deviceStatus = ['正常', '在途', '已到达']

+ 50 - 0
src/views/MovingRing/js/initParam.js

@@ -0,0 +1,50 @@
+export const initParam = {
+    t_sn:'',
+    t_orderid: '',
+    startTime: '',
+    endTime: '',
+    page: 1,
+    page_z: 10
+}
+
+/**
+ * 新增或者编辑参数
+ */
+export const ruleForm = {
+    T_orderid: '',//订单号
+    WaybillNo: '',//运单号
+    T_sn: '',//设备编号
+    DeviceType: '',//设备类型
+    IsExpatriate: 1,//是否外派 1 否 2 是
+    Phone: '',//电话
+    T_receiving: '',//收货单位
+    ChildPid: '',//收货单位编号
+    ShippingUnit: '',//发货单位
+    T_time: '',//配送计划,需要切割为开始与结束时间
+    CouriesId:null,//配送员
+    EstimateStartTime: '',//配送计划开始时间
+    EstimateEndTime: '',//配送计划结束时间
+    imgArr: [],//随货同行单本地暂存数组
+    PeerList: [],//随货同行单
+    T_text: '',//详情
+}
+
+
+export const initForm = {
+    page: 1,
+    page_z: 8,
+    T_Address: '',//地址名称
+}
+
+export const ruleForms = {
+    Phone:'',//手机号
+    T_Address:'',//地址
+    T_name: '',//公司名称
+}
+
+//配送员
+export const initFormcou = {
+    page: 1,
+    page_z: 8,
+    T_name: '',//地址名称
+}

+ 42 - 0
src/views/MovingRing/js/qiliuyun.js

@@ -0,0 +1,42 @@
+import { getQiniuToken } from "@/api/pdfToken.js";
+import Axios from 'axios';
+
+export class _sendUpFun {
+    constructor() {
+        this.token = null;
+    }
+
+    /**
+     * 获取七牛云 token
+     * @returns {Promise<string|null>} 返回 token 或 null
+     */
+    async getQiniuToken(e) {
+        let file = e.raw;
+        console.log(file);
+        var strtype = file.name.substring(file.name.lastIndexOf('.') + 1); //获取后缀 png jpg
+        const {data:res} = await getQiniuToken({ T_suffix: strtype});
+        console.log(res);
+        // try {
+            
+        //     console.log(res);
+        //     if (res.Code === 200 && res.Msg === 'ok!') {
+        //         this.token = res.Data;
+        //         return this.token;
+        //     } else {
+        //         console.error('获取七牛云 Token 失败');
+        //     }
+        // } catch (error) {
+        //     console.error('获取 token 发生错误:', error);
+        // }
+    }
+
+    /**
+     * 上传文件到七牛云
+     * @param {File} file 要上传的文件
+     * @returns {Promise<void>}
+     */
+    async uploadFile(file) {
+        const token = await this.getQiniuToken(file);
+        if (!token)return;
+    }
+}

+ 56 - 0
src/views/MovingRing/js/rules.js

@@ -0,0 +1,56 @@
+export const rules = {
+    T_sn: [{
+        required: true,
+        message: '设备编号',
+        trigger: 'change'
+    },],
+    DeviceType: [{
+        required: true,
+        message: '设备类型',
+        trigger: 'change'
+    }],
+    IsExpatriate: [{
+        required: true,
+        message: '是否外派',
+        trigger: 'blur'
+    }],
+    Phone:[
+        { required: true, message: '请输入手机号', trigger: 'change' },
+        { min: 11, message: '请正确输入11位手机号', pattern:/^1[3456789]\d{9}$/, trigger: 'change' }
+    ],
+
+    ChildPid: [{
+        required: true,
+        message: '收货单位',
+        trigger: 'change'
+    }],
+    ShippingUnit: [{
+        required: true,
+        message: '发货单位',
+        trigger: 'change'
+    }],
+
+    T_time: [{
+        required: true,
+        message: '配送计划',
+        trigger: 'change'
+    }],
+}
+
+export const addressRules = {
+    Phone:[
+        { required: true, message: '请输入手机号', trigger: 'change' },
+        { min: 11, message: '请正确输入11位手机号', pattern:/^1[3456789]\d{9}$/, trigger: 'change' }
+    ],
+    T_Address: [{
+        required: true,
+        message: '地址名称',
+        trigger: 'change'  
+    }],
+    T_name: [{
+        required: true,
+        message: '公司名称',
+        trigger: 'change'
+    }],
+
+}

+ 56 - 0
src/views/MovingRing/js/websocketfun.js

@@ -0,0 +1,56 @@
+export let socket
+export function init(data) {
+    if (typeof (WebSocket) === "undefined") {
+        alert("您的浏览器不支持socket")
+    } else {
+        // 实例化socket
+        socket = new WebSocket("wss://cold.coldbaozhida.com/Cold_Monitor_AOIT/WS")
+        // this.socket = new WebSocket("wss://uat.sssyin.cn/ws-reservation")
+        // 监听socket连接
+        console.log('this.socket', socket)
+        socket.onopen = open
+        // 监听socket错误信息
+        socket.onerror = error
+        // 监听socket消息
+        socket.onmessage = getMessage
+        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
+        window.onbeforeunload = () => {
+            socket.onclose = close
+        };
+        return socket
+    }
+}
+function open() {
+    console.log("socket连接成功")
+    send({
+        type:1,
+        sn: '2024048759053117',
+        pass: 'A1Vz5b7aylx64gIP',
+        json: {}
+    })
+}
+
+function error(error) {
+    console.log("连接错误", error)
+}
+
+export function getMessage(msg) {
+    let reslut = JSON.parse(msg.data)
+    console.log('监听msg', reslut)
+    return reslut
+}
+
+// 发送消息给被连接的服务端
+function send(params) {
+    console.log('开始订阅',socket)
+    socket.send(JSON.stringify(params))
+}
+
+/**
+ * 关闭socket
+ */
+export function close() {
+    console.log("socket已经关闭")
+    socket.onclose = close
+    socket.onopen = open
+}

+ 0 - 0
src/views/ToolSystem/modules/MovingModel.vue → src/views/MovingRing/modules/MovingModel.vue


+ 0 - 0
src/views/ToolSystem/modules/MovingRingMonitoringDIR.vue → src/views/MovingRing/modules/MovingRingMonitoringDIR.vue


+ 0 - 0
src/views/ToolSystem/modules/MovingRingNoData.vue → src/views/MovingRing/modules/MovingRingNoData.vue


+ 95 - 0
src/views/MovingRing/modules/newNotices.vue

@@ -0,0 +1,95 @@
+<template>
+    <div class="">
+        <el-drawer :title="titles + '公告'" :visible.sync="drawer" size="70%" :append-to-body="true">
+            <div style="padding: 20px;">
+                <el-form :rules="rules" ref="ruleForm" label-position="top" :model="form" label-width="80px">
+                    <el-form-item label="标题" prop="title">
+                        <el-input v-model="form.title"></el-input>
+                    </el-form-item>
+                    <el-form-item label="通知内容" prop="content">
+                        <el-input type="textarea" :autosize="{ minRows: 12 }" v-model="form.content"></el-input>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" @click="onSubmit('ruleForm')">立即提交</el-button>
+                        <el-button @click="drawer = false">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-drawer>
+    </div>
+</template>
+
+<script>
+
+import { noticeadd,noticeup } from "@/api/notices.js";
+export default {
+    props: {
+        titles: {
+            type: String,
+            default: () => '新增'
+        },
+    },
+    data() {
+        return {
+            drawer: false,
+            form: {
+                title: '',
+                content: '',
+            },
+            rules: {
+                title: [
+                    { required: true, message: '请输入标题名称', trigger: 'change' },
+                    { min: 1, message: '标题长度不能小于1', trigger: 'change' }
+                ],
+                content: [
+                    { required: true, message: '请输入通知内容', trigger: 'change' }
+                ],
+            }
+        }
+    },
+    watch:{
+        drawer(newData){
+            if(newData)if(this.$refs['ruleForm'])this.$refs['ruleForm'].resetFields()
+        }
+    },
+    methods: {
+        showDrawer() {
+            this.drawer = true
+        },
+        onSubmit(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    console.log('submit!',this.titles);
+                    if(this.titles=='新增'){
+                        this.noticeAddApi()
+                    }else{
+                        this.noticeupApi()//编辑
+                    }
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+        },
+        async noticeAddApi(){
+            const result = await noticeadd(this.form)
+            if(result.data.Code==200){
+                this.$message.success(result.data.Msg)
+                this.$emit('closefn')
+                this.drawer = false
+            }
+        },
+        async noticeupApi(){
+            const result = await noticeup(this.form)
+            if(result.data.Code==200){
+                this.$message.success(result.data.Msg)
+                this.$emit('closefn')
+                this.drawer = false
+            }
+        }
+    }
+}
+</script>
+<style lang="scss">
+/* @import url(); 引入css类 */
+</style>

+ 1 - 1
src/views/ToolSystem/Theorder.vue → src/views/Theorder/Theorder.vue

@@ -199,7 +199,7 @@ import {
     getCompany,
     getcompanyTree,
     OrderDel,OrderEdit,AddressList,testApi,CouriersList
-} from '../../api/instrument/Theorder.js'
+} from '@/api/instrument/Theorder.js'
 
 import { getQiniuToken } from "@/api/pdfToken.js";
 import { _sendUpFun } from './js/qiliuyun.js';

+ 0 - 0
src/views/ToolSystem/address.vue → src/views/Theorder/address.vue


+ 0 - 0
src/views/ToolSystem/courier.vue → src/views/Theorder/courier.vue


+ 12 - 0
src/views/Theorder/index.vue

@@ -0,0 +1,12 @@
+<template>
+	<div style="overflow: hidden;">
+		<!-- <router-view></router-view> -->
+		<router-view data-aos="fade-down" data-aos-easing="linear" data-aos-duration="0"></router-view>
+	</div>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 23 - 0
src/views/Theorder/js/goods.js

@@ -0,0 +1,23 @@
+export const goods = "image/*,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+
+/**
+ * 设备类型
+ */
+export const deviceType = [
+    {
+        label: '保温箱',
+        value: '保温箱'
+    },
+    {
+        label: '冷藏车',
+        value: '冷藏车'
+    },
+    {
+        label: '其他',
+        value: '其他'
+    }
+]
+
+
+
+export const deviceStatus = ['正常', '在途', '已到达']

+ 50 - 0
src/views/Theorder/js/initParam.js

@@ -0,0 +1,50 @@
+export const initParam = {
+    t_sn:'',
+    t_orderid: '',
+    startTime: '',
+    endTime: '',
+    page: 1,
+    page_z: 10
+}
+
+/**
+ * 新增或者编辑参数
+ */
+export const ruleForm = {
+    T_orderid: '',//订单号
+    WaybillNo: '',//运单号
+    T_sn: '',//设备编号
+    DeviceType: '',//设备类型
+    IsExpatriate: 1,//是否外派 1 否 2 是
+    Phone: '',//电话
+    T_receiving: '',//收货单位
+    ChildPid: '',//收货单位编号
+    ShippingUnit: '',//发货单位
+    T_time: '',//配送计划,需要切割为开始与结束时间
+    CouriesId:null,//配送员
+    EstimateStartTime: '',//配送计划开始时间
+    EstimateEndTime: '',//配送计划结束时间
+    imgArr: [],//随货同行单本地暂存数组
+    PeerList: [],//随货同行单
+    T_text: '',//详情
+}
+
+
+export const initForm = {
+    page: 1,
+    page_z: 8,
+    T_Address: '',//地址名称
+}
+
+export const ruleForms = {
+    Phone:'',//手机号
+    T_Address:'',//地址
+    T_name: '',//公司名称
+}
+
+//配送员
+export const initFormcou = {
+    page: 1,
+    page_z: 8,
+    T_name: '',//地址名称
+}

+ 42 - 0
src/views/Theorder/js/qiliuyun.js

@@ -0,0 +1,42 @@
+import { getQiniuToken } from "@/api/pdfToken.js";
+import Axios from 'axios';
+
+export class _sendUpFun {
+    constructor() {
+        this.token = null;
+    }
+
+    /**
+     * 获取七牛云 token
+     * @returns {Promise<string|null>} 返回 token 或 null
+     */
+    async getQiniuToken(e) {
+        let file = e.raw;
+        console.log(file);
+        var strtype = file.name.substring(file.name.lastIndexOf('.') + 1); //获取后缀 png jpg
+        const {data:res} = await getQiniuToken({ T_suffix: strtype});
+        console.log(res);
+        // try {
+            
+        //     console.log(res);
+        //     if (res.Code === 200 && res.Msg === 'ok!') {
+        //         this.token = res.Data;
+        //         return this.token;
+        //     } else {
+        //         console.error('获取七牛云 Token 失败');
+        //     }
+        // } catch (error) {
+        //     console.error('获取 token 发生错误:', error);
+        // }
+    }
+
+    /**
+     * 上传文件到七牛云
+     * @param {File} file 要上传的文件
+     * @returns {Promise<void>}
+     */
+    async uploadFile(file) {
+        const token = await this.getQiniuToken(file);
+        if (!token)return;
+    }
+}

+ 56 - 0
src/views/Theorder/js/rules.js

@@ -0,0 +1,56 @@
+export const rules = {
+    T_sn: [{
+        required: true,
+        message: '设备编号',
+        trigger: 'change'
+    },],
+    DeviceType: [{
+        required: true,
+        message: '设备类型',
+        trigger: 'change'
+    }],
+    IsExpatriate: [{
+        required: true,
+        message: '是否外派',
+        trigger: 'blur'
+    }],
+    Phone:[
+        { required: true, message: '请输入手机号', trigger: 'change' },
+        { min: 11, message: '请正确输入11位手机号', pattern:/^1[3456789]\d{9}$/, trigger: 'change' }
+    ],
+
+    ChildPid: [{
+        required: true,
+        message: '收货单位',
+        trigger: 'change'
+    }],
+    ShippingUnit: [{
+        required: true,
+        message: '发货单位',
+        trigger: 'change'
+    }],
+
+    T_time: [{
+        required: true,
+        message: '配送计划',
+        trigger: 'change'
+    }],
+}
+
+export const addressRules = {
+    Phone:[
+        { required: true, message: '请输入手机号', trigger: 'change' },
+        { min: 11, message: '请正确输入11位手机号', pattern:/^1[3456789]\d{9}$/, trigger: 'change' }
+    ],
+    T_Address: [{
+        required: true,
+        message: '地址名称',
+        trigger: 'change'  
+    }],
+    T_name: [{
+        required: true,
+        message: '公司名称',
+        trigger: 'change'
+    }],
+
+}

+ 56 - 0
src/views/Theorder/js/websocketfun.js

@@ -0,0 +1,56 @@
+export let socket
+export function init(data) {
+    if (typeof (WebSocket) === "undefined") {
+        alert("您的浏览器不支持socket")
+    } else {
+        // 实例化socket
+        socket = new WebSocket("wss://cold.coldbaozhida.com/Cold_Monitor_AOIT/WS")
+        // this.socket = new WebSocket("wss://uat.sssyin.cn/ws-reservation")
+        // 监听socket连接
+        console.log('this.socket', socket)
+        socket.onopen = open
+        // 监听socket错误信息
+        socket.onerror = error
+        // 监听socket消息
+        socket.onmessage = getMessage
+        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
+        window.onbeforeunload = () => {
+            socket.onclose = close
+        };
+        return socket
+    }
+}
+function open() {
+    console.log("socket连接成功")
+    send({
+        type:1,
+        sn: '2024048759053117',
+        pass: 'A1Vz5b7aylx64gIP',
+        json: {}
+    })
+}
+
+function error(error) {
+    console.log("连接错误", error)
+}
+
+export function getMessage(msg) {
+    let reslut = JSON.parse(msg.data)
+    console.log('监听msg', reslut)
+    return reslut
+}
+
+// 发送消息给被连接的服务端
+function send(params) {
+    console.log('开始订阅',socket)
+    socket.send(JSON.stringify(params))
+}
+
+/**
+ * 关闭socket
+ */
+export function close() {
+    console.log("socket已经关闭")
+    socket.onclose = close
+    socket.onopen = open
+}

+ 95 - 0
src/views/Theorder/modules/newNotices.vue

@@ -0,0 +1,95 @@
+<template>
+    <div class="">
+        <el-drawer :title="titles + '公告'" :visible.sync="drawer" size="70%" :append-to-body="true">
+            <div style="padding: 20px;">
+                <el-form :rules="rules" ref="ruleForm" label-position="top" :model="form" label-width="80px">
+                    <el-form-item label="标题" prop="title">
+                        <el-input v-model="form.title"></el-input>
+                    </el-form-item>
+                    <el-form-item label="通知内容" prop="content">
+                        <el-input type="textarea" :autosize="{ minRows: 12 }" v-model="form.content"></el-input>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" @click="onSubmit('ruleForm')">立即提交</el-button>
+                        <el-button @click="drawer = false">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-drawer>
+    </div>
+</template>
+
+<script>
+
+import { noticeadd,noticeup } from "@/api/notices.js";
+export default {
+    props: {
+        titles: {
+            type: String,
+            default: () => '新增'
+        },
+    },
+    data() {
+        return {
+            drawer: false,
+            form: {
+                title: '',
+                content: '',
+            },
+            rules: {
+                title: [
+                    { required: true, message: '请输入标题名称', trigger: 'change' },
+                    { min: 1, message: '标题长度不能小于1', trigger: 'change' }
+                ],
+                content: [
+                    { required: true, message: '请输入通知内容', trigger: 'change' }
+                ],
+            }
+        }
+    },
+    watch:{
+        drawer(newData){
+            if(newData)if(this.$refs['ruleForm'])this.$refs['ruleForm'].resetFields()
+        }
+    },
+    methods: {
+        showDrawer() {
+            this.drawer = true
+        },
+        onSubmit(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    console.log('submit!',this.titles);
+                    if(this.titles=='新增'){
+                        this.noticeAddApi()
+                    }else{
+                        this.noticeupApi()//编辑
+                    }
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+        },
+        async noticeAddApi(){
+            const result = await noticeadd(this.form)
+            if(result.data.Code==200){
+                this.$message.success(result.data.Msg)
+                this.$emit('closefn')
+                this.drawer = false
+            }
+        },
+        async noticeupApi(){
+            const result = await noticeup(this.form)
+            if(result.data.Code==200){
+                this.$message.success(result.data.Msg)
+                this.$emit('closefn')
+                this.drawer = false
+            }
+        }
+    }
+}
+</script>
+<style lang="scss">
+/* @import url(); 引入css类 */
+</style>

+ 156 - 0
src/views/Theorder/modules/webscoket.vue

@@ -0,0 +1,156 @@
+<template>
+    <div></div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            // websocket相关
+            socketObj: "", // websocket实例对象
+            //心跳检测
+            heartCheck: {
+                vueThis: this, // vue实例
+                timeout: 10000, // 超时时间
+                timeoutObj: null, // 计时器对象——向后端发送心跳检测
+                serverTimeoutObj: null, // 计时器对象——等待后端心跳检测的回复
+                // 心跳检测重置
+                reset: function () {
+                    clearTimeout(this.timeoutObj);
+                    clearTimeout(this.serverTimeoutObj);
+                    return this;
+                },
+                // 心跳检测启动
+                start: function () {
+                    this.timeoutObj && clearTimeout(this.timeoutObj);
+                    this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
+                    this.timeoutObj = setTimeout(() => {
+                        // 这里向后端发送一个心跳检测,后端收到后,会返回一个心跳回复
+                        this.vueThis.socketObj.send("HeartBeat");
+                        console.log("发送心跳检测");
+                        this.serverTimeoutObj = setTimeout(() => {
+                            // 如果超过一定时间还没重置计时器,说明websocket与后端断开了
+                            console.log("未收到心跳检测回复");
+                            // 关闭WebSocket
+                            this.vueThis.socketObj.close();
+                        }, this.timeout);
+                    }, this.timeout);
+                },
+            },
+            socketReconnectTimer: null, // 计时器对象——重连
+            socketReconnectLock: false, // WebSocket重连的锁
+            socketLeaveFlag: false, // 离开标记(解决 退出登录再登录 时出现的 多次相同推送 问题,出现的本质是多次建立了WebSocket连接)
+        };
+    },
+    created() {
+    },
+    mounted() {
+        // websocket启动
+        this.createWebSocket();
+    },
+    destroyed() {
+        // 离开标记
+        this.socketLeaveFlag = true;
+        // 关闭WebSocket
+        this.socketObj.close();
+        console.log("离开标记", this.socketLeaveFlag);
+
+    },
+    methods: {
+        // websocket启动
+        createWebSocket() {
+            let webSocketLink = "wss://uat.sssyin.cn/ws-reservation"; // webSocket地址
+            // console.log(webSocketLink);
+            try {
+                if ("WebSocket" in window) {
+                    this.socketObj = new WebSocket(webSocketLink);
+                } else if ("MozWebSocket" in window) {
+                    this.socketObj = new MozWebSocket(webSocketLink);
+                }
+                // websocket事件绑定
+                this.socketEventBind();
+            } catch (e) {
+                console.log("catch" + e);
+                // websocket重连
+                this.socketReconnect();
+            }
+        },
+        // websocket事件绑定
+        socketEventBind() {
+            // 连接成功建立的回调
+            this.socketObj.onopen = this.onopenCallback;
+            // 连接发生错误的回调
+            this.socketObj.onerror = this.onerrorCallback;
+            // 连接关闭的回调
+            this.socketObj.onclose = this.oncloseCallback;
+            // 向后端发送数据的回调
+            this.socketObj.onsend = this.onsendCallback;
+            // 接收到消息的回调
+            this.socketObj.onmessage = this.getMessageCallback;
+
+            //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
+            window.onbeforeunload = () => {
+                this.socketObj.close();
+            };
+        },
+        // websocket重连
+        socketReconnect() {
+            if (this.socketReconnectLock) {
+                return;
+            }
+            this.socketReconnectLock = true;
+            this.socketReconnectTimer && clearTimeout(this.socketReconnectTimer);
+            this.socketReconnectTimer = setTimeout(() => {
+                console.log("WebSocket:重连中...");
+                this.socketReconnectLock = false;
+                // websocket启动
+                this.createWebSocket();
+            }, 4000);
+        },
+        // 连接成功建立的回调
+        onopenCallback: function (event) {
+            console.log("WebSocket:已连接");
+            // 心跳检测重置
+            this.heartCheck.reset().start();
+        },
+        // 连接发生错误的回调
+        onerrorCallback: function (event) {
+            console.log("WebSocket:发生错误");
+            // websocket重连
+            this.socketReconnect();
+        },
+        // 连接关闭的回调
+        oncloseCallback: function (event) {
+            console.log("WebSocket:已关闭");
+            // 心跳检测重置
+            this.heartCheck.reset();
+            if (!this.socketLeaveFlag) {
+                // 没有离开——重连
+                // websocket重连
+                this.socketReconnect();
+            }
+        },
+        // 向后端发送数据的回调
+        onsendCallback: function () {
+            console.log("WebSocket:发送信息给后端");
+        },
+        // 接收到消息的回调
+        getMessageCallback: function (msg) {
+            // console.log(msg);
+            console.log(msg.data);
+            if (msg.data.indexOf("HeartBeat") > -1) {
+                // 心跳回复——心跳检测重置
+                // 收到心跳检测回复就说明连接正常
+                console.log("收到心跳检测回复");
+                // 心跳检测重置
+                this.heartCheck.reset().start();
+            } else {
+                // 普通推送——正常处理
+                console.log("收到推送消息");
+                let data = JSON.parse(msg.data);
+                // 相关处理
+                console.log(data);
+            }
+        },
+    },
+};
+</script>

+ 0 - 0
src/views/ToolSystem/preview.vue → src/views/Theorder/preview.vue


+ 2 - 2
src/views/PerfManagement/MyPerf.vue → src/views/ToolSystem/MyPerf.vue

@@ -1,6 +1,6 @@
-<!-- 我的绩效 -->
-<!-- 绩效管理 -->
 <template>
+    <!-- 我的绩效 -->
+<!-- 绩效管理 -->
     <div class="MyPerf">
         <div class="MyPerf-T">
             <div class="callthepoliceL">

+ 1 - 1
src/views/PerfManagement/Perf.vue → src/views/ToolSystem/Perf.vue

@@ -1,5 +1,5 @@
-<!-- 绩效管理 -->
 <template>
+    <!-- 绩效管理 -->
     <div class="Perf">
         <div class="Perf-T">
             <div class="callthepoliceL">

+ 0 - 363
src/views/ToolSystem/modules/MovingModel2.vue

@@ -1,363 +0,0 @@
-<template>
-    <div class="MovingModel">
-        <el-button type="primary" @click="showDrawer">设备管理</el-button>
-        <el-drawer title="设备管理" :visible.sync="drawer" size="90%" :append-to-body="true">
-            <div class="MovingModel_content">
-                <el-button icon="el-icon-plus" style="width: 200px;flex-shrink: 0;"
-                    @click="contextstrFun('添加设备')">添加设备</el-button>
-                <div class="MovingModel_content_item">
-                    <el-tabs v-model="activeName" tab-position="left" type="border-card" style="height: 100%;">
-                        <el-tab-pane :label="item.T_sn" :name="JSON.stringify(index)" v-for="item, index in TabJsonArr" :key="index">
-                            <el-descriptions class="margin-top" title="基本信息" :column="3" border style="margin-bottom: 20px;">
-                                <template slot="extra">
-                                    <el-button type="danger" size="small" @click="delectFun(item)">删除设备</el-button>
-                                </template>
-                                <el-descriptions-item>
-                                    <template slot="label">
-                                        <i class="el-icon-notebook-2"></i>
-                                        设备分类:
-                                    </template>
-                                    <div style="cursor: pointer;" @click="clicktabs('编辑设备',item)">
-                                        {{item.T_tab}}
-                                        <i class="el-icon-edit" style="padding-left: 5px;"></i>
-                                    </div>
-                                </el-descriptions-item>
-                                <el-descriptions-item>
-                                    <template slot="label">
-                                        <i class="el-icon-mobile-phone"></i>
-                                        在线状态
-                                    </template>
-                                    <el-tag size="small" :type="item.T_online!= 1?'danger':''"> {{item.T_online!= 1 ? '离线':'在线'}}</el-tag>
-                                </el-descriptions-item>
-                                <el-descriptions-item>
-                                    <template slot="label">
-                                        <i class="el-icon-time"></i>
-                                        添加时间
-                                    </template>
-                                    {{item.CreateTime}}
-                                </el-descriptions-item>
-                                <el-descriptions-item>
-                                    <template slot="label">
-                                        <i class="el-icon-guide"></i>
-                                        设备编号
-                                    </template>
-                                    <el-tag size="small">
-                                    {{item.T_sn}}
-                                    </el-tag>
-                                </el-descriptions-item>
-                                <el-descriptions-item>
-                                    <template slot="label">
-                                        <i class="el-icon-set-up"></i>
-                                        设备类型
-                                    </template>
-                                    {{item.T_ProductID}}
-                                </el-descriptions-item>
-                            </el-descriptions>
-                            <el-table :data="setTableData(item)" :key="Math.random()" row-key="newId" max-height="600"
-                                border :tree-props="{ children: 'children', children: 'children' }">
-                                <el-table-column prop="T_name" label="属性名称" width="200" :show-overflow-tooltip="true">
-                                </el-table-column>
-                                <el-table-column prop="T_tab" label="属性标识符" width="100" :show-overflow-tooltip="true">
-                                </el-table-column>
-                                <el-table-column label="属性类型" width="150" :show-overflow-tooltip="true">
-                                    <template slot-scope="scope">
-                                        {{
-                                            scope.row.T_type == 1 ? 'number(数值)' :
-                                            scope.row.T_type == 2 ? 'string(字符串)' :
-                                            scope.row.T_type == 3 ? 'string(字符串)' :
-                                            scope.row.T_type == 4 ? 'boolean(布尔值)' :
-                                            scope.row.T_type == 8 ? 'time(时间)' :
-                                            scope.row.T_type == 10 ? 'object(对象)' : ''
-                                        }}
-                                    </template>
-                                </el-table-column>
-                                <el-table-column label="只读状态" width="80" :show-overflow-tooltip="true">
-                                    <template slot-scope="scope">
-                                        {{ scope.row.T_read ? '只读' : '读写' }}
-                                    </template>
-                                </el-table-column>
-                                <el-table-column label="扩展选项" width="200" :show-overflow-tooltip="true">
-                                    <template slot-scope="scope">
-                                        <!-- T_type: 1 数值, 2 字符串  3 枚举 4 布尔  8 时间 10对象 -->
-                                        <div v-if="[1, 2].includes(scope.row.T_type)">
-                                            {{ scope.row.T_attr.dvalue ? '默认值:' + scope.row.T_attr.dvalue : '' }}
-                                            {{ scope.row.T_attr.unit ? '单位:' + scope.row.T_attr.unit : '' }}
-                                            {{ scope.row.T_attr.accuracy ? '精度:' + scope.row.T_attr.accuracy : '' }}
-                                            {{ scope.row.T_attr.min ? '最小值:' + scope.row.T_attr.min : '' }}
-                                            {{ scope.row.T_attr.max ? '最大值:' + scope.row.T_attr.max : '' }}
-                                        </div>
-
-                                        <!-- <div v-if="scope.row.T_type == 3 || scope.row.T_type == 4">{{ JSON.stringify(scope.row.T_attr).slice(1, -1) }}</div> -->
-                                        <div v-if="[3, 4].includes(scope.row.T_type)">{{ JSON.stringify(scope.row.T_attr).slice(1, -1) }}</div>
-                                        <div v-if="scope.row.T_type == 8" style="width: 100%;">
-                                            {{ scope.row.T_attr.dvalue ? '默认值:' + scope.row.T_attr.dvalue : '' }}
-                                        </div>
-                                    </template>
-                                </el-table-column>
-                                <el-table-column label="当前值" :show-overflow-tooltip="true">
-                                    <template slot-scope="scope">
-                                        {{ initDictpresent(item.T_dataJson, scope.row) }}
-                                        <!-- <div v-if="[1,2,3,4,8].includes(scope.row.T_type)">{{ scope.row.newId || filterFun(scope.row.newId) }}</div> -->
-                                    </template>
-                                </el-table-column>
-                                <el-table-column label="操作" fixed="right">
-                                    <template slot-scope="scope">
-                                        <el-button size="mini" @click="handleEdit(item, scope.row)">编辑</el-button>
-                                    </template>
-                                </el-table-column>
-                            </el-table>
-                        </el-tab-pane>
-                    </el-tabs>
-                </div>
-            </div>
-            <el-drawer title="编辑" :append-to-body="true" :visible.sync="innerDrawer">
-                <div style="padding: 20px;">
-                    <el-form ref="form.T_data">
-                        <el-form-item :label="item.label"
-                        v-for="item, index in isFormList" :key="index">
-                            <el-input v-model="item.value" @blur="blurFun(item)"></el-input>
-                            <p style="font-size: 12px;color: red" v-if="blurFun(item)">请输入true或者false</p>
-                        </el-form-item>
-                        <el-form-item>
-                            <el-button type="primary" @click="onSubmit">立即提交</el-button>
-                            <el-button @click="innerDrawer = false">取消</el-button>
-                        </el-form-item>
-                    </el-form>
-                </div>
-            </el-drawer>
-        </el-drawer>
-    </div>
-</template>
-
-<script>
-import {
-    DevicepushFun,DevicedeleteFun
-} from "../js/MovingRingApi.js";
-import { arrMov,steTableDataFn } from "../js/MovingData.js";
-export default {
-    props: {
-        JsonArr: {
-            type: Array,
-            default: () => []
-        }
-    },
-    data() {
-        return {
-            activeName:'0',
-            drawer: false,
-            innerDrawer: false,
-            form: {
-                T_uuid: '0b7a6a23',
-                T_sn: "2024168317603592",
-                T_password: "TpJWG4hr8iNuEdbP",
-                T_data: {}
-            },
-            settab: '',
-            isFormList: [],
-            TabJsonArr: []
-        }
-    },
-    watch: {
-        JsonArr: {
-            handler(newData) {
-                let array = []
-                arrMov.forEach(obj => {
-                    array.push(...obj.key);
-                });
-                let arr = [...newData]
-                // for (let i = 0; i < arr.length; i++) {
-                //     for (let j = 0; j < arr[i].JsonArray.length; j++) {
-                //         let tableJson = arr[i].JsonArray[j].T_ProductJson.T_TabDataJson
-                //         for (let g = 0; g < tableJson.length; g++) {
-                //             if (!array.includes(tableJson[g].T_tab)) {
-                //                 arr[i].JsonArray[j].T_ProductJson.T_TabDataJson.splice(g, 1)
-                //             }
-                //         }
-                //     }
-                // }
-                // let reslut = arr.map(obj => obj.JsonArray);  
-                console.log('789',arr) 
-
-                let reslut = arr.map(item => { 
-                    console.log('123',item) 
-                    return item.arrs.map(subItem => {  
-                        // 合并 T_sn 到每个子对象  
-                        return { ...subItem, T_tab: item.T_tab };  
-                    });  
-                }).flat(); // 如果环境支持 flat 方法
-
-
-                this.activeName = '0'
-                this.TabJsonArr = reslut
-                console.log('数据变化1', reslut)
-            }, deep: true
-        }
-    },
-    methods: {
-        setTableData(data){
-            return steTableDataFn(data)
-        },
-        blurFun(data){
-            console.log('121',data.types,data)
-            if(data.types==4 && !['true','false'].includes(data.value)){
-                return true
-            }
-        },
-        delectFun(event){
-            console.log('删除',event)
-            let self = this
-            DevicedeleteFun({T_sn:event.T_sn}).then(res=>{
-                if(res.Code==200){
-                    self.$emit('confirm')
-                }
-            })
-        },
-        clicktabs(titles,item){
-            console.log('点击',item)
-            this.$emit('editstr',titles,item)
-        },
-        contextstrFun() {
-            this.$emit('addstr', '添加设备')
-        },
-        showDrawer() {
-            this.drawer = true
-            this.activeName = '0'
-
-        },
-        returnBoolean(value){  
-            if(value=="true"){
-                return Boolean(true)
-            }else{
-                return Boolean(false)
-            }
-        },
-        /***
-         * 提交
-         */
-        onSubmit() {
-            const rules = this.isFormList.filter(item => item.types==4)
-            let values = rules.map(rule => rule.value); 
-            const b = values.every(item => item=='true' || item=='false')
-           if(!b){
-                this.$message.error('请检查是否存在输入了错误参数')
-                return
-           }else{
-                var arrData = [...this.isFormList]
-                let obj = {...this.form}
-                for (let j = 0; j < arrData.length; j++) {
-                    // let isData = arrData[j].types==4? this.returnBoolean(arrData[j].value): arrData[j].value
-                    let isData =arrData[j].value=='true' || arrData[j].value=='false'? this.returnBoolean(arrData[j].value): arrData[j].value
-
-                    this.$set(obj.T_data[this.settab], arrData[j].label, isData)
-                }
-                console.log('单个1',obj.T_data)
-
-                obj.T_data = JSON.stringify(obj.T_data)
-                // console.log('单个2',obj.T_data)
-                DevicepushFun(obj).then(res => {
-                    if (res.Code == 200) {
-                        this.innerDrawer = false
-                        this.$message.success('编辑成功')
-                        this.$emit('confirm')
-                    }
-                })
-           }
-        },
-        handleEdit(keyis, obj) {
-            let self = this
-            this.innerDrawer = true
-            this.form.T_uuid = keyis.T_ProductJson.T_uuid
-            this.form.T_sn = keyis.T_sn
-            this.form.T_password = keyis.T_password
-            this.form.T_data = {}
-            let isSplit = obj.newId.split('.')
-            if (isSplit.length == 1) {
-                self.settab = isSplit[0].slice(0, isSplit[0].length - 1)
-            } else {
-                self.settab = isSplit[0]
-            }
-
-            this.isFormList = []
-            let array = [...obj.children]
-            let findArr = [...keyis.T_dataJson]
-            this.$set(this.form.T_data, self.settab, {})
-            if (obj.T_type == 10) {
-                array.forEach(el => {
-                    console.log('type',el)
-                    let swi = el.newId.split('.')
-                    for (let i = 0; i < findArr.length; i++) {
-                        if (findArr[i].keys == swi[0]) {
-                            let iftype = typeof (findArr[i][swi[1]])
-                            console.log('==============type',el)
-                            self.isFormList.push({ 
-                                label: el.T_tab, 
-                                value: iftype == 'boolean' ? JSON.stringify(findArr[i][swi[1]]) : findArr[i][swi[1]],
-                                types: el.T_type
-                            })
-                            break;
-                        }
-                    }
-                });
-
-            } else {
-                for (let j = 0; j < findArr.length; j++) {
-                    if (isSplit[0] == findArr[j].keys) {
-                        let iftype = typeof (findArr[j][isSplit[1]])
-                        self.isFormList.push({ 
-                            label: isSplit[1], 
-                            value: iftype == 'boolean' ? JSON.stringify(findArr[j][isSplit[1]]) : findArr[j][isSplit[1]],
-                            types: obj.T_type
-                        })
-                        break;
-                    }
-                }
-            }
-
-            console.log('编辑', this.isFormList, this.form)
-        },
-        initDictpresent(arr, str) {
-            let isSplit = str.newId.split('.')
-            let is_tab;
-            if (isSplit.length == 1) {
-                is_tab = isSplit[0].slice(0, isSplit[0].length - 1)
-                return ''
-            } else {
-                is_tab = isSplit
-                const b = arr.find(item => item.keys == isSplit[0])
-                if(b){
-                    return b[isSplit[1]]
-                }else{
-                    return []
-                }
-            }
-        },
-    }
-}
-</script>
-<style lang="scss" scoped>
-::v-deep .el-tabs--border-card {
-    background: #FFF;
-    border: 1px solid #DCDFE6;
-    box-shadow: 0 0 0 0 #fff;
-}
-::v-deep .el-table__header {  
-  background-color: #f0f0f0 !important;  
-} 
-</style>
-<style lang="scss">
-.MovingModel {
-    &_content {
-        padding: 0 20px;
-        height: 100%;
-        overflow: hidden;
-        display: flex;
-        flex-direction: column;
-
-        &_item {
-            padding: 20px 0;
-            flex: 1;
-            overflow-y: auto;
-        }
-    }
-}
-</style>

+ 1 - 2
src/views/companyManagement/Company.vue

@@ -500,7 +500,6 @@ export default {
         async Gohome(e) {
             var res = await this.GetCompanyEntryApi(e)
             if (res.data.Code === 200) {
-                console.log('跳转', e, res)
                 // this.isintelligent
                 // return
                 this.$store.dispatch('SETNAV', [])
@@ -509,7 +508,7 @@ export default {
                     T_name: e.T_name,
                     bl: true
                 }) //缓存到vuex
-                this.$router.replace('/index')
+                this.$router.push('/index')
             }
         },
         GetCompanyEntryApi(e) {

+ 568 - 0
src/views/equipmentManagement/abandonDeviceCallthepolice.vue

@@ -0,0 +1,568 @@
+<!-- abandonDeviceCallthepolice设备报警 -->
+<template>
+	<div class="callthepolice">
+		<div class="callthepolice-T">
+			<div class="callthepoliceL">
+				<Breadcrumb></Breadcrumb>
+				<div class="RightsManagement-searchs">
+					<div class="RightsManagement-searchs1">
+						<el-date-picker v-model="TimeData" type="datetimerange" @change="TimeChang" range-separator="至"
+							style="width: 360px;"
+							:picker-options="pickerOptions1"
+							:clearable="false"
+							value-format="yyyy-MM-dd HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期">
+						</el-date-picker>
+						<el-select v-model="pages.T_handle" @change="selectChang" style="margin: 0 20px;width: 100px;" placeholder="请选择查询条件">
+							<el-option label="默认" value="1"></el-option>
+							<el-option label="全部记录" value="2"></el-option>
+							<el-option label="未处理" value="3"></el-option>
+						</el-select>
+					</div>
+					<div class="callthepoliceit-mai1-btn">
+						<el-button type="primary" icon="el-icon-search" @click="showhistory">更多查询</el-button>
+					</div>
+				</div>
+			</div>
+			<div class="callthepoliceR">
+				<div class="RightsManagement-searchsMai">
+					<el-button v-permission="'AbandonDevice:Warning:Excel'" type="warning"
+						@click="DowDataExcel">导出Excel</el-button>
+					<!-- <el-button type="danger" icon="el-icon-plus" @click="clickNew()">新增</el-button> -->
+				</div>
+			</div>
+		</div>
+		<div class="callthepolice-B">
+			<el-table ref="multipleTable" v-loading="loading" :data="tableData" border size="mini"
+				:row-class-name="tableRowClassName" @selection-change="handleSelectionChange">
+				<template slot="empty">
+					<noData></noData>
+				</template>
+				<el-table-column type="selection" width="55">
+				</el-table-column>
+				<el-table-column label="类型" width="120">
+					<template slot-scope="scope" show-overflow-tooltip>{{ scope.row.T_tp_name }}</template>
+				</el-table-column>
+				<el-table-column prop="T_sn" label="SN" width="150" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column prop="T_DS_name" label="名称" width="150" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column prop="T_Remark" label="内容" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column prop="T_Text" label="处理措施" width="100" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column prop="T_Ut" label="时间" width="150" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column label="操作" width="250" fixed="right">
+					<template slot-scope="scope">
+						<el-button v-permission="'AbandonDevice:Warning:Handle'" size="small"
+							@click="SetChuli(scope.row)">处理</el-button>
+						<el-button v-permission="'AbandonDevice:Warning:Del'" size="small"
+							@click="SetDel(scope.row)">删除</el-button>
+						<el-button v-permission="'AbandonDevice:Warning:Record'" size="small"
+							@click="Setjilu(scope.row)">记录</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-button v-permission="'AbandonDevice:Warning:DatchHandle'" @click="ResDateFilter"
+				style="margin-top: 10px;">批量处理</el-button>
+			<div style="margin-top: 50px;">
+				<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
+					:current-page="pages.page" :page-size="pages.page_z" :page-sizes="[10, 50, 100, 500, 1000]"
+					layout="total, sizes, prev, pager, next, jumper" :total="total">
+				</el-pagination>
+			</div>
+		</div>
+		<el-drawer title="更多查询" :visible.sync="drawer" direction="rtl" size="50%" :append-to-body="true">
+			<div style="padding:0 20px;">
+				<el-form ref="form" :model="pages" label-width="80px">
+					<!-- <el-form-item label="查询条件">
+						<el-select v-model="pages.T_history" @change="selectChang" placeholder="请选择查询条件">
+							<el-option label="最近40天" value="0"></el-option>
+							<el-option label="历史记录" value="1"></el-option>
+						</el-select>
+					</el-form-item> -->
+					<!-- <el-form-item :label="pages.T_history == 0 ? '最近40天' : '历史记录'">
+						<el-date-picker v-model="TimeData" type="datetimerange" @change="TimeChang" range-separator="至"
+							:picker-options="pages.T_history == 0 ? pickerOptions : pickerOptions1"
+							value-format="yyyy-MM-dd HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期">
+						</el-date-picker>
+					</el-form-item> -->
+					<el-form-item label="名称查询">
+						<inputs @inputs="inputValue" :inputShow="true" inputPlace="请输入名称"></inputs>
+					</el-form-item>
+					<el-form-item label="报警分类">
+						<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
+							@change="handleCheckAllChange">全选</el-checkbox>
+						<el-checkbox-group v-model="pages.T_tp" @change="handleCheckedCitiesChange">
+							<el-checkbox v-for="item, index in dataPowerAll" :label="item.Id" :key="index">{{ item.T_name }}
+							</el-checkbox>
+						</el-checkbox-group>
+					</el-form-item>
+					<!-- <el-form-item label="状态查询">
+						<el-radio-group v-model="pages.T_handle">
+							<el-radio label="1">默认</el-radio>
+							<el-radio label="2">全部记录</el-radio>
+							<el-radio label="3">未处理</el-radio>
+						</el-radio-group>
+					</el-form-item> -->
+					<el-form-item>
+						<el-button type="primary" @click="onSubmit">立即搜索</el-button>
+						<el-button @click="drawer = false">取消</el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+		</el-drawer>
+		<el-drawer title="处理记录" :visible.sync="drawerJiLu" direction="rtl" size="50%" :append-to-body="true">
+			<div style="padding:0 20px;">
+				<el-table ref="singleTable" :data="tableData1" highlight-current-row style="width: 100%">
+					<template slot="empty">
+						<noData></noData>
+					</template>
+					<el-table-column type="index" width="50" label="序号">
+					</el-table-column>
+					<el-table-column label="详细信息">
+						<template slot-scope="scope">
+							{{ scope.row }}
+						</template>
+					</el-table-column>
+				</el-table>
+			</div>
+		</el-drawer>
+		<el-dialog title="提示" :visible.sync="dialogChuli" width="30%" :append-to-body="true">
+			<el-form ref="chuliPage" :model="chuliPage" label-width="100px" label-position="top">
+				<el-form-item label="处理报警备注">
+					<el-input v-model="chuliPage.T_Text"></el-input>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" size="mini" @click="chuliPage.T_Text = '已处理'">已处理</el-button>
+					<el-button type="primary" size="mini" @click="chuliPage.T_Text = '天气原因'">天气原因</el-button>
+					<el-button type="primary" size="mini" @click="chuliPage.T_Text = '测试'">测试</el-button>
+				</el-form-item>
+			</el-form>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="dialogChuli = false">取 消</el-button>
+				<el-button type="primary" @click='onSubmitFun'>确 定</el-button>
+			</span>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+import {
+	WarningList,
+	WTall,
+	DevicEdit,
+	DevicDel,
+	DevicExcel
+} from "@/api/Warning.js"
+import Axios from 'axios'
+import fileDownload from 'js-file-download';
+import { formatDate } from '../../utils/Times.js'
+export default {
+	data() {
+		return {
+			showChu:'',
+			chuliPage:{
+				T_id: '',
+				T_Text: '',
+				T_time:'',
+				T_history:''
+			},
+			dialogChuli:false,
+			checkAll: true,
+			isIndeterminate: false,
+			Excelobj: {},
+			loading: true,
+			TimeData: [],
+			dataPowerAll: [], //报警选择
+			pages: {
+				T_name: '',
+				T_tp: [],
+				T_handle: '1', //1 默认 2 全部记录 3未处理
+				Time_start: '',
+				Time_end: '',
+				T_admin: 0,
+				T_history: '0', //0 40天 1 历史数据
+				page: 1,
+				page_z: 10,
+                T_abandon:1
+			},
+			total: 0,
+			pages1: {//表格数据
+				T_snid: '',
+				Time_start: '',
+				Time_end: '',
+				page: 1,
+				page_z: 10,
+			},
+			pickerOptions1: {//选择当前时间的前后6个月
+				onPick: ({
+					maxDate,
+					minDate
+				}) => {
+					this.beginDate = minDate && minDate.getTime();
+					if (maxDate) {
+						this.endDate = "";
+					}
+				},
+				disabledDate: (time) => {
+				const minTime = new Date(this.beginDate).setMonth(
+					new Date(this.beginDate).getMonth() - 6
+				);
+				const maxTime = new Date(this.beginDate).setMonth(
+					new Date(this.beginDate).getMonth() + 6
+				);
+				return this.beginDate
+					? time.getTime() < minTime || time.getTime() > maxTime
+					: false;
+				},
+			},
+			// pickerOptions1: {
+			// 	onPick: ({
+			// 		maxDate,
+			// 		minDate
+			// 	}) => {
+			// 		this.pickerMinDate = minDate.getTime()
+			// 		if (maxDate) {
+			// 			this.pickerMinDate = ''
+			// 		}
+			// 	},
+			// 	disabledDate: (time) => {
+			// 		if (this.pickerMinDate !== '') {
+			// 			if (this.pickerMinDate !== undefined) { //不为und时证明选择,则显示为可选择
+			// 				var y = new Date(this.pickerMinDate).getFullYear()
+			// 				var m = new Date(this.pickerMinDate).getMonth() + 1
+			// 				var d = new Date(y, m, 0).getDate(); //获取当前选中月最后一日
+			// 				var minTm = new Date(y + '-' + m + '-01 00:00:00').getTime() //可选的最小范围
+			// 				var maxTm = new Date(y + '-' + m + '-' + d + ' 00:00:00').getTime() //可选的最大范围
+			// 				return time.getTime() < minTm || time.getTime() > maxTm
+			// 			} else { //为und时证明没有选择,则显示为可选择
+			// 				const one = 30 * 24 * 3600 * 1000
+			// 				const minTime = this.pickerMinDate - one
+			// 				const maxTime = this.pickerMinDate + one
+			// 				return time.getTime() < minTime || time.getTime() > maxTime
+			// 			}
+			// 		}
+			// 	}
+			// },
+			pickerOptions: {
+				disabledDate(time) {
+					let AtTime = new Date().getTime(); //获取此时的时间戳
+					return (
+						time.getTime() < AtTime - (86400000 * 40) //小于当前时间40天的全部disabled掉
+						||
+						time.getTime() > AtTime //大于当前时间的全部disabled掉
+					);
+				}
+			},
+			drawer: false,
+			drawerJiLu: false, //记录弹窗
+			tableData: [],
+			tableData1: [],
+			multipleSelection: [],
+			dialogVisible: false,
+		}
+	},
+	mounted() {
+		this.pages = {...this.pages,...this.$route.query}
+		console.log(this.pages)
+		this.setTimefn()
+		this.getWarningListApi()
+	},
+	methods: {
+		setTimefn() { //获取当天0点与当前时间 
+			const now = new Date();  
+			const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0); 
+			const min = midnight.getTime() - (86400000*40)//今天0点时间戳,
+			const max = now.getTime(); //当前时间戳
+			this.pages.Time_start = formatDate(min)
+			this.pages.Time_end = formatDate(max)
+			this.TimeData = [formatDate(min),formatDate(max)]
+			this.$emit("pick", this.TimeData)
+		}, 
+		showhistory() {
+			this.drawer = true
+			this.SetWarning()
+		},
+		handleCheckAllChange(e) {
+			e ? this.dataPowerAll.forEach(item => { this.pages.T_tp.push(item.Id) }) : this.pages.T_tp = []
+			this.isIndeterminate = false;//全选状态
+		},
+		handleCheckedCitiesChange(value) {
+			////console.log('danxuan', value)
+			let checkedCount = value.length;
+			this.checkAll = checkedCount === this.dataPowerAll.length;
+			this.isIndeterminate = checkedCount > 0 && checkedCount < this.dataPowerAll.length;
+		},
+		DowDataExcel() {
+			if (this.tableData == null) {
+				this.$message.error('当前导出没有数据哦!')
+				return
+			} else {
+				const loading = this.$loading({
+					lock: true,
+					text: '正在整理数据,请稍后...',
+					spinner: 'el-icon-loading',
+					background: 'rgba(0, 0, 0, 0.7)'
+				});
+				DevicExcel(this.Excelobj).then(res => {
+					////console.log('导出exc', res)
+					loading.close()
+					Axios({
+						method: 'get',
+						url: res.data.Data,
+						responseType: 'blob'
+					}).then(resBlob => {
+						fileDownload(resBlob.data, `${new Date().getTime()}.xlsx`);
+					});
+				})
+			}
+		},
+		tableRowClassName({ row, rowIndex }) {
+			////console.log('表格', row, rowIndex)
+			if (row.T_State === 3) {
+				return 'warning-row';
+			} else {
+				return '';
+			}
+
+		},
+		async SetWarning() {
+			var pwAll = await this.GetWTallApi()
+			if (pwAll.data.Code === 200) {
+				this.checkAll = true;//全选状态
+				this.isIndeterminate = false
+				var arr = pwAll.data.Data
+				this.pages.T_tp = []
+				this.dataPowerAll = arr
+				arr.forEach(item => {
+					this.pages.T_tp.push(item.Id)
+				})
+				////console.log('48888', this.checkAll)
+			}
+		},
+		GetWTallApi() { //获取报警权限
+			return new Promise(resolve => {
+				WTall({}).then(res => {
+					resolve(res)
+				})
+			})
+		},
+		getWarningListApi() {
+			this.loading = true
+			var obj = { ...this.pages }
+			console.log('obj',obj)
+			obj.T_tp.length != 0 ? obj.T_tp = "T" + obj.T_tp.join('|T') + "|" : obj.T_tp = ''
+			this.Excelobj = obj
+			return new Promise(resolve => {
+				WarningList(obj).then(res => {
+					if (res.data.Code === 200) {
+						this.loading = false
+						this.total = res.data.Data.Num
+						this.tableData = res.data.Data.Data
+						resolve(res.data)
+					}
+				})
+			})
+		},
+
+		Setjilu(e) { //记录
+			////console.log(e)
+			this.tableData1 = e.T_Log
+			this.drawerJiLu = true
+		},
+		SetDel(obj) { //删除
+			////console.log('删除', obj)
+			this.$confirm('此操作将执行删除, 是否继续?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning',
+				center: true
+			}).then(() => {
+				DevicDel({
+					T_id: obj.Id,
+					T_time: obj.T_Ut,
+					T_history: obj.T_history
+				}).then(res => {
+					if (res.data.Code === 200) {
+						this.getWarningListApi()
+						this.$message.success('操作成功,已删除')
+					}
+				})
+			}).catch(() => {
+				this.$message({
+					type: 'info',
+					message: '已取消删除'
+				});
+			});
+		},
+		SetChuli(e) { //处理按钮
+			this.chuliPage = {
+				T_id: e.Id,
+				T_Text: '',
+				T_time: e.T_Ut,
+				T_history: e.T_history
+			}
+			this.showChu = 'rad'
+			this.dialogChuli = true
+		},
+		onSubmitFun(){
+			if (this.showChu=='all') {
+				this.asyncPro()
+			} else {
+				this.subChuli()
+			}
+		},
+		async subChuli(){
+			
+			var val = await this.setDevicEditApi(this.chuliPage)
+			if (val.data.Code == 200) {
+				this.pages.page = 1
+				this.getWarningListApi()
+				this.$message.success('处理成功');
+				this.dialogChuli = false
+				this.chuliPage.T_Text = ''
+			}
+		},
+		ResDateFilter() { //批量处理
+			if (this.multipleSelection.length == 0) {
+				this.$message.error('请选择至少一项')
+			} else {
+				this.showChu = 'all'
+				this.dialogChuli = true
+			}
+
+		},
+		async asyncPro() {
+			var obj = {
+				T_id: null,
+				T_Text: this.chuliPage.T_Text,
+			}
+			
+			var k = 0
+			for (let i = 0; i < this.multipleSelection.length; i++) {
+				obj.T_id = this.multipleSelection[i].Id
+				// if(this.pages.T_history==1){
+				// 	obj.T_time = this.multipleSelection[i].T_Ut
+				// 	obj.T_history = this.pages.T_history
+				// }
+                obj.T_time = this.multipleSelection[i].T_Ut
+                obj.T_history = this.pages.T_history
+				let objs = await this.setDevicEditApi(obj);
+				if (objs) {
+					k = k + 1 
+				}
+				if (this.multipleSelection.length == k) {
+					this.$message.success('批量处理完成')
+					this.pages.page = 1
+					this.getWarningListApi()
+					this.dialogChuli = false
+					this.chuliPage.T_Text = ''
+				}
+			}
+		},
+		setDevicEditApi(obj) {
+			return new Promise(resolve => {
+				DevicEdit(obj).then(res => {
+					resolve(res)
+				})
+			})
+		},
+		selectChang() { //切换查询条件select
+			this.getWarningListApi()
+		},
+		TimeChang(e) { //选择完时间确定按钮
+			if(e){
+				this.pages.Time_start = e[0]
+				this.pages.Time_end = e[1]
+			}else{
+				this.setTimefn()
+			}
+			this.getWarningListApi()
+		},
+		onSubmit() { //搜索按钮
+			this.pages.page = 1
+			this.getWarningListApi()
+			this.drawer = false
+		},
+		handleSizeChange(e) { //每页多少条
+			////console.log('每页多少条', e)
+			this.pages.page_z = e
+			this.getWarningListApi()
+		},
+		handleCurrentChange(e) { //跳转页
+			////console.log('跳转页', e)
+			this.pages.page = e
+			this.getWarningListApi()
+		},
+
+
+		// toggleSelection(rows) {
+		// 	if (rows) {
+		// 		rows.forEach(row => {
+		// 			this.$refs.multipleTable.toggleRowSelection(row);
+		// 		});
+		// 	} else {
+		// 		this.$refs.multipleTable.clearSelection();
+		// 	}
+		// },
+		handleSelectionChange(val) {
+			this.multipleSelection = val;
+		},
+		inputValue(e) {
+			this.pages.T_name = e
+			this.pages.page = 1
+			this.getWarningListApi()
+		},
+	}
+}
+</script>
+<style lang="scss">
+.el-table .warning-row {
+	background: oldlace;
+}
+
+.callthepolice {
+	.callthepolice-T {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		background: rgba(#fff, 1);
+		height: 70px;
+		padding: 15px 10px;
+		box-shadow: 5px 5px 10px -10px #000;
+
+		.callthepoliceL {
+			display: flex;
+			align-items: center;
+
+			.RightsManagement-searchs {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				margin-left: 20px;
+
+				.callthepoliceit-mai1-btn {}
+
+				.RightsManagement-searchs1 {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+			}
+		}
+
+		.RightsManagement-searchsMai {
+			display: flex;
+			align-items: center;
+			cursor: pointer;
+		}
+	}
+
+	.callthepolice-B {
+		background: rgba(#fff, 1);
+		margin: 10px;
+		padding: 20px 30px;
+	}
+}
+</style>

+ 600 - 0
src/views/equipmentManagement/abandonDeviceChartShow.vue

@@ -0,0 +1,600 @@
+<!-- abandonDeviceChartShow图表展示 -->
+<template>
+	<div class="chartShow">
+		<div class="chartShow-T">
+			<div class="chartShow-TL">
+				<Breadcrumb class="bre"></Breadcrumb>
+				<div class="chartShow-searchs">
+					<inputs @inputs="inputserValue" @selects="selectsValue" :inputShow="true" :selectShow='true'
+						inputPlace0="请输入名称" inputPlace="请输入SN/设备名称" :options="options"></inputs>
+					<div class="chartShow-tit-mai1-btn">
+						<el-date-picker v-model="TimeValue" type="datetimerange" range-separator="至" :clearable="false"
+							start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="pickerOptions"
+							@change="Timechange">
+						</el-date-picker>
+
+						<!-- <el-button type="danger" icon="el-icon-search">查询</el-button> -->
+					</div>
+				</div> 
+			</div>
+			<div class="chartShow-TR">
+				<div class="chartShow-searchsMai">
+					<el-button type="primary" size="small" @click="canvasIt">截图</el-button>
+					<el-button type="primary" size="small" v-permission="'AbandonDeviceChartShow:PDF'" @click="downloadPDF">下载PDF</el-button> <!-- v-permission="'chartShow:PDF'" -->
+
+					<el-button type="primary" size="small" @click="showHighchart_h = !showHighchart_h">{{showHighchart_h?'隐藏':'显示'}}湿度</el-button>
+				</div>
+			</div>
+		</div>
+		<div class="chartShow-B">
+			<div class="chartShow-B-nav">
+				<div class="chartShow-B-nav1">
+					<div class="chartShow-B-nav1-L">
+						<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">
+							全选</el-checkbox>
+						<div class="chartShow-B-nav1-L1" @click="theChange">反选</div>
+					</div>
+					<div class="chartShow-B-nav1-R">
+					</div>
+				</div>
+				<div class="chartShow-B-nav2">
+					<div class="chartShow-B-nav2-mai">
+						<el-checkbox-group v-model="checkedCities">
+							<el-checkbox v-for="(item,index) in cities" :label="item" :key="index" @change="handleCheckedCitiesChange(item,$event)">
+								<div class="chartShow-B-nav2-t">
+									<div class="chartShow-B-nav2-tName" :title="item.T_name">
+										{{item.T_name}}
+									</div>
+									<div class="chartShow-B-nav2-tSn">
+										{{item.T_sn}}[{{item.T_id}}]
+									</div>
+								</div>
+							</el-checkbox>
+						</el-checkbox-group>
+					</div>
+				</div>
+				<div class="chartShow-B-nav3">
+					<div>
+						总量:{{total}}
+					</div>
+					<div style="text-align: center;">页码:{{pages.page}}/{{Page_size}}</div>
+				</div>
+			</div>
+			<div class="chartShow-B-table">
+				<div class="chartShow-B-table2-mai" ref="imageTofile">  <!--  v-show="optionsData.length!=0" -->
+					<div style="color: #000;font-size: 20px;text-align: center;margin-top: 10px;">{{ showFirm }}</div>
+					<div class="chartShow-B-table1">
+						{{pages1.Time_start}}
+						<div style="padding: 0 10px;">~</div>
+						{{pages1.Time_end}}
+					</div>
+					<div class="chartShow-B-table2" :style="{height:!showHighchart_h?'75vh':'500px'}" style="position: relative;">
+						<highchartspirT :option="optionsData" ref="childMethod1" :stale="stale"></highchartspirT>
+						<div v-if="ifHtmlCanvas" style="height:60px;background: #fff;position: absolute;bottom: 30px;width: 98%;z-index: 9999999 !important;"></div>
+					</div>					
+					<div class="chartShow-B-table2" style="position: relative;">
+						<!-- :style="{opacity:showHighchart_h?1:0}" -->
+						<highchartspirH :option="optionsData" ref="childMethod2" :stale="stale" :style="{height:showHighchart_h?'500px':'0'}"></highchartspirH>
+						<div v-if="ifHtmlCanvas" style="height:60px;background: #fff;position: absolute;bottom: 30px;width: 98%;z-index: 9999999 !important;"></div>
+					</div>
+				</div>
+				<!--  -->
+				<!-- <div class="chartShow-B-table2-mai" v-show="optionsData.length==0"
+					style="color: #DCDFE6;font-size: 20px;min-height: 500px;display: flex;align-items: center;justify-content: center;">
+					暂无可展示数据,更换其他设备或时间段再试试
+				</div> -->
+			</div>
+		</div>
+		<el-dialog title="下载PDF" :append-to-body="true" :visible.sync="dialogVisible" width="30%">
+			<el-form ref="form" :model="form" label-width="80px">
+				<el-form-item label="发货单位">
+					<el-input v-model="form.T_forwarding_unit" maxlength="34" show-word-limit></el-input>
+				</el-form-item>
+				<el-form-item label="收货单位">
+					<el-input v-model="form.T_consignee_unit" maxlength="34" show-word-limit></el-input>
+				</el-form-item>
+				<el-form-item label="下载模板">
+					<el-radio-group v-model="form.T_template">
+						<el-radio label="0">仓库</el-radio>
+						<el-radio label="1">车/箱</el-radio>
+					</el-radio-group>
+				</el-form-item>
+				<el-form-item label="备注">
+					<el-input v-model="form.T_remark" type="textarea" :autosize="{ minRows: 5,maxRows:9}" maxlength="16" show-word-limit></el-input>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="onSubmit">立即下载</el-button>
+					<el-button @click="dialogVisible=false">取消</el-button>
+				</el-form-item>
+			</el-form>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import html2canvas from "html2canvas";
+	import {
+		DevSenList,
+		DataList,
+		ClassList,
+		DataChartPdf
+	} from '../../api/dataDisplay/chartShow.js'
+	import {
+		formatDate
+	} from '../../utils/Times.js'
+	
+	import {allCancelFun} from "@/plugins/calculateData"
+	import Axios from 'axios'
+	import { async } from "q";
+	export default {
+		data() {
+			return {
+				ifHtmlCanvas:false,
+				showFirm:'',
+				form:{
+					T_forwarding_unit:'',
+					T_consignee_unit:'',
+					T_template:'0',
+					T_remark:'',
+				},
+				dialogVisible:false,
+				showHighchart_h:false,
+				condition:3,
+				b:1,
+				stale:false,//全取消
+				total:0,
+				Page_size: 0,
+				optionsTh:{},
+				optionsData:{
+					sn:null,
+					id:null,
+					data:[]
+				},//数据包
+				options: [],
+				chartOptions: {},
+				TimeValue: [
+					// '2023-04-20 00:00:00', '2023-04-21 00:20:00'
+					new Date(new Date().toLocaleDateString()).getTime(), new Date()
+				],
+				pages: {
+					T_name: '',
+					T_calssid: '',
+					page: 1,
+					page_z: 20,
+                    T_abandon:1
+				},
+				pages1: { //表格数据
+					T_snid: '',
+					Time_start: '',
+					Time_end: '',
+					page: 1,
+					page_z: 99999,
+				},
+				checkAll: false,
+				checkedCities: [], //已经选择的
+				cities: [],
+				isIndeterminate: false,
+				dialogVisible: false,
+				loading:null,
+				pickerOptions: {
+					shortcuts: [{
+						text: '今天',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().toLocaleDateString()).getTime());
+							picker.$emit('pick', [start, end]);
+						}
+					}, {
+						text: '近3天',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 2);
+							picker.$emit('pick', [start, end]);
+						}
+					}, {
+						text: '近5天',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 4);
+							picker.$emit('pick', [start, end]);
+						}
+					}, {
+						text: '近7天',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 6);
+							picker.$emit('pick', [start, end]);
+						}
+					}]
+				},
+			}
+		},
+		computed: {
+			searchso() {
+				return this.$store.state.searchs
+			}
+		},
+		mounted() {
+			
+			this.GetClassListApi()
+			this.GetDevSenListApi()
+			this.$nextTick(()=>{
+				let scrollTargetBox = document.querySelector('.chartShow-B-nav2')
+				scrollTargetBox.onscroll =()=>{
+					if(this.cities.length==0) return
+					var scrollHeight = scrollTargetBox.scrollHeight;//251
+                    var scrollTop = Math.ceil(scrollTargetBox.scrollTop);//0-18
+                    var clientHeight = scrollTargetBox.clientHeight;//233
+					////console.log('触发',scrollHeight ,clientHeight,this.pages.page , this.Page_size,scrollTop,scrollHeight - clientHeight == scrollTop)
+					if(scrollHeight - clientHeight == scrollTop){
+						if (this.pages.page >= this.Page_size) return
+						this.pages.page = this.pages.page+1
+						this.GetDevSenListApi()
+					}
+				}
+				
+			})
+			this.showFirm = this.$store.state.showFirm.T_name
+		},
+		methods: {
+			onSubmit(){
+				this.ifHtmlCanvas = true
+				this.loading = this.$loading({
+					lock: true,
+					text: '请稍后...',
+					spinner: 'el-icon-loading',
+					background: 'rgba(0, 0, 0, 0.7)'
+				});
+				setTimeout(async () => {
+					const url = await this.html2canvasFun()
+					DataChartPdf({
+						T_snid:this.joinFun(),
+						Time_start:this.pages1.Time_start,
+						Time_end:this.pages1.Time_end,
+						file:url.split(',')[1],
+						T_temp_show:1,
+						T_Humidity_show:this.showHighchart_h?1:0,
+						...this.form
+					}).then(res => {
+						var arr1 = res.data.Data.split('/')
+						this.loading.close()
+						this.dialogVisible = false
+						Axios({
+							method: 'get',
+							url: res.data.Data,
+							responseType: 'blob'
+						}).then(resBlob => {
+							const FileSaver = require('file-saver')
+							const blob = new Blob([resBlob.data], {
+								type: 'application/pdf;charset=utf-8'
+							}) // 此处type根据你想要的
+							FileSaver.saveAs(blob, arr1[arr1.length-1]) // 下载的name文件名
+						});
+					})
+					this.ifHtmlCanvas = false
+				}, 100);
+			},
+			async downloadPDF(){
+				if (this.checkedCities.length==0) {
+					this.$message.error('请选择设备') 
+					return;
+				}else{
+					this.dialogVisible = true
+				}
+				
+			},
+			joinFun(){
+				const arr = [...this.checkedCities]
+				const joinArr = []
+				arr.forEach(item=>{
+					joinArr.push(item.T_sn + ',' + item.T_id)
+				})
+				return joinArr.join('|') + '|'
+			},
+			canvasIt() {//截图
+				this.ifHtmlCanvas = true
+				setTimeout(async () => {
+					const url = await this.html2canvasFun()
+					var a = document.createElement('a')
+					a.download = new Date().getTime()
+					a.href = url;// 设置图片地址
+					a.click();
+					this.ifHtmlCanvas = false
+				}, 100);
+				
+			},
+			html2canvasFun(){
+				return new Promise(resolve=>{
+					html2canvas(this.$refs.imageTofile, {
+						backgroundColor:' #fff',
+					}).then((canvas) => {
+						resolve(canvas.toDataURL("image/png"))
+					});
+				})
+			},
+			//左侧导航菜单
+			async GetDevSenListApi() {
+				var that = this
+				var resIt = await this.GetDevSenPam()
+				if (resIt.data.Code === 200) {
+					////console.log('导航----', resIt)
+					this.total = resIt.data.Data.Num
+					this.Page_size = resIt.data.Data.Page_size
+					var Arr = resIt.data.Data.DeviceSensor_lite || []
+					if (Arr != null) {
+						that.cities = [...that.cities,...Arr]
+					}else{
+						that.cities = []
+					}
+					////console.log('改变导航',that.cities)
+				}
+			},
+			GetDevSenPam() {
+				return new Promise(resolve => {
+					DevSenList(this.pages).then(function(res) {
+						resolve(res);
+					})
+				});
+			},
+			//select列表
+			GetClassListApi() {
+				var that = this
+				ClassList({}).then(res => {
+					if (res.data.Code === 200 && res.data.Msg === 'ok!') {
+						var Arr = res.data.Data.Data || []
+						Arr.forEach(function(item) {
+							var obj = {
+								value: '',
+								label: ''
+							}
+							obj.value = item.Id
+							obj.label = item.T_name
+							that.options.push(obj)
+						})
+						that.options.unshift({
+							value: '',
+							label: '所有分类'
+						})
+					}
+				})
+			},
+			async Timechange(e) {
+				console.log('勾选',e)
+				this.checkAll = false
+				this.isIndeterminate = false
+
+				// 
+				this.checkedCities = []
+				this.stale = true
+				if (e == null) {
+					this.pages1.Time_start = ''
+					this.pages1.Time_end = ''
+				} else {
+					this.pages1.Time_start = formatDate(e[0])
+					this.pages1.Time_end = formatDate(e[1])
+				}
+				this.pages1.page = 1
+				
+			},
+			inputserValue(e) {
+				this.cities = []
+				this.pages.T_name = e
+				this.pages.page = 1
+				this.stale = true
+				this.GetDevSenListApi()
+			},
+			selectsValue(e) {
+				this.stale = true
+				this.cities = []
+				this.pages.T_calssid = e
+				this.pages.page = 1
+				this.GetDevSenListApi()
+				
+			},
+			
+			GetDataListApi() {//获取选择的sn数据
+				return new Promise(resolve=>{
+					setTimeout(() => {
+						DataList(this.pages1).then(res => {
+						////console.log('接口返回',res)
+						var arr = res.data.Data.Data
+						if ( arr === null) {
+							arr = []
+						} else {
+							arr = arr.reverse()
+						}
+						resolve(arr)
+					})
+					},200)
+				}) 
+			},
+			async handleCheckAllChange(val) { //全选
+				this.isIndeterminate = false;
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				if(val){//全选
+					this.stale = false
+					this.checkedCities = this.cities
+					this.loading = this.$loading({
+						lock: true,
+						text: '请稍后...',
+						spinner: 'el-icon-loading',
+						background: 'rgba(0, 0, 0, 0.7)'
+					});
+					let sum = 0
+					
+					for (let i = 0; i < this.checkedCities.length; i++) {
+						this.pages1.T_snid = this.checkedCities[i].T_sn + ','+  this.checkedCities[i].T_id + "|"
+						let resIt = await this.GetDataListApi()
+						sum += 1
+						this.optionsData.data = resIt
+						this.optionsData.sn =  this.checkedCities[i].T_sn
+						this.optionsData.id =  this.checkedCities[i].T_id
+						this.optionsData.name =  this.checkedCities[i].T_name
+						if(sum==this.checkedCities.length){
+							this.loading.close()
+						}
+					}
+					
+				}else{//全取消
+					////console.log('全取消',this.checkedCities)
+					this.stale = true
+					this.checkedCities = []
+					// this.qingkong()	
+				}
+			},
+			
+
+			async handleCheckedCitiesChange(value,e) { //单选
+				////console.log('单选',value,e,this.checkedCities)
+				let checkedCount = this.checkedCities.length;
+				this.checkAll = checkedCount === this.cities.length;
+				this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])	
+				this.stale = false			
+				if(e){//勾选
+					this.loading = this.$loading({
+						lock: true,
+						text: '请稍后...',
+						spinner: 'el-icon-loading',
+						background: 'rgba(0, 0, 0, 0.7)'
+					});
+					this.pages1.T_snid = value.T_sn + ','+ value.T_id + "|"
+					let resIt = await this.GetDataListApi()
+					////console.log('单选返回1',resIt)
+					this.optionsData.data = resIt
+					////console.log('单选返回2',this.optionsData)
+					this.optionsData.sn = value.T_sn
+					this.optionsData.id = value.T_id
+					this.optionsData.name = value.T_name
+					this.loading.close()
+				}else{//取消勾选
+					this.optionsData.data = []
+					this.optionsData.sn = value.T_sn
+					this.optionsData.id = value.T_id
+					this.optionsData.name = value.T_name
+				}
+				////console.log('r',this.optionsData)
+			},
+			async theChange() { //反选
+				////console.log('反选1',this.cities,this.checkedCities)
+				let cities = this.cities;//当前导航数量
+				let checkedCities = this.checkedCities; //已经选择
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				
+				if (checkedCities.length === 0) {//未选择状态 去全选
+					////console.log('判断0',this.checkedCities)
+					this.checkedCities = cities;
+					this.checkAll = true;
+					this.stale = false
+					this.loading = this.$loading({
+						lock: true,
+						text: '请稍后...',
+						spinner: 'el-icon-loading',
+						background: 'rgba(0, 0, 0, 0.7)'
+					});
+					let sum = 0
+					
+					for (let i = 0; i < this.checkedCities.length; i++) {
+						this.pages1.T_snid = this.checkedCities[i].T_sn + ','+  this.checkedCities[i].T_id + "|"
+						let resIt = await this.GetDataListApi()
+						sum += 1
+						this.optionsData.data = resIt
+						this.optionsData.sn =  this.checkedCities[i].T_sn
+						this.optionsData.id =  this.checkedCities[i].T_id
+						this.optionsData.name =  this.checkedCities[i].T_name
+					}
+					if(sum==this.checkedCities.length){
+							this.loading.close()
+					}
+				} else if (checkedCities.length === cities.length) {//全选状态  全不选
+					this.stale = true  //相当于全取消
+					this.checkedCities = [];
+					this.checkAll = false;
+				} else {
+					this.$refs["childMethod1"].list = []
+					this.$refs["childMethod2"].list = []
+					// return
+					////console.log('判断2',this.checkedCities)
+					let list = cities.concat(checkedCities).filter((v, i, array) => {
+						return array.indexOf(v) === array.lastIndexOf(v);
+					});
+					////console.log('反选',list)
+					this.checkedCities = list;
+					this.loading = this.$loading({
+						lock: true,
+						text: '请稍后...',
+						spinner: 'el-icon-loading',
+						background: 'rgba(0, 0, 0, 0.7)'
+					});
+					for (let i = 0; i < this.checkedCities.length; i++) {
+						this.pages1.T_snid = this.checkedCities[i].T_sn + ','+  this.checkedCities[i].T_id + "|"
+						let resIt = await this.GetDataListApi()
+						this.optionsData.data = resIt
+						this.optionsData.sn =  this.checkedCities[i].T_sn
+						this.optionsData.id =  this.checkedCities[i].T_id
+						this.optionsData.name =  this.checkedCities[i].T_name
+					}
+					this.loading.close()
+				}
+			},
+		},
+		
+		watch: {
+			searchso(newVal) {
+				this.dialogVisible = newVal
+			},
+			cities(newVal) {
+				////console.log('----------------报错1')
+				if (newVal.length == 0) {
+					this.tableData = []
+					this.checkedCities = []
+					this.pages1.T_snid = ""
+				}
+				////console.log('----------------报错2')
+			},
+			// checkedCities(newVal) {
+			// 	////console.log('勾选了-----',newVal)
+			// 	var that = this
+			// 	if (newVal.length != 0) {
+			// 		this.checkedCities.forEach(async (obj)=> {
+			// 			that.pages1.T_snid = obj.T_sn + ',' + obj.T_id + '|'
+			// 			that.pages1.Time_start = formatDate(that.TimeValue[0])
+			// 			that.pages1.Time_end = formatDate(that.TimeValue[1])
+			// 			let resIt = await that.GetDataListApi()
+			// 			////console.log('监听返回',resIt)
+			// 		})
+			// 		// ////console.log('已勾选',arrObj.join('|') + '|')
+			// 		return
+			// 		this.pages1.T_snid = arrObj.join('|') + '|'
+					
+			// 	} else {
+			// 		this.pages1.T_snid = ''
+			// 		this.optionsTh = []
+			// 	}
+
+			// },
+		},
+	}
+</script>
+
+<style lang="scss">
+	@import '../../assets/css/dataDisplay/chartShow.scss';
+</style>
+<style lang="scss" scoped>
+	.el-checkbox {
+		display: flex;
+		align-items: center;
+		flex: 1;
+		margin-right: 0;
+	}
+</style>
+
+<style>
+</style>

+ 811 - 0
src/views/equipmentManagement/abandonDeviceDataShow.vue

@@ -0,0 +1,811 @@
+<!-- abandonDeviceDataShow数据展示 -->
+<template>
+	<div class="dataShow">
+		<div class="dataShow-T">
+			<div class="dataShow-TL">
+				<Breadcrumb class="bre"></Breadcrumb>
+				<div class="dataShow-searchs">
+					<inputs @inputs="inputserValue" @selects="selectsValue" :inputShow="true" :selectShow='true'
+						inputPlace0="请输入名称" inputPlace="请输入SN/设备名称" :options="options"></inputs>
+					<div class="dataShow-tit-mai1-btn">
+						<el-date-picker v-model="TimeValue" type="datetimerange" range-separator="至"
+							start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="pickerOptions"
+							@change="Timechange">
+						</el-date-picker>
+						<!-- <el-button type="danger" icon="el-icon-search">查询</el-button> -->
+					</div>
+				</div>
+			</div>
+			<div class="dataShow-TR">
+				<div class="dataShow-searchsMai">
+					<el-button v-permission="'AbandonDeviceDataShow::Backup'" type="info" size="small" @click="backup">备份数据</el-button>
+					<el-button v-permission="'AbandonDeviceDataShow::Excel'" type="warning" size="small" @click="DowDataExcel">导出Excel</el-button>
+					<el-button v-permission="'AbandonDeviceDataShow::PDF'" type="primary" size="small" @click="DowDataPDF">下载PDF</el-button>
+				</div>
+			</div>
+		</div>
+		<div class="dataShow-B">
+			<div class="dataShow-B-nav">
+				<div class="dataShow-B-nav1">
+					<div class="dataShow-B-nav1-L">
+						<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">
+							全选</el-checkbox>
+						<div class="dataShow-B-nav1-L1" @click="theChange">反选</div>
+					</div>
+					<div class="dataShow-B-nav1-R">
+
+					</div>
+				</div>
+				<div class="dataShow-B-nav2" v-infinite-scroll="load" infinite-scroll-immediate="false">
+					<div class="dataShow-B-nav2-mai">
+						<el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
+							<el-checkbox v-for="(item,index) in cities" :label="item" :key="index">
+								<div class="dataShow-B-nav2-t">
+									<div class="dataShow-B-nav2-tName" :title="item.T_name">
+										{{item.T_name}}
+									</div>
+									<div class="dataShow-B-nav2-tSn">
+										{{item.T_sn}}
+									</div>
+								</div>
+							</el-checkbox>
+						</el-checkbox-group>
+					</div>
+				</div>
+				<div class="dataShow-B-nav3">
+					<div>
+						总量:{{total}}
+					</div>
+					<div style="text-align: center;">页码:{{pages.page}}/{{Page_size}}</div>
+				</div>
+			</div>
+			<div class="dataShow-B-table">
+				<div class="dataShow-B-table2-mai">
+					<div class="dataShow-B-table2">
+						<el-table :data="tableData" v-loading='showTBLoad' border style="width: 100%">
+							<template slot="empty">
+								<noData></noData>
+							</template>
+							<el-table-column label="传感器名称" width="250px" :show-overflow-tooltip="true">
+								<template slot-scope="scope">
+									{{scope.row.T_name}}[{{scope.row.T_id}}]
+								</template>
+							</el-table-column>
+							<el-table-column label="温度℃" width="80px" :show-overflow-tooltip="true">
+								<template slot-scope="scope" style="background: red;">
+									<div :class="scope.row.T_ist==1?
+                                    scope.row.T_free==1?'':(scope.row.T_tl<=scope.row.T_t && scope.row.T_tu>=scope.row.T_t ?'':'errColor')
+                                    :''">
+										{{scope.row.T_ist==1?scope.row.T_t:'-'}}
+									</div>
+								</template>
+							</el-table-column>
+							<el-table-column label="湿度%" width="80px" :show-overflow-tooltip="true">
+								<template slot-scope="scope" style="background: red;">
+									<div :class="scope.row.T_ish==1?
+                                    scope.row.T_free==1?'':(scope.row.T_rhl<=scope.row.T_rh && scope.row.T_rhu>=scope.row.T_rh?'':'errColor'):''">
+										{{scope.row.T_ish==1?scope.row.T_rh:'-'}}
+									</div>
+								</template>
+							</el-table-column>
+							<el-table-column label="温度范围 ℃" width="150px" :show-overflow-tooltip="true">
+								<template slot-scope="scope">
+									{{scope.row.T_ist==1?scope.row.T_tl+'~'+scope.row.T_tu:'-'}}
+								</template>
+							</el-table-column>
+							<el-table-column label="湿度范围 %" width="150px" :show-overflow-tooltip="true">
+								<template slot-scope="scope">
+									{{scope.row.T_ish==1?scope.row.T_rhl+'~'+scope.row.T_rhu:'-'}}
+								</template>
+							</el-table-column>
+							<el-table-column prop="T_time" label="记录时间" :show-overflow-tooltip="true">
+							</el-table-column>
+							<el-table-column prop="T_remark" label="备注" :show-overflow-tooltip="true">
+							</el-table-column>
+						</el-table>
+					</div>
+					<div class="dataShow-B-table3">
+						<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
+							:current-page="pages1.page" :page-size="pages1.page_z" :hide-on-single-page="hideSin"
+							layout="total, sizes, prev, pager, next, jumper" :total="total1">
+						</el-pagination>
+					</div>
+				</div>
+			</div>
+		</div>
+		<el-dialog title="数据备份" :visible.sync="diaBackupShow" width="1000px" :append-to-body="true" @close="closes">
+			<div class="diaBackup" style="height: 500px;display: flex;border-top: 1px solid #ccc;">
+				<div class="diaBackup-nav"
+					style="height: 100%;overflow-y: hidden;display: flex;flex-direction: column;min-width: 200px;border-right: 1px solid #ccc;">
+					<el-checkbox :indeterminate="isInde" v-model="checkAllBack" @change="handleAllChange"
+						style="margin: 10px 0;">全选
+					</el-checkbox>
+					<div style="height: 100%;overflow-y: auto;" @scroll="scrollNav">
+						<el-checkbox-group v-model="checkedCities1" @change="handleCheckedChange">
+							<el-checkbox v-for="item,index in BackNav" :label="item" :key="index"style="padding: 10px 0;">
+								<div>{{item.T_name}}</div>
+								<div>{{item.T_sn}}</div>
+							</el-checkbox>
+						</el-checkbox-group>
+						<div v-show="BackPages.page == scrPage"
+							style="font-size: 12px;color: #ccc;text-align: center;padding: 10px 0;border-top: .5px solid #ccc;">
+							没有更多数据了哦
+						</div>
+					</div>
+				</div>
+				<div class="diaBackup-cont" style="flex: 1;margin-left: 10px;">
+					<div style="padding: 10px 0;border-bottom: 1px solid #ccc;display: flex;align-items: center;">
+						<p>备份时间:</p>
+						<el-date-picker v-model="TimeRange" type="daterange" range-separator="至"
+							:picker-options="picOption" @change="changTimerange" value-format='yyyy-MM-dd'
+							:clearable="false"
+							start-placeholder="开始日期" end-placeholder="结束日期">
+						</el-date-picker>
+					</div>
+					<el-table :data="BacktableData" style="width: 100%">
+						<el-table-column label="设备名称" prop="T_name">
+						</el-table-column>
+						<el-table-column label="数据量" prop="T_num">
+						</el-table-column>
+						<el-table-column label="备份时间" prop="T_date">
+						</el-table-column>
+						<el-table-column align="right">
+							<template slot="header" slot-scope="scope">
+								<el-button size="mini" @click="dowAllFun(scope)" :disabled="checkedCities1.length==0?true:false">全部下载</el-button>
+							</template>
+							<template slot-scope="scope">
+								<el-button size="mini" @click="dowsingFun(scope.row)">下载</el-button>
+							</template>
+						</el-table-column>
+					</el-table>
+					<el-pagination @current-change="handleSize"
+						:current-page="BackUppage.page" :page-size="BackUppage.page_z"
+						layout="total, prev, pager, next, jumper" :total="totalBack" style="margin-top: 50px;">
+					</el-pagination>
+				</div>
+			</div>
+		</el-dialog>
+		<el-dialog title="备份阅览" :visible.sync="ShowBackDia" width="50%"
+		 :show-close='percentage==100?true:false'
+		 :close-on-press-escape='false'
+		 :close-on-click-modal='false'
+		 :append-to-body="true">
+		 <div style="display: flex;align-items: flex-end;justify-content: center;">
+		 	<div style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
+		 		<el-progress type="circle" :width='100' :percentage="100" :format="format">
+		 		</el-progress>
+		 		<div style="margin-top: 5px;color: #999;font-size: 12px;font-weight: 500;">备份总数</div>
+		 	</div>
+		 	<div style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
+		 		<el-progress type="dashboard" :width='150' :percentage="percentage" :format="formatall" :color="colors"></el-progress>
+		 		<div style="margin-top: 5px;color: #999;font-size: 12px;font-weight: 500;">当前进度</div>
+		 	</div>
+		 	<div style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
+		 		<el-progress type="circle" :width='100' :percentage="100" :format="format1"></el-progress>
+		 		<div style="margin-top: 5px;color: #999;font-size: 12px;font-weight: 500;">备份成功</div>
+		 	</div>
+		 </div>
+		  <span slot="footer" style="display: flex;justify-content: center;">
+		    <el-button type="primary" @click="ShowBackDia = false" v-show="percentage==100?true:false">我知道了</el-button>
+		  </span>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		ClassList,
+		DevSenList,
+		DataList,
+		DataExcel,
+		DataPDF,
+		DataBackUp, //列表
+		DataBackUpPDF //下载
+	} from '../../api/dataDisplay/dataShow.js'
+	import {
+		formatDate,
+		Timerange
+	} from '../../utils/Times.js'
+	import Axios from 'axios'
+	import fileDownload from 'js-file-download';
+	import {
+		Tsnid
+	} from '@/utils/sinIDFun.js';
+	export default {
+		data() {
+			return {
+				a:1,
+				b:3,
+				colors: [{
+						color: '#f56c6c',
+						percentage: 20
+					},
+					{
+						color: '#e6a23c',
+						percentage: 40
+					},
+					{
+						color: '#5cb87a',
+						percentage: 60
+					},
+					{
+						color: '#1989fa',
+						percentage: 80
+					},
+					{
+						color: '#67C23A',
+						percentage: 100
+					},
+				],
+				ShowBackDia:false,
+				dataAll:0,
+				datasucc:0,
+				percentage: 0, //导入进度
+				totalBack:0,
+				picOption: {
+					disabledDate(time) {
+						let AtTime = new Date().getTime(); //获取此时的时间戳
+						return (
+							time.getTime() < AtTime - (86400000 * 40) //小于当前时间40天的全部disabled掉
+							||
+							time.getTime() > AtTime //大于当前时间的全部disabled掉
+						);
+					}
+				},
+				TimeRange: [
+					Timerange(new Date().getTime() - (86400000 * 40)), Timerange(new Date())
+				],
+				BackNav: [],
+				scrPage: 0, //总页码
+				BacktableData: [],
+				BackPages: {
+					page: 1,
+					page_z: 20,
+				},
+				BackUppage: {
+					T_snid: '',
+					Time_start: '',
+					Time_end: '',
+					page: 1,
+					page_z: 5,
+				},
+
+				showTBLoad: false,
+				hideSin: true,
+				TimeValue: [
+					new Date(new Date().toLocaleDateString()).getTime(), new Date()
+				],
+				total: 0,
+				total1: 0,
+				pagenum: 0,
+				pages: {
+					T_name: '',
+					T_calssid: '',
+					page: 1,
+					page_z: 30,
+                    T_abandon:1
+				},
+				Page_size: 0,
+				pages1: { //表格数据
+					T_snid: '',
+					Time_start: '',
+					Time_end: '',
+					page: 1,
+					page_z: 10,
+				},
+				pickerOptions: {
+					shortcuts: [{
+						text: '今天',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().toLocaleDateString()).getTime());
+							picker.$emit('pick', [start, end]);
+						}
+					}, {
+						text: '近一周',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 6);
+							picker.$emit('pick', [start, end]);
+						}
+					}, {
+						text: '近一月',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 30);
+							picker.$emit('pick', [start, end]);
+						}
+					}, {
+						text: '近一季度',
+						onClick(picker) {
+							const end = new Date();
+							const start = new Date();
+							start.setTime(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 90);
+							picker.$emit('pick', [start, end]);
+						}
+					}]
+				},
+				tableData: [],
+				checkAll: false,
+				checkAllBack: false,
+				checkedCities: [], //已经选择的
+				checkedCities1: [], //已经选择的
+				cities: [],
+				isIndeterminate: false,
+				isInde: false,
+				dialogVisible: false,
+				diaBackupShow: false, //备份数据
+				options: [],
+			}
+		},
+		computed: {
+			searchso() {
+				return this.$store.state.searchs
+			}
+		},
+		watch: {
+			searchso(newVal) {
+				this.dialogVisible = newVal
+			},
+			cities(newVal) {
+				////console.log('变化', newVal)
+				if (newVal.length == 0) {
+					this.tableData = []
+					this.checkedCities = []
+					this.pages1.T_snid = ""
+				}
+			},
+			checkedCities(newVal) {
+				////console.log('*****************************87',newVal.length)
+				this.pages1.T_snid = Tsnid(this.checkedCities)
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				this.pages1.page = 1
+				this.GetDataListApi()
+			},
+		},
+		mounted() {
+			////console.log('88',this.checkedCities,this.isIndeterminate)
+			this.GetClassListApi()
+			this.GetDevSenListApi()
+		},
+		methods: {
+			load () {
+				////console.log('页码', this.pages.page == this.Page_size,this.pages.page , this.Page_size)
+				if(this.pages.page == this.Page_size){
+					this.$message.info('哎呀,已经到底了')
+					return
+				}
+			    this.pages.page = this.pages.page+1
+				this.GetDevSenListApi()
+				////console.log('触底', this.pages.page)
+			},
+			closes(){
+				this.BacktableData = []
+				this.totalBack = 0
+				this.checkAllBack = false
+				this.checkedCities1 = []
+				this.TimeRange = [
+					Timerange(new Date().getTime() - (86400000 * 40)), Timerange(new Date())
+				]
+			},
+			formatall(){
+				if(this.percentage!=100){
+					return `${this.percentage}%`
+				}else{
+					return `备份完成`
+				}
+			},
+			format() {
+				return `${this.dataAll}条`
+			},
+			format1() {
+				return `${this.datasucc}条`
+			},
+			changTimerange(e) { //时间选择
+				var that = this
+				this.BackUppage.page=1
+				if (e != null) {
+					this.BackUppage.Time_start = e[0]
+					this.BackUppage.Time_end = e[1]
+				} else {
+					this.TimeRange = [Timerange(new Date().getTime() - (86400000 * 40)), Timerange(new Date())]
+					this.$emit("pick",this.TimeRange)
+					this.BackUppage.Time_start = Timerange(new Date().getTime() - (86400000 * 40))
+					this.BackUppage.Time_end = Timerange(new Date())
+				}
+				if (this.checkedCities1.length > 0) {
+					this.GetbackListApi()
+				}
+			},
+			async scrollNav(e) { //滚动加载
+				var that = this
+				let isBottom = e.target.scrollTop + e.target.clientHeight == e.target.scrollHeight
+				if (isBottom && this.BackPages.page < that.scrPage) {
+					let height = e.target.scrollTop
+					e.target.scrollTop = height
+					this.BackPages.page = this.BackPages.page + 1
+					var resIt = await this.GetBackPam()
+					if (resIt.data.Code === 200) {
+						that.BackNav = [...that.BackNav, ...resIt.data.Data.DeviceSensor_lite]
+					}
+				}
+			},
+			async backup() {
+				this.diaBackupShow = true
+				////console.log('时间', this.TimeRange)
+				this.BackUppage.Time_start = this.TimeRange[0]
+				this.BackUppage.Time_end = this.TimeRange[1]
+				this.BackNav = []
+				this.BackPages.page = 1
+				var resIt = await this.GetBackPam()
+				if (resIt.data.Code === 200) {
+					this.BackNav = resIt.data.Data.DeviceSensor_lite
+				}
+			},
+			GetBackPam() {
+				var that = this
+				return new Promise(resolve => {
+					DevSenList(this.BackPages).then(function(res) {
+						that.scrPage = res.data.Data.Page_size
+						resolve(res);
+					})
+				});
+			},
+			Timechange(e) {
+				////console.log('清空时间', e)
+				if (e == null) {
+					this.pages1.Time_start = ''
+					this.pages1.Time_end = ''
+					this.TimeValue = [
+						'', ''
+					]
+				} else {
+					this.pages1.Time_start = formatDate(e[0])
+					this.pages1.Time_end = formatDate(e[1])
+				}
+				this.pages1.page = 1
+				this.GetDataListApi()
+
+			},
+			GetDataListApi() {
+				this.showTBLoad = true
+				DataList(this.pages1).then(res => {
+					if (res.data.Code === 200 && res.data.Data != null) {
+						if (res.data.Data.Data != null) {
+							////console.log('222222r',res)
+							this.tableData = res.data.Data.Data
+							this.total1 = res.data.Data.Num
+						} else {
+							this.tableData = []
+							this.total1 = 0
+						}
+					} else {
+						this.tableData = []
+						this.total1 = 0
+					}
+					this.showTBLoad = false
+				})
+			},
+			//左侧导航菜单
+			async GetDevSenListApi() {
+				var that = this
+				var resIt = await this.GetDevSenPam()
+				////console.log('===========', resIt)
+				if (resIt.data.Code === 200) {
+					var Arr = resIt.data.Data.DeviceSensor_lite || []
+					this.total = resIt.data.Data.Num
+					this.Page_size = resIt.data.Data.Page_size
+					if (Arr != null) {
+						that.cities = [...that.cities,...Arr]
+					}else{
+						that.cities = []
+					}
+					////console.log('数据', that.cities)
+				}
+			},
+			GetDevSenPam() {
+				return new Promise(resolve => {
+					DevSenList(this.pages).then(function(res) {
+						resolve(res);
+					})
+				});
+			},
+			//select列表
+			GetClassListApi() {
+				var that = this
+				ClassList({}).then(res => {
+					////console.log('select', res)
+					if (res.data.Code === 200 && res.data.Msg === 'ok!') {
+						var Arr = res.data.Data.Data || []
+						Arr.forEach(function(item) {
+							var obj = {
+								value: '',
+								label: ''
+							}
+							obj.value = item.Id
+							obj.label = item.T_name
+							that.options.push(obj)
+						})
+						that.options.unshift({
+							value: '所有分类',
+							label: '所有分类'
+						})
+					}
+				})
+			},
+			inputserValue(e) {
+				
+				this.cities = []
+				this.pages.T_name = e
+				this.pages.page = 1
+				this.GetDevSenListApi()
+			},
+			selectsValue(e) {
+				this.pages.T_calssid = e
+				this.pages.page = 1
+				this.GetDevSenListApi()
+				this.cities = []
+			},
+			handleSizeChange(e) { //每页多少条
+				////console.log(e)
+				this.pages1.page_z = e
+				this.GetDataListApi()
+			},
+			handleCurrentChange(e) { //跳转页
+				this.pages1.page = e
+				this.GetDataListApi()
+			},
+			DowDataExcel() {
+				////console.log('导出exc', this.pages1)
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				if (this.pages1.T_snid == "") {
+					this.$message.error('请选择设备在导出数据')
+					return
+				} else {
+					const loading = this.$loading({
+						lock: true,
+						text: '正在整理数据,请稍后...',
+						spinner: 'el-icon-loading',
+						background: 'rgba(0, 0, 0, 0.7)'
+					});
+					DataExcel(this.pages1).then(res => {
+						////console.log('导出exc', res)
+						var arr1 = res.data.Data.split('/')
+						loading.close()
+						Axios({
+							method: 'get',
+							url: res.data.Data,
+							responseType: 'blob'
+						}).then(resBlob => {
+							fileDownload(resBlob.data, arr1[arr1.length-1]);
+						});
+					})
+				}
+			},
+
+			DowDataPDF() {
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				if (this.pages1.T_snid == "") {
+					this.$message.error('请选择设备在导出数据')
+				} else {
+					const loading = this.$loading({
+						lock: true,
+						text: '正在整理数据,请稍后...',
+						spinner: 'el-icon-loading',
+						background: 'rgba(0, 0, 0, 0.7)'
+					});
+					DataPDF(this.pages1).then(res => {
+						////console.log('下载',res)
+						var arr1 = res.data.Data.split('/')
+						loading.close()
+						Axios({
+							method: 'get',
+							url: res.data.Data,
+							responseType: 'blob'
+						}).then(resBlob => {
+							const FileSaver = require('file-saver')
+							const blob = new Blob([resBlob.data], {
+								type: 'application/pdf;charset=utf-8'
+							}) // 此处type根据你想要的
+							FileSaver.saveAs(blob, arr1[arr1.length-1]) // 下载的name文件名
+						});
+					})
+				}
+			},
+			handleCheckAllChange(val) { //全选
+				this.pages1.page = 1
+				this.checkedCities = val ? this.cities : [];
+				////console.log('1', val, this.checkedCities)
+				this.isIndeterminate = false;
+				
+			},
+			handleCheckedCitiesChange(value) { //单选
+				this.pages1.page = 1
+				////console.log('单点',this.pages1.page)
+				let checkedCount = value.length;
+				this.checkAll = checkedCount === this.cities.length;
+				this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				
+			},
+			theChange(val) { //反选
+				let cities = this.cities;
+				let checkedCities = this.checkedCities; //已经选择
+				this.pages1.page = 1
+				this.pages1.Time_start = formatDate(this.TimeValue[0])
+				this.pages1.Time_end = formatDate(this.TimeValue[1])
+				if (checkedCities.length === 0) {
+					checkedCities = val ? cities : [];
+				} else if (checkedCities.length === cities.length) {
+					this.checkedCities = [];
+					this.checkAll = false;
+				} else {
+					let list = cities.concat(checkedCities).filter((v, i, array) => {
+						return array.indexOf(v) === array.lastIndexOf(v);
+					});
+					this.checkedCities = list;
+				}
+			},
+
+			handleAllChange(val) { //备份全选
+				////console.log('备份全选',this.BackUppage)
+				this.BackUppage.page = 1
+				this.checkedCities1 = val ? this.BackNav : [];
+				this.isInde = false;
+				this.BackUppage.T_snid = Tsnid(this.checkedCities1)
+				if (this.BackUppage.T_snid != '') {
+					this.GetbackListApi()
+				} else {
+					this.BacktableData = []
+					this.totalBack = 0
+				}
+			},
+			handleCheckedChange(value) { //备份单选
+				////console.log('备份单选',this.BackUppage)
+				this.BackUppage.page = 1
+				let checkedCount = value.length;
+				this.checkAllBack = checkedCount === this.BackNav.length;
+				this.isInde = checkedCount > 0 && checkedCount < this.BackNav.length;
+				this.BackUppage.T_snid = Tsnid(this.checkedCities1)
+				if (this.BackUppage.T_snid != '') {
+					this.GetbackListApi()
+				} else {
+					this.BacktableData = []
+					this.totalBack = 0
+				}
+			},
+			GetbackListApi() {
+				DataBackUp(this.BackUppage).then(res => {
+					////console.log('列表ss', res)
+					if (res.data.Code === 200) {
+						this.BacktableData = res.data.Data.Data
+						this.totalBack = res.data.Data.Num
+					}
+				})
+			},
+			handleSize(e){
+				this.BackUppage.page = e
+				this.GetbackListApi()
+			},
+			async dowAllFun() { //全部下载
+				this.ShowBackDia = true
+				this.dataAll = 0
+				this.datasucc = 0
+				this.percentage = 0 //导入进度
+				var obj = {...this.BackUppage} 
+				obj.page_z = 999999
+				var arr = []
+				var resIt = await this.AllListApi(obj)
+				console.log('第一个',resIt)
+				if(resIt.data.Code==200){
+					arr = resIt.data.Data.Data
+					this.dataAll = resIt.data.Data.Num
+				}
+				for (let i = 0; i < arr.length; i++) {
+					var resIt = await this.dowupPdf(arr[i])
+				console.log('第2个',resIt)
+
+					////console.log('全部下载',resIt)
+					let arr1 = resIt.data.Data.split('/')
+					////console.log('全部下载',arr1,arr1[arr1.length-1])
+					if (resIt.data.Code === 200) {
+						Axios({
+							method: 'get',
+							url: resIt.data.Data,
+							responseType: 'blob'
+						}).then(resBlob => {
+							if(resBlob.status===200){
+								this.datasucc = this.datasucc+1
+							}
+							this.percentage = parseFloat(Number((this.datasucc / this.dataAll) * 100)).toFixed(0) - 0
+							const FileSaver = require('file-saver')
+							const blob = new Blob([resBlob.data], {
+								type: 'application/pdf;charset=utf-8'
+							}) // 此处type根据你想要的
+							FileSaver.saveAs(blob, arr1[arr1.length-1]) // 下载的name文件名
+						});
+					}
+				}
+			},
+			AllListApi(obj) {
+				return new Promise(resolve=>{
+					DataBackUp(obj).then(res => {
+						resolve(res)
+					})
+				})
+			},
+			async dowsingFun(e) { //单个下载
+				const loading = this.$loading({
+					lock: true,
+					text: '正在整理数据,请稍后...',
+					spinner: 'el-icon-loading',
+					background: 'rgba(0, 0, 0, 0.7)'
+				});
+				var resIt = await this.dowupPdf(e)
+				let arr = resIt.data.Data.split('/')
+				if (resIt.data.Code === 200) {
+					Axios({
+						method: 'get',
+						url: resIt.data.Data,
+						responseType: 'blob'
+					}).then(resBlob => {
+						const FileSaver = require('file-saver')
+						const blob = new Blob([resBlob.data], {
+							type: 'application/pdf;charset=utf-8'
+						}) // 此处type根据你想要的
+						FileSaver.saveAs(blob, arr[arr.length-1]) // 下载的name文件名
+					});
+				}
+				loading.close()
+			},
+			dowupPdf(obj) {
+				return new Promise(resolve => {
+					DataBackUpPDF({
+						T_sn: obj.T_sn,
+						T_id: obj.T_id,
+						T_date: obj.T_date,
+					}).then(res => {
+						setTimeout(function(){
+							resolve(res)
+						},1000)
+					})
+				})
+			}
+		},
+
+	}
+</script>
+
+<style lang="scss">
+	@import '../../assets/css/dataDisplay/dataShow.scss';
+</style>
+<style lang="scss" scoped>
+	.errColor {
+		color: red;
+	}
+	.sucColor {
+		color: blue;
+	}
+
+	.el-table .warning-row {
+		background: oldlace;
+	}
+
+	.el-table .success-row {
+		background: #f0f9eb;
+	}
+
+	.el-checkbox {
+		display: flex;
+		align-items: center;
+		flex: 1;
+		margin-right: 0;
+	}
+</style>

+ 692 - 0
src/views/equipmentManagement/abandonDeviceEquipment.vue

@@ -0,0 +1,692 @@
+<!-- abandonDeviceManagement设备管理 -->
+<template>
+	<div class="equipment">
+		<div class="equipment-T">
+			<div class="equipment-TL">
+				<Breadcrumb class="bre"></Breadcrumb>
+				<div class="equipment-searchs">
+					<!-- <inputs @inputs="inputserValue" :inputShow="true" inputPlace="请输入SN/名称查询"></inputs>
+					<div class="equipment-tit-mai1-btn">
+						<el-button type="danger" icon="el-icon-search">查询</el-button>
+					</div> -->
+				</div>
+			</div>
+			<div class="equipment-TR">
+				<div class="equipment-searchsMai">
+				</div>
+			</div>
+		</div>
+		<div class="equipment-B">
+			<el-form :inline="true" :model="pages" class="demo-form-inline">
+				<el-form-item label="设备名称">
+					<el-input v-model="pages.T_name" placeholder="请输入设备名称/sn" clearable></el-input>
+				</el-form-item>
+				<el-form-item label="分类">
+					<el-select v-model="pages.T_calssid" placeholder="分类" @focus="GetClassAllApi">
+						<el-option label="全部" value=""></el-option>
+						<el-option :label="item.T_name" :value="item.Id" v-for="item in optionData" :key="item.Id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="数据">
+					<el-select v-model="pages.T_datashow" placeholder="数据展示" style="width: 100px;">
+						<el-option label="全部" value=""></el-option>
+						<el-option label="显示" value="1"></el-option>
+						<el-option label="隐藏" value="0"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="排序">
+					<el-select v-model="pages.T_sort" placeholder="排序" style="width: 100px;">
+						<el-option label="升序" value="0"></el-option>
+						<el-option label="降序" value="1"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="启用">
+					<el-select v-model="pages.T_en" placeholder="活动区域" style="width: 100px;">
+						<el-option label="全部" value=""></el-option>
+						<el-option label="启用" value="1"></el-option>
+						<el-option label="停用" value="0"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="空库">
+					<el-select v-model="pages.T_free" placeholder="空库" style="width: 100px;">
+						<el-option label="全部" value=""></el-option>
+						<el-option label="空库" value="1"></el-option>
+						<el-option label="正常" value="0"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" icon="el-icon-search" @click="Getsearch">搜索</el-button>
+				</el-form-item>
+			</el-form>
+			<div class="equipment-B-table" v-infinite-scroll="scroll" infinite-scroll-immediate="false">
+				<el-table ref="multipleTable" :data="tableData" tooltip-effect="dark" style="width: 100%" border
+					@selection-change="handleSelectionChange">
+					<template slot="empty">
+						<noData></noData>
+					</template>
+					<el-table-column type="selection" width="55">
+					</el-table-column>
+					<el-table-column type="index" width="50" label="序号">
+					</el-table-column>
+					<el-table-column label="SN" width="200" show-overflow-tooltip>
+						<template slot-scope="scope">{{ scope.row.T_sn }}</template>
+					</el-table-column>
+					<el-table-column prop="T_id" label="编号" width="120" show-overflow-tooltip>
+					</el-table-column>
+					<el-table-column prop="T_name" width="150" label="传感器名称" show-overflow-tooltip>
+					</el-table-column>
+					<el-table-column prop="T_type_name" width="95" label="传感器类型" show-overflow-tooltip>
+					</el-table-column>
+					<el-table-column label="启/停" width="80">
+						<template slot-scope="scope">
+							<div v-if="scope.row.T_en==null"></div>
+							<el-tag v-else :type="scope.row.T_en==1?'':'danger'">{{scope.row.T_en==1?'启用':'停用'}}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column label="空库" width="80">
+						<template slot-scope="scope">
+							<div v-if="scope.row.T_free==null"></div>
+							<el-tag v-else :type="scope.row.T_free==1?'danger':''">{{scope.row.T_free==1?'空库':'正常'}}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column label="温度范围(°C)" width="150" show-overflow-tooltip>
+						<template slot-scope="scope">
+							<div style="display: flex;">
+								<div>{{scope.row.T_Tlower}}</div>
+								<div style="padding: 0 5px;" v-if="scope.row.T_Tlower!=null && scope.row.T_Tupper!=null"> ~ </div>
+								<div>{{scope.row.T_Tupper}}</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="湿度范围(%)" width="150" show-overflow-tooltip>
+						<template slot-scope="scope">
+							<div style="display: flex;">
+								<div>{{scope.row.T_RHlower}}</div>
+								<div style="padding: 0 5px;" v-if="scope.row.T_RHlower!=null && scope.row.T_RHupper!=null"> ~ </div>
+								<div>{{scope.row.T_RHupper}}</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="预警" width="70" show-overflow-tooltip>
+						<template slot-scope="scope">
+							<el-tag :type="scope.row.T_enprel==1?'':'danger'">{{scope.row.T_enprel==1?'开启':'关闭'}}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column label="预警温度范围" width="120" show-overflow-tooltip>
+						<template slot-scope="scope">
+							<div style="display: flex;">
+								<div>{{scope.row.T_tprel}}</div>
+								<div style="padding: 0 5px;" v-if="scope.row.T_tprel!=null && scope.row.T_tpreu!=null"> ~ </div>
+								<div>{{scope.row.T_tpreu}}</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="预警湿度范围" width="110" show-overflow-tooltip>
+						<template slot-scope="scope">
+							<div style="display: flex;">
+								<div>{{scope.row.T_hprel}}</div>
+								<div style="padding: 0 5px;" v-if="scope.row.T_hprel!=null && scope.row.T_hpreu!=null"> ~ </div>
+								<div>{{scope.row.T_hpreu}}</div>
+							</div>
+						</template>
+					</el-table-column>
+					
+					<el-table-column prop="name" label="数据展示" width="80">
+						<template slot-scope="scope">
+							<el-tag :type="scope.row.T_datashow==1?'':'danger'">{{scope.row.T_datashow==1?'显示':'屏蔽'}}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column label="展示排序 (双击编辑)" fixed="right" show-overflow-tooltip>
+						<template slot-scope="scope">
+							<div @dblclick="dblclick(scope.row)" style="user-select: none;cursor: pointer;">
+								{{scope.row.T_sort}}
+							</div>
+						</template>
+					</el-table-column>
+				</el-table>
+			</div>
+
+			<div class="equipment-B-btn">
+				<el-row>
+					<el-button v-permission="'AbandonDeviceSensor:Warning'" type="primary" @click="showDialog('报警范围',0)">报警范围</el-button>
+					<el-button v-permission="'AbandonDeviceSensor:Enprel'" type="success" @click="showDialog('预警范围',1)">预警范围</el-button>
+					<el-button v-permission="'AbandonDeviceSensor:En'" type="info" @click="showDialog('启用',2)">启/停</el-button>
+					<el-button v-permission="'AbandonDeviceSensor:Free'" type="warning" @click="showDialog('空库',3)">空库</el-button>
+					<el-button v-permission="'AbandonDeviceSensor:Datashow'" type="danger" @click="showDialog('数据展示')">数据展示</el-button>
+					<el-button v-permission="'AbandonDeviceSensor:TypeSelection'" type="primary" @click="showDialogType()">类型选择</el-button>
+				</el-row>
+			</div>
+		</div>
+		<el-dialog :title="title" :visible.sync="dialogVisible" width="40%" :append-to-body="true">
+			<div>
+				<el-form ref="form" label-width="80px">
+					<!-- 报警范围 -->
+					<el-form-item label="温度范围" v-if="title=='报警范围'">
+						<div style="display: flex;align-items: center;">
+							<div style="display: flex;align-items: center;">
+								<div>
+									<el-input v-model="pages2.T_Tlower" :placeholder="placeholdershow.tlplaceholder"></el-input>
+								</div>
+								<div style="padding: 0 10px;">-</div>
+								<div>
+									<el-input v-model="pages2.T_Tupper" :placeholder="placeholdershow.tuplaceholder"></el-input>
+								</div>
+							</div>
+							<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+								style="margin-left: 20px;" content=" -40.0 至 80.0 ">
+								<i class="el-icon-question" slot="reference" style="font-size: 16px;"></i>
+							</el-popover>
+						</div>
+					</el-form-item>
+					<el-form-item label="湿度范围" v-if="title=='报警范围'">
+						<div style="display: flex;align-items: center;">
+							<div style="display: flex;align-items: center;">
+								<div>
+									<el-input v-model="pages2.T_RHlower" :placeholder="placeholdershow.hlplaceholder"></el-input>
+								</div>
+								<div style="padding: 0 10px;">-</div>
+								<div>
+									<el-input v-model="pages2.T_RHupper" :placeholder="placeholdershow.huplaceholder"></el-input>
+								</div>
+							</div>
+							<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+								style="margin-left: 20px;" content=" -40.0 至 80.0 ">
+								<i class="el-icon-question" slot="reference" style="font-size: 16px;"></i>
+							</el-popover>
+						</div>
+					</el-form-item>
+					
+					<!-- 启用 -->
+					<el-form-item label="启用" v-if="title=='启用'">
+						<div style="display: flex;align-items: center;">
+							<el-switch v-model="pages2.T_en" :inactive-value="0" :active-value="1"></el-switch>
+							<el-popover placement="top-start" title="标题" width="200" trigger="hover"
+								style="margin-left: 20px;" content="功能(实时、记录、报警、预警)。">
+								<i class="el-icon-question" slot="reference" style="font-size: 16px;"></i>
+							</el-popover>
+						</div>
+					</el-form-item>
+					
+					<!-- 数据展示 -->
+					<el-form-item label="数据展示" v-if="title=='数据展示'">
+						<el-radio-group v-model="form.dataShow">
+							<el-radio label="0">屏蔽数据展示</el-radio>
+							<el-radio label="1">正常数据展示</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					
+					<!-- 预警范围 -->
+					<el-form-item label="预警" v-if="title=='预警范围'">
+						<div style="display: flex;align-items: center;">
+							<el-switch v-model="pages2.T_enprel" :inactive-value="0" :active-value="1" @change="changeSwiper"></el-switch>
+							<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+								style="margin-left: 20px;" content="推送预警消息,设为 空库后 不推送预警消息。">
+								<div slot="reference" style="display: flex;align-items: center;">
+									<i class="el-icon-question" style="font-size: 16px;"></i>
+									<div style="color: red;margin-left: 10px;font-size: 12px;line-height: 20px;text-align: justify;">
+										按钮默认关闭状态,点击改变按钮状态(不操作保持原来的状态)
+									</div>
+								</div>
+							</el-popover>
+						</div>
+					</el-form-item>
+					<el-form-item label="温度范围" v-if="title=='预警范围'">
+						<div style="display: flex;align-items: center;">
+							<div style="display: flex;align-items: center;">
+								<div>
+									<el-input v-model="pages2.T_tprel" :placeholder="placeholdershow.tlplaceholder"></el-input>
+								</div>
+								<div style="padding: 0 10px;">-</div>
+								<div>
+									<el-input v-model="pages2.T_tpreu" :placeholder="placeholdershow.tuplaceholder"></el-input>
+								</div>
+							</div>
+							<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+								style="margin-left: 20px;" content="0.0  至 100.0">
+								<i class="el-icon-question" slot="reference" style="font-size: 16px;"></i>
+							</el-popover>
+						</div>
+					</el-form-item>
+					<el-form-item label="湿度范围" v-if="title=='预警范围'">
+						<div style="display: flex;align-items: center;">
+							<div style="display: flex;align-items: center;">
+								<div>
+									
+									<el-input v-model="pages2.T_hprel" :placeholder="placeholdershow.hlplaceholder"></el-input>
+								</div>
+								<div style="padding: 0 10px;">-</div>
+								<div>
+									<el-input v-model="pages2.T_hpreu" :placeholder="placeholdershow.huplaceholder"></el-input>
+								</div>
+							</div>
+							<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+								style="margin-left: 20px;" content="0.0  至 100.0">
+								<i class="el-icon-question" slot="reference" style="font-size: 16px;"></i>
+							</el-popover>
+						</div>
+					</el-form-item>
+					<!-- 空库 -->
+					<el-form-item label="启用空库" v-if="title=='空库'">
+						<div style="display: flex;align-items: center;">
+							<el-switch v-model="pages2.T_free" :inactive-value="0" :active-value="1"></el-switch>
+							<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+								style="margin-left: 20px;" content="1.空库(正常 实时、记录, 不报警、预警)  2.正常(正常 实时、记录、报警、预警)。">
+								<div slot="reference" style="display: flex;align-items: center;">
+									<i class="el-icon-question" style="font-size: 16px;"></i>
+									<div style="color: red;margin-left: 10px;text-align: justify;">
+										{{ msg }}
+									</div>
+								</div>
+							</el-popover>
+						</div>
+					</el-form-item>
+				</el-form>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="dialogVisible = false">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(title)">{{title=='数据展示'?'提交':'传感器配置'}}</el-button>
+			</span>
+		</el-dialog>
+		<el-dialog title="类型选择" :visible.sync="dialogVisibleType" :append-to-body="true">
+			<div>
+				<el-form ref="form" label-width="80px">
+					<el-form-item label="类型选择">
+						<el-radio-group v-model="pomosType.T_type">
+							<el-radio :label="0" style="line-height: 30px;">默认</el-radio>
+							<el-radio :label="item.Id" v-for="(item, index) in RadioData" :key="index"
+								style="line-height: 30px;">{{ item.T_name }}</el-radio>
+						</el-radio-group>
+					</el-form-item>
+				</el-form>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="dialogVisibleType = false">取 消</el-button>
+				<el-button type="primary" @click="subtype">提交设置</el-button>
+			</span>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		DevSenList,
+		DevSenEdit,
+		DevSenParam
+	} from "@/api/equipmentManagement/equipment.js"
+	import {ClassAll} from "@/api/ClassAll.js"
+	import {DevListAll} from "../../api/equipmentManagement/management.js"
+	import {showDiaFrom,placeholderFun} from "@/plugins/showDiaFrom"
+	export default {
+		data() {
+			return {
+				msg:'',
+				RadioData:[],
+				pages:{
+					T_name:'',//包含 T_name、T_sn 
+					T_calssid:'',//分类 ID
+					T_en:'',//启用 0 停用  1 启用  空 所有
+					T_free:'',//空库 0 正常  1 空库 空 所有
+					T_datashow:'',//0 屏蔽数据展示  1 正常数据展示 空:所有
+					T_sort:'',//排序 0 升序 1 降序
+					page:1,//页码
+					page_z:20,//
+                    T_abandon:1
+				},
+				optionData:[],//分类列表
+				Page_size:1,
+				pages1:{//1双击编辑排序  2屏蔽数据展示
+					T_sn:'',
+					T_id:'',
+					T_sort:'',
+					T_datashow :'',
+				},
+				pomosType:{
+					T_type:0
+				},
+				SwiperStr:false,
+				pages2:{
+					// T_sn:null,//
+					// T_id:null,//
+					// T_Tlower:null,//温度下限
+					// T_Tupper :null,//温度上限
+					// T_RHlower :null,//湿度下限
+					// T_RHupper:null,//湿度上限
+					// T_en:null,//是否启用传感器
+					// T_free:null,//监测点是否为闲置状态(空库,只监测不报警)
+					// T_enprel :null,//是否启用预警   1开启  0 关闭
+					// T_tprel :null,//温度预警下限  
+					// T_tpreu:null,//温度预警上限
+					// T_hprel :null,//湿度预警下限
+					// T_hpreu :null,//温度预警上限
+				},
+				placeholdershow:{},
+				form: {
+					dataShow: '0',
+				},
+				title: '',
+				dialogVisible: false,
+				dialogVisibleType: false,
+				multipleSelection: [],
+				tableData: [],
+				resIts:null
+			}
+		},
+		mounted() {
+			this.asSerFun()
+			
+		},
+		methods: {
+			dblclick(data) {//双击
+				this.$prompt('请输入排序号:', '', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					inputValue:`${data.T_sort}`
+					// inputPattern: /^[+]{0,1}(\d+)$/,
+					// inputErrorMessage: '序号格式不正确'
+				}).then(async({
+					value
+				}) => {
+					this.pages1.T_sn = data.T_sn
+					this.pages1.T_id = data.T_id
+					this.pages1.T_sort = value
+					var res = await this.GetDevSenEditApi()
+					if(res.data.Code===200){
+						this.tableData = []
+						this.pages.page = 1
+						this.Page_size = 1
+						this.$message.success('编辑成功')
+						this.asSerFun()
+					}	
+					////console.log('返回res',res)
+				}).catch(() => {
+					this.$message.info('取消编辑序号')
+				});
+			},
+			GetDevSenEditApi(){
+				return new Promise(resolve=>{
+					DevSenEdit(this.pages1).then(res=>{
+						////console.log('编辑',res)
+						resolve(res)
+					})
+				})
+			},
+			GetClassAllApi(){//分类
+				ClassAll({}).then(res=>{
+					if(res.data.Code){
+						 this.optionData = res.data.Data.Data
+						////console.log('分类',res,this.optionData)
+					}
+				})
+			},
+			async scroll() {//触底加载
+				////console.log('滚动',this.pages.page)
+				if(this.pages.page == this.Page_size){
+					this.$message.info('哎呀,已经到底了')
+					return
+				}
+				this.pages.page = this.pages.page+1
+				this.asSerFun()
+
+			},
+			async asSerFun(){
+				var res = await this.GetDevSenListApi()
+				if(res.data.Code===200 && res.data.Data.Data!=null){
+					this.Page_size = res.data.Data.Page_size
+					this.tableData = [...this.tableData,...res.data.Data.Data]
+				}
+			},
+			GetDevSenListApi(){//列表
+				return new Promise(resolve=>{
+					DevSenList(this.pages).then(res=>{
+						resolve(res)
+					})
+				})
+			},
+			Getsearch(){//搜索
+				this.tableData = []
+				this.pages.page = 1
+				this.Page_size = 1
+				this.asSerFun()
+			},
+			
+			
+			handleSelectionChange(val) { //全选的值
+				this.multipleSelection = val;
+			},
+			changeSwiper(e){
+				this.SwiperStr = true
+				////console.log('触发',e,this.SwiperStr)	
+			},
+			// 类型选择
+			showDialogType(){
+				if(this.multipleSelection.length==0){
+					this.$message.error('请至少选择一项进行操作')
+					return
+				}else{
+					this.dialogVisibleType = true
+					this.getDevListAllApi()
+				}
+				
+			},
+			getDevListAllApi() {
+				DevListAll({}).then(res => {
+					if (res.data.Code == 200) {
+						this.RadioData = res.data.Data.Data
+					}
+				})
+			},
+			async subtype(){
+				var arr = this.multipleSelection
+				var suc = 0
+				var fai = 0
+				const loadings2 = this.$loading({
+					text:'正在处理,请稍后...',
+				})
+				this.dialogVisibleType = false
+				for (let i = 0; i < arr.length; i++) {
+					var res = await new Promise(resolve=>{
+						DevSenEdit({
+							T_sn:arr[i].T_sn,
+							T_id:arr[i].T_id,
+							...this.pomosType
+						}).then(res=>{
+							setTimeout(() => {
+								resolve(res)
+							}, 2000);
+						})
+					}) 
+					if(res.data.Code===200){
+						suc = suc+1
+					}else{
+						fai = fai+1
+					}
+					
+					loadings2.text = `已完成${i+1}/${arr.length}`
+					if(arr.length==suc+fai){
+						this.tableData = []
+						this.pages.page = 1
+						this.Page_size = 1
+						this.scroll()
+						this.$message.success(`批量操作,成功${suc}个,失败${fai}个`)
+						this.pages2 = {}
+						loadings2.close();
+						this.asSerFun()
+					}
+				}
+			},
+			showDialog(e,i) {
+				console.log('不等于数据展示',e,i)
+				var that = this
+				if (e!='数据展示') {
+					////console.log('不等于数据展示')
+					that.pages2 = showDiaFrom(i)
+				}
+				if(this.multipleSelection.length==0){
+					this.$message.error('请至少选择一项进行操作')
+					return
+				}else{
+					Object.keys(this.pages2).forEach(item=>{this.pages2[item] = ''})
+					this.title = e
+					
+					if(e=='报警范围' || e=='预警范围'){
+						this.placeholdershow = placeholderFun();
+						this.screenFun(e)
+					}
+					if(e=='空库'){
+						console.log('e',e,this.multipleSelection,this.pages2.T_free)
+						const it = this.multipleSelection[0].T_free
+						const arrMap = []
+						this.multipleSelection.forEach(item=>{arrMap.push(item.T_free)})
+						const b = arrMap.every(item => item==it)
+						console.log('???',b,it)
+						if(b){
+							this.pages2.T_free = it
+							this.msg = ''
+						}else{
+							this.pages2.T_free = ''
+							this.msg = '选择状态不同,默认状态(不操作,不修改原状态)'
+						}
+					}
+					this.dialogVisible = true
+				}
+			},
+			//筛选出选中的温湿度是否相同,相同就填入输入框,反之显示所选温湿度不同
+			screenFun(e){
+				// ////console.log('this.multipleSelection',this.multipleSelection,this.pages2)
+				const arr = [...this.multipleSelection]
+				let tTop = [],tBut = [],hTop = [],hBut = []
+				arr.forEach(item=>{
+					console.log('**',item)
+					tTop.push(e=='报警范围'?item.T_Tupper:item.T_tpreu)
+					tBut.push(e=='报警范围'?item.T_Tlower:item.T_tprel)
+					hTop.push(e=='报警范围'?item.T_RHupper:item.T_hpreu)
+					hBut.push(e=='报警范围'?item.T_RHlower:item.T_hprel)
+				})
+				tTop = [...new Set(tTop)]
+				tBut = [...new Set(tBut)]
+				hTop = [...new Set(hTop)]
+				hBut = [...new Set(hBut)]
+
+				
+				if (e=='报警范围') {
+					if (tTop.length==1) {this.pages2.T_Tupper = tTop[0]}else{this.pages2.T_Tupper = '';this.placeholdershow.tuplaceholder='所选温度上限不同'}
+					if (tBut.length==1) {this.pages2.T_Tlower = tBut[0]}else{this.pages2.T_Tlower = '';this.placeholdershow.tlplaceholder='所选温度下限不同'}
+					if (hTop.length==1) {this.pages2.T_RHupper = hTop[0]}else{this.pages2.T_RHupper = '';this.placeholdershow.huplaceholder='所选湿度上限不同'}
+					if (hBut.length==1) {this.pages2.T_RHlower = hBut[0]}else{this.pages2.T_RHlower = '';this.placeholdershow.hlplaceholder='所选湿度下限不同'}
+				} else {
+					if (tTop.length==1) {this.pages2.T_tpreu = tTop[0]}else{this.pages2.T_tpreu = '';this.placeholdershow.tuplaceholder='所选温度上限不同'}
+					if (tBut.length==1) {this.pages2.T_tprel = tBut[0]}else{this.pages2.T_tprel = '';this.placeholdershow.tlplaceholder='所选温度下限不同'}
+					if (hTop.length==1) {this.pages2.T_hpreu = hTop[0]}else{this.pages2.T_hpreu = '';this.placeholdershow.huplaceholder='所选湿度上限不同'}
+					if (hBut.length==1) {this.pages2.T_hprel = hBut[0]}else{this.pages2.T_hprel = '';this.placeholdershow.hlplaceholder='所选湿度下限不同'}
+				}
+				
+				
+			},
+			
+			async onSubmit(e) {
+				if(e=='预警范围'){
+					if(!this.SwiperStr){
+						this.pages2.T_enprel = ''
+						////console.log('=====')
+					}
+				}
+				if(e=='启用'){
+					if(this.pages2.T_en == ''){
+						this.pages2.T_en = 0
+					}
+				}
+				switch(e){
+					case '数据展示':
+						var arr = this.multipleSelection
+						this.pages1.T_sort = ''
+						const loadings1 = this.$loading();
+						this.dialogVisible = false
+						var suc = 0
+						var fai = 0
+						arr.forEach( async (item)=>{
+							this.pages1.T_datashow = this.form.dataShow
+							this.pages1.T_sn = item.T_sn
+							this.pages1.T_id = item.T_id
+							var res = await this.GetDevSenEditApi()
+							if(res.data.Code===200){
+								suc = suc+1
+							}else{
+								fai = fai+1
+							}
+							if(arr.length==suc+fai){
+								this.tableData = []
+								this.pages.page = 1
+								this.Page_size = 1
+								this.scroll()
+								this.$message.success(`批量操作,成功${suc}个,失败${fai}个`)
+								loadings1.close();
+							}
+						})
+						break
+					default:
+						this.switchFun()
+				}
+				this.asSerFun()
+			},
+			async switchFun(){
+				let that = this
+				var arr = this.multipleSelection
+				var suc = 0
+				var fai = 0
+				const loadings2 = this.$loading({
+					text:'正在处理,请稍后...',
+				})
+				this.dialogVisible = false
+				this.SwiperStr = false
+				for (let i = 0; i < arr.length; i++) {
+					this.pages2.T_sn = arr[i].T_sn
+					this.pages2.T_id = arr[i].T_id
+					
+					var res = await that.getForPromise()
+					
+					////console.log('=============',i,res)
+					
+					if(res.data.Code===200){
+						suc = suc+1
+					}else{
+						fai = fai+1
+					}
+					loadings2.text = `已完成${i+1}/${arr.length}`
+					if(arr.length==suc+fai){
+						this.tableData = []
+						this.pages.page = 1
+						this.Page_size = 1
+						this.scroll()
+						this.$message.success(`批量操作,成功${suc}个,失败${fai}个`)
+						this.pages2 = {}
+						loadings2.close();
+						this.asSerFun()
+					}
+				}
+			},
+			
+			getForPromise(){
+				let that = this
+				return new Promise(async(resolve) => {
+					for (let j = 0; j < 3; j++) {
+						that.resIts = await that.GetDevSenParamApi()
+					}
+					resolve(that.resIts)
+				})
+			},
+			GetDevSenParamApi(){
+				return new Promise((resolve) => {
+					setTimeout(async() => {
+						DevSenParam(this.pages2).then(res=>{
+							resolve(res)
+						})
+					},500)
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import '../../assets/css/equipmentManagement/equipment.scss';
+</style>

+ 1473 - 0
src/views/equipmentManagement/abandonDeviceManagement.vue

@@ -0,0 +1,1473 @@
+<!-- abandonDeviceManagement主机管理 -->
+<template>
+	<div class="management">
+		<div class="management-T">
+			<div class="management-TL">
+				<Breadcrumb class="bre"></Breadcrumb>
+				<div class="management-searchs">
+					<!-- <inputs @inputs="inputserValue" :inputShow="true" inputPlace="请输入SN/名称查询"></inputs>
+					<div class="management-tit-mai1-btn">
+						<el-button type="danger" icon="el-icon-search">查询</el-button>
+					</div> -->
+				</div>
+			</div>
+			<div class="management-TR">
+				<div class="management-searchsMai">
+					<el-button type="primary" icon="el-icon-notebook-2" @click="instructionse()">说明</el-button>
+					<el-button type="danger" v-permission="'AbandonDevice:Add'" icon="el-icon-plus"
+						@click="SetNew()">新增</el-button>
+				</div>
+			</div>
+		</div>
+		<div class="management-B">
+			<div class="management-B-Nav">
+				<div class="management-B-Navlist-mai">
+					<div class="management-B-Navlist-tt">
+						<div class="management-B-Navlist-tt-pir">
+							<i class="el-icon-search"></i>
+							<el-input placeholder="搜索名称、SN、物联网" v-model="pages.T_name" @input="inputser(pages.T_name)">
+							</el-input>
+						</div>
+					</div>
+				</div>
+				<div class="management-B-Navlist" @scroll="scroll" v-if="NavList.length != 0">
+					<div :class="navNum === index ? 'management-B-Navlist-mai1' : 'management-B-Navlist-mai'"
+						v-for="item, index in NavList" :key="index" @click="navNumclick(index, item)">
+						<div class="management-B-Navlist-mai-txt">
+							<div class="management-B-Navlist-mai-txt0">
+								<i class="el-icon-folder-opened" style="font-size: 20px;"></i>
+							</div>
+							<div class="management-B-Navlist-mai-txt1" :title="item.T_devName">
+								{{ item.T_devName }}
+							</div>
+						</div>
+						<div class="management-B-Navlist-mai-ico">
+							<i class="el-icon-arrow-right"></i>
+						</div>
+					</div>
+				</div>
+				<div v-else style="color: #ccc;font-size: 12px;text-align: center;margin-top: 100px;">
+					<i class="el-icon-search" style="font-size:40px;margin-bottom: 10px;"></i>
+					<div>未查询到数据</div>
+				</div>
+			</div>
+			<div class="management-B-Con">
+				<div v-if="NavList.length == 0">
+					<el-empty description="暂无可展示内容,请选择设备再查看"></el-empty>
+				</div>
+				<div style="padding: 20px;" v-else>
+					<div class="manage-grid">
+						<div class="manage-grid-title">主机信息</div>
+						<div class="manage-grid-mai">
+							<div class="manage-grid-mai-gr" :title="'主机名:' + descrData.T_devName">
+								<div class="manage-grid-mai-grL">
+									主机名:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_devName }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'SN:' + descrData.T_sn">
+								<div class="manage-grid-mai-grL">
+									SN:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_sn }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'主机型号:' + descrData.T_model">
+								<div class="manage-grid-mai-grL">
+									主机型号:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_model }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'主机品名:' + descrData.T_ProductTypeName">
+								<div class="manage-grid-mai-grL">
+									主机品名:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_ProductTypeName }}
+								</div>
+							</div>
+
+							<div class="manage-grid-mai-gr">
+								<div class="manage-grid-mai-grL">
+									连接状态:
+								</div>
+								<div class="manage-grid-mai-grR">
+									<el-tag size="small"
+										:type="descrData.T_online == 0 ? 'danger' : descrData.T_online == 1 ? '' : descrData.T_online == 2 ? 'danger' : 'danger'">
+										{{ descrData.T_online == 0 ? '无网络' : descrData.T_online == 1 ? '在线' : descrData.T_online == 2 ? '离线' : '未知' }}
+									</el-tag>
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr">
+								<div class="manage-grid-mai-grL">
+									备用网络:
+								</div>
+								<div class="manage-grid-mai-grR">
+									<el-tag size="small"
+										:type="descrData.T_online_s == 0 ? 'danger' : descrData.T_online_s == 1 ? '' : descrData.T_online_s == 2 ? 'danger' : 'danger'">
+										{{ descrData.T_online_s == 0 ? '未启用' : descrData.T_online_s == 1 ? '在线' : descrData.T_online_s == 2 ? '离线' : '未知' }}
+									</el-tag>
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr">
+								<div class="manage-grid-mai-grL">
+									监控状态:
+								</div>
+								<div class="manage-grid-mai-grR">
+									<el-tag size="small"
+										:type="descrData.T_monitor == 0 ? 'danger' : descrData.T_monitor == 1 ? '' : 'danger'">
+										{{ descrData.T_monitor == 0 ? '未监控' : descrData.T_monitor == 1 ? '监控中' : '未知' }}
+									</el-tag>
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr">
+								<div class="manage-grid-mai-grL">
+									定位:
+								</div>
+								<div class="manage-grid-mai-grR">
+									<el-tag size="small" type="danger" v-if="descrData.T_Site == ''">未启用</el-tag>
+									<div style="display: flex;align-items: center;" v-else>
+										<div
+											style="width: 30px;height: 30px;overflow: hidden;display: flex;justify-content: flex-start;">
+											<img src="@/assets/img/bdMap.png"
+												style="width: auto;height:100%;object-fit: contain;">
+										</div>
+										<div style="color: #0099cc;font-weight: bold;">BDS</div>
+									</div>
+								</div>
+							</div>
+
+							<div class="manage-grid-mai-gr" :title="'信号强度:' + descrData.T_rssi">
+								<div class="manage-grid-mai-grL">
+									信号强度:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_rssi }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'电量:' + descrData.T_Dattery">
+								<div class="manage-grid-mai-grL">
+									电量:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_Dattery }}%
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'软件版本:' + descrData.T_sver">
+								<div class="manage-grid-mai-grL">
+									软件版本:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_sver }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'硬件版本:' + descrData.T_hver">
+								<div class="manage-grid-mai-grL">
+									硬件版本:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_hver }}
+								</div>
+							</div>
+
+							<div class="manage-grid-mai-gr">
+								<div class="manage-grid-mai-grL">
+									温度:
+								</div>
+								<div class="manage-grid-mai-grR">
+									<el-tag size="small" :type="descrData.T_ist == 2 ? 'danger' : ''">
+										{{ descrData.T_ist == 2 ? '关闭' : '开启' }}
+									</el-tag>
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr">
+								<div class="manage-grid-mai-grL">
+									湿度:
+								</div>
+								<div class="manage-grid-mai-grR">
+									<el-tag size="small" :type="descrData.T_ish == 2 ? 'danger' : ''">
+										{{ descrData.T_ish == 2 ? '关闭' : '开启' }}
+									</el-tag>
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'模组imei:' + descrData.T_imei">
+								<div class="manage-grid-mai-grL">
+									模组imei:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_imei }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'sim卡号:' + descrData.T_iccid">
+								<div class="manage-grid-mai-grL">
+									sim卡号:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_iccid }}
+								</div>
+							</div>
+
+							<div class="manage-grid-mai-gr" :title="'校准时间:' + descrData.T_CalibrationTime">
+								<div class="manage-grid-mai-grL">
+									校准时间:
+								</div>
+								<div class="manage-grid-mai-grR"
+									:title="setStyle(descrData.T_CalibrationTime) == 'red' ? '临近3个月到期' : ''"
+									:style="{ color: setStyle(descrData.T_CalibrationTime) }">
+									{{ descrData.T_CalibrationTime | setTime(descrData.T_CalibrationTime) }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'验证时间:' + descrData.T_VerifyTime">
+								<div class="manage-grid-mai-grL">
+									验证时间:
+								</div>
+								<div class="manage-grid-mai-grR"
+									:title="setStyle(descrData.T_VerifyTime) == 'red' ? '临近3个月到期' : ''"
+									:style="{ color: setStyle(descrData.T_VerifyTime) }">
+									{{ descrData.T_VerifyTime | setTime(descrData.T_VerifyTime) }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'巡检时间:' + descrData.T_PatrolTime">
+								<div class="manage-grid-mai-grL">
+									巡检时间:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_PatrolTime | setTime(descrData.T_PatrolTime) }}
+								</div>
+							</div>
+							<div class="manage-grid-mai-gr" :title="'添加时间:' + descrData.CreateTime">
+								<div class="manage-grid-mai-grL">
+									添加时间:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.CreateTime | setTime(descrData.CreateTime) }}
+								</div>
+							</div>
+
+                            <div class="manage-grid-mai-gr" :title="'弃用时间:' + descrData.CreateTime">
+								<div class="manage-grid-mai-grL">
+									弃用时间:
+								</div>
+								<div class="manage-grid-mai-grR">
+									{{ descrData.T_abandonTime}}
+								</div>
+							</div>
+						</div>
+					</div>
+					<el-row style="margin-top: 50px;">
+						<el-button v-permission="'AbandonDevice:Setup'" round @click="showHost">主机设置</el-button>
+						<el-button v-permission="'AbandonDevice:Log'" type="primary" @click="showLog" round>主机日志</el-button>
+						<el-button v-permission="'AbandonDevice:RestartShutdown'" type="success" @click="setoff()"
+							round>重启/关机</el-button>
+						<el-button v-permission="'AbandonDevice:UpgradedVersion'" type="info" @click="showVersion"
+							round>版本升级</el-button>
+						<el-button v-permission="'AbandonDevice:StopRecord'"
+							:type="this.descrData.T_monitor == 1 ? 'warning' : 'primary'" @click="DevTask" round>
+							{{ this.descrData.T_monitor == 1 ? '停止记录(已开启)' : '开始记录(已停止)' }}</el-button>
+						<el-button type="primary" v-permission="'AbandonDevice:SyncParameter'" @click="showArg" round>同步参数</el-button>
+
+					</el-row>
+					<el-table :data="tableData" border style="width: 100%;margin-top: 50px;">
+						<template slot="empty">
+							<noData></noData>
+						</template>
+						<el-table-column prop="T_name" label="传感器名称" width="180" :show-overflow-tooltip="true">
+						</el-table-column>
+						<el-table-column label="温度 ℃" v-if="T_ist == 1" width="180" :show-overflow-tooltip="true">
+							<template slot-scope="scope">
+								{{ scope.row.T_DeviceSensorData.T_t }}
+							</template>
+						</el-table-column>
+						<el-table-column label="温度阈值 ℃" v-if="T_ist == 1" width="180" :show-overflow-tooltip="true">
+							<template slot-scope="scope">
+								{{ scope.row.T_DeviceSensorData.T_tl }} - {{ scope.row.T_DeviceSensorData.T_tu }}
+							</template>
+						</el-table-column>
+						<el-table-column label="湿度 %" v-if="T_ish == 1" width="180" :show-overflow-tooltip="true">
+							<template slot-scope="scope">
+								{{ scope.row.T_DeviceSensorData.T_rh }}
+							</template>
+						</el-table-column>
+						<el-table-column label="湿度阈值 %" v-if="T_ish == 1" :show-overflow-tooltip="true">
+							<template slot-scope="scope">
+								{{ scope.row.T_DeviceSensorData.T_rhl }} - {{ scope.row.T_DeviceSensorData.T_rhu }}
+							</template>
+						</el-table-column>
+						<el-table-column prop="address" label="时间" :show-overflow-tooltip="true">
+							<template slot-scope="scope">
+								{{ scope.row.T_DeviceSensorData.T_time }}
+							</template>
+						</el-table-column>
+						<el-table-column label="操作">
+							<template slot-scope="scope">
+								<el-button size="mini" v-permission="'AbandonDeviceSensor:Setup'"
+									@click="handleEdit(scope.row)">设置</el-button>
+							</template>
+						</el-table-column>
+					</el-table>
+				</div>
+			</div>
+		</div>
+		<el-dialog title="新增" :visible.sync="dialogShowinstr1" width="40%" :append-to-body="true">
+			<div class="">
+				<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+					<el-form-item label="主机SN" prop="T_sn">
+						<el-input v-model="ruleForm.T_sn"></el-input>
+					</el-form-item>
+					<el-form-item>
+						<el-button type="primary" @click="submitForm('ruleForm')">新增</el-button>
+						<el-button @click="dialogShowinstr1 = false">取消</el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+		</el-dialog>
+		<el-dialog title="说明" :visible.sync="dialogShowinstr" width="40%" :append-to-body="true">
+			<!--  -->
+			<div class="shuoM">
+				<div class="shuoM1">设备管理里面 温湿度 不是实时数据</div>
+				<div class="shuoM2">
+					<h3 style="padding: 10px 0;">连接状态:</h3>
+					<ul>
+						<li>通讯正常</li>
+						<li>设备已关机</li>
+						<li>设备无网络(设备信号弱,或无信号)</li>
+					</ul>
+				</div>
+				<div class="shuoM2">
+					<h3 style="padding: 10px 0;">[4G]标签:</h3>
+					<ul>
+						<li><span style="color: #606266">[4G]</span> 不显示,代表没有4G备用网络</li>
+						<li><span style="color: #00FF00">[4G]</span> 绿色,连接正常</li>
+						<li><span style="color: #d2d2d2">[4G]</span> 灰色,连接断开</li>
+						<li><span style="color: #ff7d7d">[4G]</span> 红色,连接异常</li>
+					</ul>
+				</div>
+				<div class="shuoM2">
+					<h3 style="padding: 10px 0;">监控状态:</h3>
+					<ul>
+						<li>监控状态</li>
+						<li>未监控</li>
+						<li>未知状态(由于设备异常断开网络,请以设备实际显示为准)</li>
+					</ul>
+				</div>
+				<div class="shuoM2">
+					<h3 style="padding: 10px 0;">弃用设备:</h3>
+					<ul>
+						<li>本设备所有探头 在数据展示中将会隐藏,可以通过指定SN搜索到历史数据</li>
+					</ul>
+				</div>
+			</div>
+		</el-dialog>
+
+		<el-dialog title="版本升级" :visible.sync="dialogVisible3" :append-to-body="true">
+			<el-table :data="versList" style="width: 100%">
+				<template slot="empty">
+					<noData></noData>
+				</template>
+				<el-table-column prop="T_version" width="100" label="版本" :show-overflow-tooltip="true">
+				</el-table-column>
+				<el-table-column prop="T_file" label="文件" :show-overflow-tooltip="true"></el-table-column>
+				<el-table-column prop="CreateTime" label="时间" :show-overflow-tooltip="true"></el-table-column>
+				<el-table-column label="操作">
+					<template slot-scope="scope">
+						<el-button type="primary" v-permission="'AbandonDevice:ProductUpgrade_list'" icon="el-icon-download"
+							size="small" @click="setup(scope.row)">立即升级
+						</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<div style="margin-top: 20px;">
+				<el-pagination @current-change="vCurrentChange" :current-page="versForm.page" :page-size="versForm.page_z"
+					layout="total, prev, pager, next, jumper" :total="versTotal">
+				</el-pagination>
+			</div>
+		</el-dialog>
+		<el-dialog title="主机日志" :visible.sync="dialogVisible2" :append-to-body="true">
+			<el-table :data="LogList" style="width: 100%">
+				<template slot="empty">
+					<noData></noData>
+				</template>
+				<el-table-column prop="Logs_Txt" label="内容" :show-overflow-tooltip="true"></el-table-column>
+				<el-table-column prop="CreateTime" label="时间" :show-overflow-tooltip="true"></el-table-column>
+			</el-table>
+			<div style="margin-top: 20px;">
+				<el-pagination layout="prev, pager, next" :total="logTotal" @size-change="handleSizeChange"
+					@current-change="handleCurrentChange">
+				</el-pagination>
+			</div>
+		</el-dialog>
+		<el-dialog title="主机设置" :visible.sync="dialogVisible" :append-to-body="true" width="880px">
+			<el-tabs v-model="activeName" @tab-click="handleClick" ref="tabs">
+				<el-tab-pane label="主机参数" name="first">
+					<div style="height: 400px;overflow-y: auto;">
+						<el-form :inline="true" :model="Hostline" label-width="180px" class="demo-form-inline">
+							<el-form-item label="Sn">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_sn" disabled placeholder="请输入Sn"></el-input>
+									<i class="el-icon-question" slot="reference" style="margin-left:10px;opacity: 0;"></i>
+								</div>
+							</el-form-item>
+							<el-form-item label="设备名称">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_name" placeholder="请输入设备名称"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="设备名称在0-20个字节">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-divider></el-divider>
+							<el-form-item label="数据保存间隔">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_saveT" placeholder="请输入数据保存间隔"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),60~3600,默认: 60 ">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="轮播间隔"><!-- 采集器采样率 -->
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_scan" placeholder="请输入轮播间隔"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),1~240">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="传感器数量">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_snum" placeholder="请输入传感器数量"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="传感器数量">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="节能模式">
+								<div style="display: flex;align-items: center;">
+									<el-switch v-model="Hostline.T_dormancy" :inactive-value="0"
+										:active-value="1"></el-switch>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="开启后,实时性会下降,待机时间会增加,仅限于长途运输是开启">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-divider></el-divider>
+
+							<el-form-item label="超限报警触发间隔">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_overA" placeholder="请输入超限报警触发间隔"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),60~600,默认: 60 ">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="传感器掉线报警触发间隔">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_lostA" placeholder="请输入传感器掉线报警触发间隔"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),0,60~600,为0时只触发一次 默认: 60">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="断电报警触发间隔">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_outA" placeholder="请输入断电报警触发间隔"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),0,60~600,为0时只触发一次 默认: 60">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="电池电量下限">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_bat" placeholder="请输入电池电量下限"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(%),0~30,默认20">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-divider></el-divider>
+							<el-form-item label="超限预警触发间隔">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_warn" placeholder="请输入超限预警触发间隔"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),0,60~600,为0时只触发一次 默认: 60">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<el-form-item label="超限预警延时">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_warnD" placeholder="请输入超限预警延时"></el-input>
+									<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+										content="单位(秒),0~600,默认0">
+										<i class="el-icon-question" slot="reference"
+											style="margin-left:10px;cursor: pointer;"></i>
+									</el-popover>
+								</div>
+							</el-form-item>
+							<br />
+							<el-divider></el-divider>
+							<el-form-item label="打印机名称">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_btname" placeholder="请输入打印机名称"></el-input>
+									<i class="el-icon-question" slot="reference" style="margin-left:10px;opacity: 0;"></i>
+								</div>
+							</el-form-item>
+							<el-form-item label="打印机服务号">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_btsid" placeholder="请输入打印机服务号"></el-input>
+									<i class="el-icon-question" slot="reference" style="margin-left:10px;opacity: 0;"></i>
+								</div>
+							</el-form-item>
+							<el-form-item label="蓝牙特征码">
+								<div style="display: flex;align-items: center;">
+									<el-input v-model="Hostline.T_btchar" placeholder="请输入蓝牙特征码"></el-input>
+									<i class="el-icon-question" slot="reference" style="margin-left:10px;opacity: 0;"></i>
+								</div>
+							</el-form-item>
+						</el-form>
+					</div>
+					<div class="diapir-nav1-2">
+						<div style="display: flex;justify-content: space-between;width: 100%;">
+							<div>
+								<el-button type="primary" v-permission="'AbandonDevice:ParameterList'"
+									@click="onSubpast">主机参数记录</el-button>
+							</div>
+							<div v-permission="'AbandonDeviceSensor:ParameterPu'">
+								<el-button @click="dialogVisible = false">取消</el-button>
+								<el-button type="primary" @click="onSubmit1">立即配置</el-button>
+							</div>
+						</div>
+					</div>
+				</el-tab-pane>
+				<el-tab-pane label="主机配置" name="second">
+					<el-form ref="Hostform" :model="Hostform" label-width="80px" :inline="true">
+						<el-form-item label="验证时间">
+							<el-date-picker v-model="Hostform.T_VerifyTime" type="date" value-format="yyyy-MM-dd"
+								placeholder="选择日期">
+							</el-date-picker>
+						</el-form-item>
+						<el-form-item label="校准时间">
+							<el-date-picker v-model="Hostform.T_CalibrationTime" type="date" value-format="yyyy-MM-dd"
+								placeholder="选择日期">
+							</el-date-picker>
+						</el-form-item>
+						<el-form-item label="巡检时间">
+							<el-date-picker v-model="Hostform.T_PatrolTime" type="date" value-format="yyyy-MM-dd"
+								placeholder="选择日期">
+							</el-date-picker>
+						</el-form-item>
+						<br />
+						<el-form-item label="温度显示">
+							<el-switch v-model="Hostform.T_ist" :inactive-value="2" :active-value="1"></el-switch>
+						</el-form-item>
+						<el-form-item label="湿度显示">
+							<el-switch v-model="Hostform.T_ish" :inactive-value="2" :active-value="1"></el-switch>
+						</el-form-item>
+						<br />
+						<el-form-item label="是否弃用">
+							<el-radio-group v-model="Hostform.T_State">
+								<el-radio :label="0">弃用设备</el-radio>
+								<el-radio :label="1">开启设备</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-form>
+					<div class="diapir-nav1-2" v-permission="'AbandonDevice:Pu'">
+						<el-button @click="dialogVisible = false">取消</el-button>
+						<el-button type="primary" @click="subHost">立即配置</el-button>
+					</div>
+				</el-tab-pane>
+			</el-tabs>
+			<el-dialog width="700px" title="设备参数记录" :visible.sync="dialogVisibleinner" append-to-body>
+				<div style="display: flex;align-items: center;padding-bottom: 10px;">
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #909399;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">等待执行</p>
+					</div>
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #67c23a;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">修改成功</p>
+					</div>
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #f56c6c;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">修改失败</p>
+					</div>
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #e6a23c;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">覆盖参数</p>
+					</div>
+				</div>
+				<div style="height: 500px;overflow-y: auto;padding-right: 20px;">
+					<div v-if="pastList == null">
+						<noData></noData>
+					</div>
+					<div v-else>
+						<el-alert :title="item.T_text" style="margin-top: 10px ;" :closable="false"
+							:type="item.T_SendState == 0 ? 'info' : item.T_SendState == 1 ? 'success' : item.T_SendState == 2 ? 'error' : 'warning'"
+							show-icon v-for="item, index in pastList" :key="index">
+						</el-alert>
+					</div>
+				</div>
+			</el-dialog>
+		</el-dialog>
+
+		<el-dialog title="设备设置" :visible.sync="dialogVisible4" :append-to-body="true">
+			<el-tabs v-model="activeName1" @tab-click="handleClick" ref="tabs1">
+				<el-tab-pane label="传感器参数" name="firsts">
+					<el-form ref="form1" :model="diaForm1" label-width="100px" style="height: 500px;overflow-y: auto;">
+						<el-form-item label="设备名称">
+							<div style="display: flex;align-items: center;">
+								<div style="display:flex;align-items: center;">
+									<el-input v-model="diaForm1.T_devName" disabled placeholder="请输入设备名称"
+										style="width: 70%;"></el-input>
+									<el-input v-model="diaForm1.T_sn" disabled
+										style="width: 50%;margin-left:10px;"></el-input>
+								</div>
+								<i class="el-icon-question" slot="reference" style="margin-left:10px;opacity: 0;"></i>
+							</div>
+						</el-form-item>
+						<el-form-item label="传感器名称">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm1.T_name" placeholder="请输入传感器名称" style="width: 70%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="设备名称在0-20个字节">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<!-- <el-form-item label="传感器采样率">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm1.T_speed" placeholder="请输入传感器采样率" style="width: 70%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="秒(1~240),默认: 15 ">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item> -->
+						<br />
+						<el-form-item label="温度范围">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm1.T_Tlower" placeholder="请输入温度范围下限"
+									style="width: 20%;"></el-input>
+								<span style="margin: 0 10px;">-</span>
+								<el-input v-model="diaForm1.T_Tupper" placeholder="请输入温度范围上限"
+									style="width: 20%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="-40.0 ~ 80.0">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="湿度范围">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm1.T_RHlower" placeholder="请输入湿度范围下限"
+									style="width: 20%;"></el-input>
+								<span style="margin: 0 10px;">-</span>
+								<el-input v-model="diaForm1.T_RHupper" placeholder="请输入湿度范围上限"
+									style="width: 20%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="-40.0 ~ 80.0">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+
+						<el-form-item label="预警">
+							<div style="display: flex;align-items: center;">
+								<el-switch v-model="diaForm1.T_enprel" :inactive-value="0" :active-value="1"></el-switch>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="推送预警消息,设为 空库后 不推送预警消息">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="温度范围">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm1.T_tprel" placeholder="请输入温度范围下限" style="width: 20%;"></el-input>
+								<span style="margin: 0 10px;">-</span>
+								<el-input v-model="diaForm1.T_tpreu" placeholder="请输入温度范围上限" style="width: 20%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="0.0 ~ 100.0">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="湿度范围">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm1.T_hprel" placeholder="请输入湿度范围下限" style="width: 20%;"></el-input>
+								<span style="margin: 0 10px;">-</span>
+								<el-input v-model="diaForm1.T_hpreu" placeholder="请输入湿度范围上限" style="width: 20%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="0.0 ~ 100.0">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="预警记录数据">
+							<div style="display: flex;align-items: center;">
+								<el-switch v-model="diaForm1.T_enprelnote" :inactive-value="0"
+									:active-value="1"></el-switch>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="关闭后,只推送报警记录,不记录数据">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="启用">
+							<div style="display: flex;align-items: center;">
+								<el-switch v-model="diaForm1.T_en" :inactive-value="0" :active-value="1"></el-switch>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="功能(实时、记录、报警、预警)">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="空库">
+							<div style="display: flex;align-items: center;">
+								<el-switch v-model="diaForm1.T_free" :inactive-value="0" :active-value="1"></el-switch>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="1.启用(正常 实时、记录, 不 报警、预警)2.关闭(正常 实时、记录、报警、预警)">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+					</el-form>
+					<div class="diapir-nav1-2">
+						<div style="display: flex;justify-content: space-between;width: 100%;">
+							<div>
+								<el-button type="primary" v-permission="'AbandonDeviceSensor:ParameterList'"
+									@click="onSubpast1">设备参数记录</el-button>
+							</div>
+							<div v-permission="'AbandonDeviceSensor:ParameterPu'">
+								<el-button @click="dialogVisible4 = false">取消</el-button>
+								<el-button type="primary" @click="Submit1">立即提交</el-button>
+							</div>
+						</div>
+					</div>
+				</el-tab-pane>
+				<el-tab-pane label="传感器配置" name="seconds">
+					<el-form ref="form2" :model="diaForm2" label-width="100px">
+						<el-form-item label="实时数据排序">
+							<div style="display: flex;align-items: center;">
+								<el-input v-model="diaForm2.T_sort" style="width: 70%;"></el-input>
+								<el-popover placement="top-start" title="提示" width="200" trigger="hover"
+									content="越小越靠前,可以为负数">
+									<i class="el-icon-question" slot="reference"
+										style="margin-left:10px;cursor: pointer;"></i>
+								</el-popover>
+							</div>
+						</el-form-item>
+						<el-form-item label="3D视图订阅">
+							<el-input v-model="diaForm2.T_3dview" style="width: 70%;"></el-input>
+						</el-form-item>
+						<el-form-item label="类型选择">
+							<el-radio-group v-model="diaForm2.T_type">
+								<el-radio :label="0" style="line-height: 30px;">默认</el-radio>
+								<el-radio :label="item.Id" v-for="(item, index) in RadioData" :key="index"
+									style="line-height: 30px;">{{ item.T_name }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+						<el-form-item label="屏蔽数据展示">
+							<el-radio-group v-model="diaForm2.T_datashow">
+								<el-radio :label="0">屏蔽展示</el-radio>
+								<el-radio :label="1">正常展示</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-form>
+					<div class="diapir-nav1-2" v-permission="'AbandonDeviceSensor:Pu'">
+						<el-button @click="dialogVisible4 = false">取消</el-button>
+						<el-button type="primary" @click="Submit2">立即提交</el-button>
+					</div>
+				</el-tab-pane>
+			</el-tabs>
+			<el-dialog width="700px" title="设备参数记录" :visible.sync="dialogVisible4inner" append-to-body>
+				<div style="display: flex;align-items: center;padding-bottom: 10px;">
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #909399;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">等待执行</p>
+					</div>
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #67c23a;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">修改成功</p>
+					</div>
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #f56c6c;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">修改失败</p>
+					</div>
+					<div style="display: flex;align-items: center;margin-right: 10px;">
+						<span
+							style="display: block;width: 15px;height: 15px;background: #e6a23c;border-radius: 50%;"></span>
+						<p style="font-size: 12px;margin-left: 5px;">覆盖参数</p>
+					</div>
+				</div>
+                <div style="height: 500px;overflow-y: auto;padding-right: 20px;">
+					<div v-if="sensorList == null">
+						<noData></noData>
+					</div>
+					<el-alert :title="item.T_text" style="margin-top: 10px ;" :closable="false"
+						:type="item.T_SendState == 0 ? 'info' : item.T_SendState == 1 ? 'success' : item.T_SendState == 2 ? 'error' : 'warning'"
+						show-icon v-for="item, index in sensorList" :key="index">
+					</el-alert>
+				</div>
+			</el-dialog>
+		</el-dialog>
+	</div>
+</template>
+<script>
+import { pertabs } from "@/permission.js"
+import {
+	DevList,
+	DevSenList,
+	DevAdd,
+	DevParameter_List,
+	DevParameter_Pu,
+	DevEdit,
+	DevTask,
+	DevSenParPu,
+	DevParameter_Get,
+	DevRes,
+	DevLog,
+	ProUpList,
+	DevUpgrade,
+	DevParGet,
+	DevParParPu,
+	DevSenEdit,
+	DevSenParList,
+	DevGet,
+	DevListAll,
+	DevParameSync
+} from "../../api/equipmentManagement/management.js"
+export default {
+	data() {
+		return {
+			RadioData: [],
+			T_ist: 1,
+			T_ish: 1,
+			times: null,
+			versForm: {
+				T_model: '',
+				page: 1,
+				page_z: 5
+			},
+			versList: [],
+			versTotal: 0,
+			LogList: [],
+			logTotal: 0,
+			Page_size: 0,
+			Hostform: { //主机配置提交参数
+				T_sn: '',
+				T_State: '',
+				T_ist: '',
+				T_ish: '',
+				T_VerifyTime: '',
+				T_CalibrationTime: '',
+				T_PatrolTime: '',
+			},
+			LogForm: {
+				T_sn: '',
+				page: 1,
+				page_z: 10
+			},
+			Hostline: {}, //主机参数提交
+			pastList: [],
+			sensorList: [],
+
+			ShowTishi: '',
+			diapirForm: {},
+			diapirRec: [],
+			pages: {
+				T_name: '',
+				page: 1,
+				page_z: 30,
+                T_abandon:1
+			},
+			pages1: {
+				T_sn: '',
+				T_l_p: '',
+				T_give: ''
+			},
+			pages2: {
+				T_id: '',
+				T_sn: '', //设备SN
+			},
+			diaForm1: {},
+			diaForm2: {
+				T_id: null,
+				T_sn: null,
+				T_sort: null,
+				T_type: 0,
+				T_datashow: null,
+				T_3dview: null,
+			},
+			loadTable: false,
+			NavList: [],
+			descrData: {},
+
+			descrDataPir: [],
+			radio: '1',
+			tableData: [], //传感器列表
+			dialogVisibleinner: false,
+			dialogShowinstr: false, //说明弹窗
+			dialogShowinstr1: false, //新增弹窗
+			dialogVisible: false, //设备管理弹窗
+			dialogVisible2: false, //系统日志弹窗
+			dialogVisible3: false,
+			dialogVisible4: false,
+			dialogVisible4inner: false,
+			activeName1: 'firsts', //传感器管理默认显示
+			activeName: 'first', //系统日志默认显示
+			navNum: 0,
+			ruleForm: { //新增
+				T_sn: '',
+			},
+			rules: {
+				T_sn: [{
+					required: true,
+					message: '请输入主机SN',
+					trigger: 'blur'
+				},],
+			},
+			form: {
+				name: '',
+				region: '',
+				date1: '',
+				date2: '',
+				delivery: false,
+				type: [],
+				resource: '',
+				desc: ''
+			},
+		}
+	},
+	filters: {
+		setTime(time) {
+			////console.log('筛选时间',time)
+			if (time != undefined) return time.split(' ')[0]
+		},
+
+	},
+	beforeDestroy() {
+		clearInterval(this.times)
+	},
+	mounted() {
+		this.GetDevListApi()
+		this.times = setInterval(() => {
+			if (this.NavList.length != 0) {
+				this.getDevGetApi(this.descrData)
+				this.GetDevSenListApi(this.descrData)
+			}
+		}, 3000)
+	},
+	methods: {
+		showArg() {
+			this.$confirm('是否同步参数?', '同步参数', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				DevParameSync({T_sn:this.descrData.T_sn}).then(res=>{
+					if (res.data.Code==200) {
+						this.$message.success('ok,同步成功');
+					}
+				})
+				
+			}).catch(() => {
+				this.$message.info('已取消同步参数');
+			});
+			
+		},
+		setStyle(time) {
+			const isTime = new Date().getTime()
+			const toTime = new Date(time).getTime()
+			const numTime = isTime - toTime
+			if (toTime - isTime <= 90 * 86399000) {//小于3个月提示临近3月
+				return 'red'
+			} else {
+				return '#000'
+			}
+		},
+		getDevListAllApi() {
+			DevListAll({}).then(res => {
+				if (res.data.Code == 200) {
+					this.RadioData = res.data.Data.Data
+					////console.log('----',res)
+				}
+			})
+		},
+		setup(item) {
+			////console.log(item, this.descrData)
+			this.$confirm('此操作将升级更新版本, 是否立即升级更新?', '更新', {
+				confirmButtonText: '立即更新',
+				cancelButtonText: '放弃更新',
+				type: 'warning',
+				center: true
+			}).then(() => {
+				DevUpgrade({
+					T_sn: this.descrData.T_sn,
+					T_version: item.T_version,
+					T_file: item.T_file
+				}).then(res => {
+					if (res.data.Code === 200) {
+						this.$message.success('操作完成,更新成功')
+					}
+				})
+			}).catch(() => { });
+		},
+		showVersion() {
+			this.versForm.page = 1
+			////console.log(this.versForm)
+			this.dialogVisible3 = true
+
+			this.versForm.T_model = this.descrData.T_model
+			this.getProUpApi()
+		},
+		getProUpApi() {
+			ProUpList(this.versForm).then(res => {
+				if (res.data.Code == 200) {
+					this.versList = res.data.Data.Data
+					this.versTotal = res.data.Data.Num
+				}
+			})
+		},
+
+
+		vCurrentChange(val) {
+			////console.log(`当前页: ${val}`);
+			this.versForm.page = val
+			this.getProUpApi()
+		},
+
+
+		handleSizeChange(val) {
+			////console.log(`每页 ${val} 条`);
+			this.LogForm.page_z = val
+			this.getDevLogApi()
+		},
+		handleCurrentChange(val) {
+			////console.log(`当前页: ${val}`);
+			this.LogForm.page = val
+			this.getDevLogApi()
+		},
+		showLog() {
+			////console.log('主机日志',this.LogForm)
+			this.LogForm.page = 1
+			this.logTotal = 1
+			this.dialogVisible2 = true
+			this.LogForm.T_sn = this.descrData.T_sn
+			this.getDevLogApi()
+		},
+		getDevLogApi() {
+			DevLog(this.LogForm).then(res => {
+				if (res.data.Code == 200) {
+					this.LogList = res.data.Data.DeviceLogs
+					this.logTotal = res.data.Data.Num
+				}
+			})
+		},
+		DevTask() { //远程启停
+			var that = this
+			////console.log('远程启停', this.descrData)
+			if (this.descrData.T_monitor === 2) {
+				this.$message.error('网络不佳')
+				return
+			}
+			if (this.descrData.T_online == 1 || this.descrData.T_online_s == 1) {
+				this.$confirm(this.descrData.T_monitor == 1 ? '停止记录操作,是否继续?' : '开始记录操作,是否继续?', '提示', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					type: 'warning'
+				}).then(() => {
+					DevTask({
+						T_sn: this.descrData.T_sn,
+						T_task: this.descrData.T_monitor === 1 ? 'stop' : 'start'
+					}).then(res => {
+						if (res.data.Code === 200 && res.data.Msg === "ok!") {
+							that.$message.success('远程启停,设置成功')
+							this.pages.page = 1
+							this.NavList = []
+							this.GetDevListApi()
+						}
+					})
+				}).catch(() => { });
+			} else {
+				this.$message.error('设备离线')
+			}
+		},
+		onSubpast() { //历史数据
+			DevParameter_List({
+				T_sn: this.Hostform.T_sn
+			}).then(res => {
+				////console.log('历史数据', this.Hostform.T_sn, res)
+				if (res.data.Code === 200) {
+					this.pastList = res.data.Data
+					this.dialogVisibleinner = true
+				}
+			})
+		},
+		onSubpast1() { //
+			////console.log('****',this.pages2)
+			DevSenParList(this.pages2).then(res => {
+				////console.log('历史数据15151',res)
+				if (res.data.Code === 200) {
+					this.dialogVisible4inner = true
+					this.sensorList = res.data.Data
+				}
+			})
+		},
+		onSubmit1() {
+			DevParameter_Pu(this.Hostline).then(res => {
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					this.$message.success('传感器参数设置成功')
+					this.dialogVisible = false
+					this.pages.page = 1
+					this.NavList = []
+					this.GetDevListApi()
+				}
+			})
+		},
+		GetDevSenParameter_ListApi() {
+			DevParameter_Get({
+				T_sn: this.descrData.T_sn
+			}).then(res => {
+				////console.log('获取数据========8888', res)
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					this.Hostline = res.data.Data[0]
+					// this.diapirForm = res.data.Data[0]
+					// this.diapirRec = res.data.Data
+					// var arr = eval('(' + res.data.Data[0].T_chDecTotal + ')')
+					// this.diapirForm.T_chDecTotal = Object.values(arr)
+					// this.diapirForm.T_chDecTotal = JSON.parse(res.data.Data[0].T_chDecTotal)
+				} else {
+					this.ShowTishi = res.data.Msg
+				}
+			})
+		},
+		GetDevEditApi() { //主机设置>主机配置
+			var obj = { ...this.Hostform }
+			obj.T_CalibrationTime = obj.T_CalibrationTime + ' 00:00:00'
+			obj.T_PatrolTime = obj.T_PatrolTime + ' 00:00:00'
+			obj.T_VerifyTime = obj.T_VerifyTime + ' 00:00:00'
+			DevEdit(obj).then(res => {
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					this.$message.success('设置成功')
+					this.dialogVisible = false
+					this.pages.page = 1
+					this.NavList = []
+					this.GetDevListApi()
+				}
+			})
+		},
+		showHost() { //点击主机设置
+			var perData1 = pertabs('AbandonDevice:Parameter')
+			var perData2 = pertabs('AbandonDeviceSensor:Config')
+			if (perData1 != false || perData2 != false) {
+				this.dialogVisible = true
+			} else {
+				this.$message.error('无权查看')
+				return
+			}
+			this.$nextTick(() => {
+				if (perData1 == false) {//等于true,有权限
+					this.$refs.tabs.$children[0].$refs.tabs[0].style.display = 'none'
+					this.activeName = 'second'
+				}
+				if (perData2 == false) {//等于true,有权限
+					this.$refs.tabs.$children[0].$refs.tabs[1].style.display = 'none'
+					this.activeName = 'first'
+				}
+                console.log('传感器全选',perData1,perData2,this.$refs.tabs.$children[0].$refs)
+			})
+			this.Hostform.T_sn = this.descrData.T_sn
+			this.Hostform.T_State = this.descrData.T_State
+			this.Hostform.T_ist = this.descrData.T_ist
+			this.Hostform.T_ish = this.descrData.T_ish
+			this.Hostform.T_VerifyTime = this.descrData.T_VerifyTime
+			this.Hostform.T_CalibrationTime = this.descrData.T_CalibrationTime
+			this.Hostform.T_PatrolTime = this.descrData.T_PatrolTime
+			this.GetDevSenParameter_ListApi()
+		},
+		subHost() { //提交主机配置
+			this.GetDevEditApi()
+		},
+
+		scroll(e) {
+			let isBottom = e.target.scrollTop + e.target.clientHeight == e.target.scrollHeight
+			if (isBottom && this.pages.page < this.Page_size) { //true已经触底
+				let height = e.target.scrollTop
+				this.pages.page = this.pages.page + 1
+				this.GetDevListApi()
+				e.target.scrollTop = height
+			}
+			
+			
+		},
+		GetDevListApi() { //列表
+			DevList(this.pages).then(async (res) => {
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					if (res.data.Data.Device_lite != null) {
+						this.Page_size = res.data.Data.Page_size
+						this.NavList = [...this.NavList, ...res.data.Data.Device_lite]
+						this.GetDevSenListApi(res.data.Data.Device_lite[this.navNum])
+						this.getDevGetApi(res.data.Data.Device_lite[this.navNum])
+					} else {
+						this.NavList = []
+					}
+				}
+			})
+		},
+		GetDevSenListApi(obj) { //传感器列表
+			////console.log('=========>添加参数在进行', obj)
+			this.loadTable = true
+			DevSenList({
+				T_sn: obj.T_sn,
+				page: 1,
+				page_z: 999999
+			}).then(res => {
+				////console.log('传感器列表------------------->', res)
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					this.tableData = res.data.Data.Data
+					if (res.data.Data.Data != null) {
+						this.T_ish = res.data.Data.Data[0].T_DeviceSensorData.T_ish
+						this.T_ist = res.data.Data.Data[0].T_DeviceSensorData.T_ist
+					}
+				}
+				this.loadTable = false
+			})
+		},
+		async navNumclick(index, item) { //点击导航
+			this.navNum = index
+			this.descrData = item
+			console.log('点击',item)
+			this.GetDevSenListApi(item)
+			let res = await this.getDevGetApi(item)
+		},
+		getDevGetApi(obj) {
+			return new Promise(resolve => {
+				DevGet({ T_sn: obj.T_sn }).then(res => {
+					if (res.data.Code === 200) {
+						////console.log('大厅22ss ',res.data.Data.Data)
+						this.descrData = res.data.Data.Data
+					}
+					resolve(res)
+				})
+			})
+		},
+		inputser(e) { //搜索
+			this.navNum = 0
+			this.pages.T_name = e
+			this.pages.page = 1
+			this.NavList = []
+			this.GetDevListApi()
+		},
+
+
+		setoff() {
+			this.$confirm('此操作将关机或重启设备, 请选择操作', '提示', {
+				distinguishCancelAndClose: true,
+				confirmButtonText: '关机',
+				cancelButtonText: '重启设备',
+				type: 'warning',
+				center: true,
+			}).then(() => {
+				// ////console.log('关机')
+				this.setResDows(0)
+			}).catch((e) => {
+				if (e == 'cancel') {//close值是点击了X  cancel点击的取消
+					this.setResDows(1)
+				}
+			});
+		},
+		setResDows(bl) {
+			var that = this
+			DevRes({
+				T_sn: that.descrData.T_sn,
+				T_task: bl
+			}).then(res => {
+				if (res.data.Code == 200) {
+					if (bl == 0) {
+						that.$message.success('操作成功,关机')
+					} else {
+						that.$message.success('操作成功,重启')
+					}
+				}
+			})
+		},
+
+		handleEdit(item) { //点击设置按钮
+			var perData1 = pertabs('DeviceSensor:Parameter')
+			var perData2 = pertabs('DeviceSensor:Config')
+			if (perData1 != false || perData2 != false) {
+				this.dialogVisible4 = true
+			} else {
+				this.$message.error('无权查看')
+				return
+			}
+			this.$nextTick(() => {
+				if (perData1 == false) {//等于true,有权限
+					this.$refs.tabs1.$children[0].$refs.tabs[0].style.display = 'none'
+					this.activeName1 = 'seconds'
+				}
+				if (perData2 == false) {//等于true,有权限
+					this.$refs.tabs1.$children[0].$refs.tabs[1].style.display = 'none'
+					this.activeName1 = 'firsts'
+				}
+			})
+			this.getDevListAllApi()
+			this.pages2.T_id = item.T_id
+			this.pages2.T_sn = item.T_sn
+			this.diaForm2 = {
+				T_id: item.T_id,
+				T_sn: item.T_sn,
+				T_sort: item.T_sort,
+				T_type: item.T_type,
+				T_datashow: item.T_datashow,
+				T_3dview: item.T_3dview,
+			}
+			this.getPaGetApi(item.T_name)
+		},
+		getPaGetApi(item) {//传感器参数获取数据
+			DevParGet(this.pages2).then(res => {
+				if (res.data.Code == 200) {
+					console.log('传感器参数获取数据', res.data)
+					this.diaForm1 = res.data.Data[0]
+					// this.$set(this.diaForm1,'T_enprelnote',0)
+					this.$set(this.diaForm1, 'T_devName', this.descrData.T_devName)
+					this.$set(this.diaForm1, 'T_name', item)
+				}
+			})
+		},
+		Submit1() {
+			console.log('diaForm1', this.diaForm1)
+			DevParParPu(this.diaForm1).then(res => {
+				if (res.data.Code == 200) {
+					this.dialogVisible4 = false
+					this.$message.success('操作成功,传感器参数设置成功')
+					this.pages.page = 1
+					this.NavList = []
+					this.GetDevListApi()
+				}
+			})
+		},
+
+		Submit2() {
+			DevSenEdit(this.diaForm2).then(res => {
+				if (res.data.Code == 200) {
+					this.dialogVisible4 = false
+					this.$message.success('操作成功,传感器配置成功')
+					this.pages.page = 1
+					this.NavList = []
+					this.GetDevListApi()
+				}
+			})
+		},
+
+
+		SetDevParameter_PuApi(obj) {
+			DevParameter_Pu(obj).then(res => {
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					this.$message.success('修改成功')
+					this.dialogVisible = false
+					this.navNum = 0
+					this.GetDevListApi()
+				}
+			})
+		},
+
+
+		SetNew() { //新增主机
+			this.dialogShowinstr1 = true
+			if (this.$refs.ruleForm) { //为了验证第一次触发表单验证,第二次打开还是触发
+				this.$refs.ruleForm.resetFields();
+			}
+		},
+		submitForm(formName) {
+			this.$refs[formName].validate((valid) => {
+				if (valid) {
+					this.GetDevAddApi()
+				} else {
+					return false;
+				}
+			});
+		},
+
+		GetDevAddApi() {
+			DevAdd(this.ruleForm).then(res => {
+				////console.log('新增', res)
+				if (res.data.Code === 200 && res.data.Msg === "ok!") {
+					this.$message.success('新增成功')
+					this.pages.page = 1
+					this.NavList = []
+					this.GetDevListApi()
+					this.dialogShowinstr1 = false
+				}
+			})
+		},
+		handleClick(tab, event) {
+			////console.log('sss', tab, event);
+		},
+		devices() { //设备管理弹窗
+			this.activeName = 'first'
+			this.dialogVisible = true
+			this.ShowTishi = ''
+			this.GetDevSenParameter_ListApi()
+			this.pages1.T_sn = this.descrData.T_sn
+			this.pages1.T_give = this.descrData.T_give
+			this.pages1.T_l_p = this.descrData.T_l_p
+		},
+
+
+		instructionse() {
+			this.dialogShowinstr = true
+		},
+	}
+}
+</script>
+<style scoped>
+.el-divider--horizontal {
+	display: block;
+	height: 1px;
+	width: 100%;
+	margin: 0 0 24px 0;
+}</style>
+<style lang="scss">@import '../../assets/css/equipmentManagement/management.scss';
+
+.management-B-Con-BotCon-list-T {}</style>

+ 0 - 542
src/views/equipmentManagement/callthepolice - 副本.vue

@@ -1,542 +0,0 @@
-<template>
-	<div class="callthepolice">
-		<div class="callthepolice-T">
-			<div class="callthepolice-TL">
-				<Breadcrumb class="bre"></Breadcrumb>
-				<div class="callthepolice-searchs">
-					<inputs @inputs="inputValue" @pickers="pickersValue" :pickValue="value4" :inputShow="false" :pickerShow="true"
-						inputPlace="请输入名称查询数据"></inputs>
-					<div class="callthepolice-tit-mai1-btn">
-						<el-button type="primary" icon="el-icon-search" @click="drawer=true">更多查询</el-button>
-					</div>
-				</div>
-			</div>
-			<div class="callthepolice-TR">
-				<div class="callthepolice-searchsMai">
-					<el-button type="warning" icon="el-icon-menu" @click="setall()">批量</el-button>
-					<el-button type="danger" icon="el-icon-download" @click="GetexceApi()">Excel</el-button>
-				</div>
-			</div>
-		</div>
-		<div class="callthepolice-B" data-aos="flip-left" data-aos-delay="0">
-			<div class="callthepolice2">
-				<el-table :data="tableData" :row-class-name="tableRowClassName" ref="multipleTable" border
-					style="width: 100%" size="small">
-					<template slot="empty">
-						<noData></noData>
-					</template>
-					<el-table-column type="selection" width="55" :show-overflow-tooltip="true">
-					</el-table-column>
-					<el-table-column prop="T_Title" label="报警类型" :show-overflow-tooltip="true">
-					</el-table-column>
-					<el-table-column prop="T_sn" label="SN" width="150" :show-overflow-tooltip="true">
-					</el-table-column>
-					<el-table-column prop="T_Name" label="设备名称" :show-overflow-tooltip="true">
-					</el-table-column>
-					<el-table-column label="传感器" :show-overflow-tooltip="true">
-						<template slot-scope="scope">
-							[{{scope.row.T_Id}}]-{{scope.row.T_Name}}
-						</template>
-					</el-table-column>
-					<el-table-column prop="T_T" label="温度" width="70" :show-overflow-tooltip="true">
-					</el-table-column>
-					<el-table-column prop="T_RH" label="湿度" width="70" :show-overflow-tooltip="true">
-					</el-table-column>
-					<el-table-column label="时间" :show-overflow-tooltip="true">
-						<template slot-scope="scope">
-							{{scope.row.CreateTime | Time(scope.row.CreateTime)}}
-						</template>
-					</el-table-column>
-					<el-table-column prop="address" label="操作" :show-overflow-tooltip="true">
-						<template slot-scope="scope">
-							<el-dropdown split-button type="danger" size="mini" @command="allpir($event,scope.row)">
-								操作
-								<el-dropdown-menu slot="dropdown">
-									<el-dropdown-item command="a"><i class="el-icon-edit-outline"
-											style="font-size: 18px;"></i>处理</el-dropdown-item>
-									<el-dropdown-item command="b"><i class="el-icon-notebook-2"
-											style="font-size: 16px;"></i>处理记录</el-dropdown-item>
-									<el-dropdown-item command="c"><i class="el-icon-delete"
-											style="font-size: 16px;"></i>删除报警</el-dropdown-item>
-								</el-dropdown-menu>
-							</el-dropdown>
-						</template>
-					</el-table-column>
-				</el-table>
-			</div>
-			<div class="callthepolice-pagination">
-				<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
-					:current-page="pages.page" :page-size="pages.page_z"
-					layout="total, sizes, prev, pager, next, jumper" :total="total">
-				</el-pagination>
-			</div>
-		</div>
-		<el-dialog title="报警处理" :visible.sync="dialogVisible" width="40%" :append-to-body="true">
-			<div class="NewUser">
-				<el-form :model="ruleForm" ref="ruleForm" label-width="80px" class="demo-ruleForm">
-					<el-form-item label="处理备注">
-						<el-input type="textarea" v-model="ruleForm.T_Text"></el-input>
-					</el-form-item>
-					<el-form-item>
-						<el-button type="danger" @click="submitForm()" v-loading.fullscreen.lock="fullscreenLoading">
-							立即提交</el-button>
-						<el-button @click="dialogVisible=false">取消</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-		</el-dialog>
-		<el-dialog title="处理记录" :visible.sync="dialogVisible1" :append-to-body="true">
-			<div class="NewUser" style="height: 500px;overflow-y: auto;">
-				<el-timeline>
-					<el-timeline-item :timestamp="T_sn" placement="top" v-for="(item,index) in Loglist" :key="index">
-						<el-card>
-							<!-- <h4>{{item}}</h4> -->
-							<p>{{item}}</p>
-						</el-card>
-					</el-timeline-item>
-				</el-timeline>
-			</div>
-		</el-dialog>
-		<el-drawer title="更多查询" :visible.sync="drawer" :append-to-body="true">
-			<div class="drawerPir" style="margin-left: 10px;">
-				<el-form label-width="80px">
-					<el-form-item label="快速查询">
-						<el-button @click="TimeFor">近40天</el-button>
-					</el-form-item>
-					<el-form-item label="年月查询">
-						<div style="display: flex;align-items: center;justify-content: space-between;color: #ccc;margin-right: 20px;">
-							<el-date-picker v-model="value2" type="month" value-format="yyyy-MM" placeholder="开始年月">
-							</el-date-picker>
-							<div style="margin: 0 10px;">-</div>
-							<el-date-picker v-model="value3" type="month" value-format="yyyy-MM" placeholder="结束年月">
-							</el-date-picker>
-						</div>
-					</el-form-item>
-					<el-form-item>
-						<el-button type="primary" @click="Tijiao">立即查询</el-button>
-						<el-button @click="drawer=false">取消</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-		</el-drawer>
-
-	</div>
-</template>
-<script>
-	import {
-		DevList,
-		DevToExcel,
-		DevToDel,
-		DevToLog,
-		DevEdit
-	} from '../../api/equipmentManagement/callthepolice.js'
-	import Axios from 'axios'
-	import {formatDate} from '../../utils/Times.js'
-	import fileDownload from 'js-file-download'
-	let moment = require('moment');
-	export default {
-		data() {
-			return {
-				drawer: false, //筛选
-				value2: '',
-				value3: '',
-				value4:[],
-				fullscreenLoading: false,
-				bool: null, //判断是点击的批处理还是单处理
-				Loglist: null,
-				T_sn: '',
-				total: 0,
-				multipleTable: [],
-				pages: {
-					Time_start: '',
-					Time_end: '',
-					page: 1,
-					page_z: 10,
-				},
-				value1: '',
-				ruleForm: {
-					T_id: '',
-					T_Text: '',
-				},
-				dialogVisible: false,
-				dialogVisible1: false,
-				formInline: {
-					user: '',
-					region: ''
-				},
-				tableData: []
-			}
-		},
-		filters: {
-			Time: function(time) { //时间戳转换
-				if (time) {
-					var date = new Date(time); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
-					let y = date.getFullYear();
-					let MM = (date.getMonth() + 1).toString().padStart(2, '0');
-					let d = date.getDate().toString().padStart(2, '0');
-					let h = date.getHours().toString().padStart(2, '0');
-					let m = date.getMinutes().toString().padStart(2, '0');
-					let s = date.getSeconds().toString().padStart(2, '0');
-					return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
-				} else {
-					return '0000-00-00  00-00-00'
-				}
-			},
-		},
-		mounted() {
-			this.GetDevListApi()
-		},
-		methods: {
-			TimeFor(){//近40天
-				this.pages.Time_start = formatDate(new Date(new Date().setHours(0, 0, 0, 0)).getTime() - 86400000 * 40)
-				this.pages.Time_end = formatDate(new Date())
-				this.pages.page = 1
-				this.GetDevListApi()
-				this.drawer = false
-				////console.log(this.pages)
-			},
-			Tijiao() {
-				var sta = this.value2.replace('-','')
-				var end = this.value3.replace('-','')
-				if(this.value2===''){
-					this.$message.error('请选择开始年月')
-					return
-				}else if(this.value3===''){
-					this.$message.error('请选择结束年月')
-					return
-				}else if(sta>=end){//开始时间大于结束时间,
-					this.$message.error('查询年月区间选择不正确,请重新选择')
-					return
-				}else{
-					this.pages.Time_start = this.value2
-					this.pages.Time_end = this.value3
-					this.pages.page = 1
-					this.GetDevListApi()
-					this.drawer = false
-				}
-			},
-			tableRowClassName({
-				row
-			}) {
-				if (row.T_State == 2) { //等于2的时候红色
-					return 'warning-row';
-				}
-				return '';
-			},
-			GetexceApi() {
-				if (this.pages.Time_start === '' && this.pages.Time_end === '') {
-					this.$message.error('请选择开始时间与结束时间')
-					return
-				} else {
-					DevToExcel({
-						T_title: "",
-						T_sn: "",
-						T_id: "",
-						Time_start: "2022-11-01 00:00:00",
-						Time_end: "2022-11-02 00:00:00",
-					}).then(res => {
-						////console.log('excel', res)
-						if (res.data.Code === 200) {
-							Axios({
-								method: 'get',
-								url: res.data.Data,
-								responseType: 'blob'
-							}).then(res => {
-								////console.log(res)
-								this.$message.success('导出Excel成功')
-								fileDownload(res.data, moment(new Date()).format('YYYYMMDDHHmmss') +
-									'.xlsx');
-							});
-						}
-					})
-				}
-			},
-			GetDevListApi() {
-				DevList(this.pages).then(res => {
-					////console.log(res)
-					if (res.data.Code === 200 && res.data.Msg === "ok!") {
-						this.tableData = res.data.Data.Data
-						this.total = res.data.Data.Num
-					}
-				})
-			},
-			inputValue(e) {
-				////console.log(e)
-			},
-			pickersValue(e) {
-				////console.log('ee', e)
-				if (e != null) {
-					this.pages.Time_start = e[0]
-					this.pages.Time_end = e[1]
-				} else {
-					this.pages.Time_start = ""
-					this.pages.Time_end = ""
-				}
-				this.pages.page = 1
-				this.GetDevListApi()
-			},
-			async submitForm() {
-				this.fullscreenLoading = true
-				this.dialogVisible = false
-				var that = this
-				if (this.bool === 0) { //点击批处理
-					////console.log('批量')
-					this.PICHULI()
-				} else { //单处理
-					let bl = await this.GETEDIT(this.ruleForm)
-					////console.log('danchuli', bl)
-					if (bl.data.Code === 200) {
-						that.GetDevListApi()
-						setTimeout(function() {
-							that.fullscreenLoading = false
-						}, 1000)
-						setTimeout(function() {
-							that.$message.success('报警处理完成')
-						}, 1200)
-					}
-				}
-			},
-			PICHULI() {
-				var Arr = this.$refs.multipleTable.selection
-				var that = this
-				var jishu = 0
-				Arr.forEach(async (item) => {
-					this.ruleForm.T_id = item.Id
-					let bl = await this.GETEDIT(this.ruleForm)
-					if (bl.data.Code === 200) {
-						jishu = jishu + 1
-					}
-					if (jishu == Arr.length) {
-						that.GetDevListApi()
-						setTimeout(function() {
-							that.fullscreenLoading = false
-						}, 1000)
-						setTimeout(function() {
-							that.$message.success('报警批量处理完成')
-						}, 1200)
-					}
-				})
-			},
-			setall() {
-				var Arr = this.$refs.multipleTable.selection
-				if (Arr.length < 1) {
-					this.$message.error('批量处理异常,请勾选至少一项进行操作')
-				} else {
-					this.bool = 0 //0为点击的批处理
-					this.dialogVisible = true
-				}
-			},
-			handleSizeChange(e) { //每页多少条
-				this.pages.page_z = e
-				this.GetDevListApi()
-			},
-			handleCurrentChange(e) { //跳转页
-				this.pages.page = e
-				this.GetDevListApi()
-			},
-			allpir(i, item) {
-				var that = this
-				if (i === 'a') { //1为点击的单处理
-					this.bool = 1
-					this.ruleForm.T_id = item.Id
-					this.dialogVisible = true
-				} else if (i === "b") { //同步分类
-					////console.log('处理记录', i, item)
-					DevToLog({
-						T_id: item.Id
-					}).then(res => {
-						////console.log('rizi', res)
-						if (res.data.Code === 200 && res.data.Msg === "ok!") {
-							that.dialogVisible1 = true
-							that.Loglist = res.data.Data.T_Log
-							that.T_sn = res.data.Data.T_sn
-						}
-					})
-				} else if (i === "c") { //同步大屏
-					////console.log('删除', i, item)
-					this.$confirm('此操作将执行删除, 是否继续?', '提示', {
-						confirmButtonText: '确定',
-						cancelButtonText: '取消',
-						type: 'warning',
-						center: true
-					}).then(() => {
-						DevToDel({
-							T_id: item.Id
-						}).then(res => {
-							if (res.data.Code == 200) {
-								that.$message.success('删除成功');
-								that.pages.page = 1
-								that.GetDevListApi()
-							}
-						})
-					}).catch(() => {
-						this.$message({
-							type: 'info',
-							message: '已取消删除'
-						});
-					});
-				}
-			},
-			GETEDIT(obj) {
-				return new Promise(resolve => {
-					DevEdit(obj).then(function(res) {
-						resolve(res);
-					})
-				});
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	.el-dropdown-menu--mini .el-dropdown-menu__item {
-		line-height: 35px;
-		padding: 0 10px;
-		font-size: 12px;
-	}
-
-	.el-table .warning-row {
-		background: rgba(255, 0, 0, 0.23);
-	}
-
-	.callthepolice {
-		user-select: none;
-
-		.callthepolice-T {
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			background: rgba(#fff, 1);
-			height: 70px;
-			padding: 15px 10px;
-			box-shadow: 5px 5px 10px -10px #000;
-
-			.callthepolice-TL {
-				display: flex;
-				align-items: center;
-
-				.callthepolice-searchs {
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					margin-left: 20px;
-
-					.callthepolice-tit-mai1-btn {}
-
-					.callthepolice-searchs0 {}
-
-					.callthepolice-searchs1 {}
-				}
-			}
-
-			.callthepolice-searchsMai {
-				display: flex;
-				align-items: center;
-				cursor: pointer;
-			}
-		}
-
-		@media screen and (max-width: 1275px) {
-			.bre {
-				display: none;
-			}
-
-			.callthepolice-T {
-				display: flex;
-				justify-content: space-between;
-				background: rgba(#fff, 1);
-				height: 80px;
-				box-shadow: 5px 5px 10px -10px #000;
-
-				.callthepolice-TL {
-					width: 100%;
-					flex: 1;
-
-					.callthepolice-searchs {
-						margin-left: 0;
-					}
-				}
-
-				.callthepolice-TR {
-					display: flex;
-				}
-			}
-		}
-
-		@media screen and (max-width: 1060px) {
-			.callthepolice-T {
-				display: flex;
-				flex-direction: column;
-				background: rgba(#fff, 1);
-				height: 80px;
-				box-shadow: 5px 5px 10px -10px #000;
-
-				.callthepolice-TL {
-					width: 100%;
-
-					.callthepolice-searchs {
-						margin-left: 0;
-					}
-				}
-
-				.callthepolice-TR {
-					margin-top: 10px;
-					width: 100%;
-					display: flex;
-				}
-
-			}
-		}
-
-		.callthepolice-B {
-			background: rgba(#fff, 1);
-			margin: 10px;
-		}
-
-		.callthepolice2 {
-			// border-radius: 10px;
-			overflow: hidden;
-			margin: 10px;
-			padding: 20px;
-		}
-
-		.callthepolice-pagination {
-			// background: rgba(#31353e,1);
-			padding: 30px 20px;
-			margin: 10px;
-			border-radius: 2px;
-			display: flex;
-			// justify-content: center;
-			// .el-pagination.is-background .btn-next,
-			// .btn-prev,
-			// .el-pagination.is-background .el-pager li {
-			// 	//未选中
-			// 	margin: 0 5px;
-			// 	background-color: #222;
-			// 	color: #fff;
-			// 	min-width: 30px;
-			// 	border-radius: 2px;
-			// }
-
-			// .el-pagination.is-background .el-pager li:not(.disabled).active {
-			// 	//选中
-			// 	background-color: #fff;
-			// 	color: #222;
-			// }
-
-			// .el-pagination__total {
-			// 	//总total
-			// 	margin-right: 10px;
-			// 	font-weight: 400;
-			// 	// color: #fff;
-			// }
-
-			// .el-pagination__jump {
-			// 	//跳转页
-			// 	margin-left: 24px;
-			// 	font-weight: 400;
-			// 	// color: #fff;
-			// }
-		}
-	}
-</style>

+ 10 - 3
src/views/equipmentManagement/callthepolice.vue

@@ -45,12 +45,19 @@
 				</el-table-column>
 				<el-table-column prop="T_DS_name" label="名称" width="150" show-overflow-tooltip>
 				</el-table-column>
-				<el-table-column prop="T_Remark" label="内容" show-overflow-tooltip>
+                <el-table-column prop="T_Ut" label="报警开始时间 " width="150" show-overflow-tooltip>
+				</el-table-column>
+                <el-table-column prop="T_Text" label="处理措施" width="100" show-overflow-tooltip>
 				</el-table-column>
-				<el-table-column prop="T_Text" label="处理措施" width="100" show-overflow-tooltip>
+				
+                <el-table-column label="报警处理时间 " width="150" show-overflow-tooltip>
+                    <template slot-scope="scope">
+                        {{scope.row.T_State==2?scope.row.UpdateTime:'-'}}
+                    </template>
 				</el-table-column>
-				<el-table-column prop="T_Ut" label="时间" width="150" show-overflow-tooltip>
+				<el-table-column prop="T_Remark" label="内容" show-overflow-tooltip>
 				</el-table-column>
+				
 				<el-table-column label="操作" width="250" fixed="right">
 					<template slot-scope="scope">
 						<el-button v-permission="'Device:Warning:Handle'" size="small"

+ 189 - 136
src/views/equipmentManagement/management.vue

@@ -278,7 +278,6 @@
 							:type="this.descrData.T_monitor == 1 ? 'warning' : 'primary'" @click="DevTask" round>
 							{{ this.descrData.T_monitor == 1 ? '停止记录(已开启)' : '开始记录(已停止)' }}</el-button>
 						<el-button type="primary" v-permission="'Device:SyncParameter'" @click="showArg" round>同步参数</el-button>
-						<el-button type="primary" @click="synchronization" round v-permission="'JWX:docking'">同步平台</el-button>
 
 					</el-row>
 					<el-table :data="tableData" border style="width: 100%;margin-top: 50px;">
@@ -411,7 +410,7 @@
 			</div>
 		</el-dialog>
 		<el-dialog title="主机设置" :visible.sync="dialogVisible" :append-to-body="true" width="880px">
-			<el-tabs v-model="activeName" ref="tabs" @tab-click="tabClick">
+			<el-tabs v-model="activeName" ref="tabs">
 				<el-tab-pane label="主机参数" name="first">
 					<div style="height: 400px;overflow-y: auto;">
 						<el-form :inline="true" :model="Hostline" label-width="180px" class="demo-form-inline">
@@ -626,33 +625,7 @@
 						<el-button type="primary" @click="subHost">立即配置</el-button>
 					</div>
 				</el-tab-pane>
-                <el-tab-pane label="金卫信对接" name="joint" v-if="_permission" v-permission="'JWX:docking'">
-                    <el-form ref="jointFormRef" :rules="joinRules" :model="jointForm" label-width="130px" :inline="true">
-                        <el-form-item label="中继器网关序号" style="pointer-events:none">
-                            <el-input :value="jointForm.sensorIdNo" class="_jointStyle"  placeholder="中继器网关序号"></el-input>
-                        </el-form-item>
-                        <el-form-item label="中继器网关名称" style="pointer-events:none">
-                            <el-input :value="jointForm.sensorName" class="_jointStyle"  placeholder="中继器网关名称"></el-input>
-                        </el-form-item>
-                        
-                        <el-form-item label="单位名称" prop="depaCode">
-                            <el-select v-model="jointForm.depaCode" class="_jointStyle" @change="jointForm.idNo = ''" filterable placeholder="请选择">
-                                <el-option v-for="item,index in options" :key="index" :label="item.depaName" :value="item.depaCode">
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-                        <el-form-item label="绑定设备" prop="idNo">
-                            <el-select v-model="jointForm.idNo" :disabled="jointForm.depaCode?false:true" class="_jointStyle" filterable placeholder="请先选择单位名称">
-                                <el-option v-for="item,index in subOptions" :key="index" :label="item.name" :value="item.idNo">
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-                    </el-form>
-                    <div class="diapir-nav1-2">
-						<el-button @click="dialogVisible = false">取消</el-button>
-						<el-button type="primary" @click="_subJoin">立即配置</el-button>
-					</div>
-                </el-tab-pane>
+                
 			</el-tabs>
 			<el-dialog width="700px" title="设备参数记录" :visible.sync="dialogVisibleinner" append-to-body>
 				<div style="display: flex;align-items: center;padding-bottom: 10px;">
@@ -692,7 +665,7 @@
 		</el-dialog>
 
 		<el-dialog title="设备设置" :visible.sync="dialogVisible4" :append-to-body="true">
-			<el-tabs v-model="activeName1" ref="tabs1">
+			<el-tabs v-model="activeName1" ref="tabs1" @tab-click="tabClick">
 				<el-tab-pane label="传感器参数" name="firsts">
 					<el-form ref="form1" :model="diaForm1" label-width="100px" style="height: 500px;overflow-y: auto;">
 						<el-form-item label="设备名称">
@@ -875,18 +848,51 @@
 								<el-radio :label="1">正常展示</el-radio>
 							</el-radio-group>
 						</el-form-item>
-                        <el-form-item label="金卫信对接" v-permission="'JWX:docking'">
+                        <!-- <el-form-item label="金卫信对接" v-permission="'JWX:docking'">
                             <el-radio-group v-model="diaForm2.probeIdNo">
 								<el-radio :label="radios">显示</el-radio>
 								<el-radio label="">不显示</el-radio>
 							</el-radio-group>
-						</el-form-item>
+						</el-form-item> -->
 					</el-form>
 					<div class="diapir-nav1-2" v-permission="'DeviceSensor:Pu'">
 						<el-button @click="dialogVisible4 = false">取消</el-button>
 						<el-button type="primary" @click="Submit2">立即提交</el-button>
 					</div>
 				</el-tab-pane>
+                <el-tab-pane label="金卫信对接" name="joint" v-if="_permission" v-permission="'JWX:docking'">
+                    <el-form ref="jointFormRef" :rules="joinRules" :model="jointForm" label-width="130px" :inline="true">
+                        <el-form-item label="中继器网关序号" style="pointer-events:none">
+                            <el-input :value="jointForm.sensorIdNo" class="_jointStyle"  placeholder="中继器网关序号"></el-input>
+                        </el-form-item>
+                        <el-form-item label="中继器网关名称" style="pointer-events:none">
+                            <el-input :value="jointForm.sensorName" class="_jointStyle"  placeholder="中继器网关名称"></el-input>
+                        </el-form-item>
+                        <el-form-item label="传感器探头序号" style="pointer-events:none">
+                            <el-input :value="jointForm.probeIdNo" class="_jointStyle"  placeholder="中继器网关名称"></el-input>
+                        </el-form-item>
+                        <el-form-item label="单位名称" prop="depaCode">
+                            <el-select v-model="jointForm.depaCode" class="_jointStyle" @change="jointForm.idNo = ''" filterable placeholder="请选择">
+                                <el-option v-for="item,index in options" :key="index" :label="item.depaName" :value="item.depaCode">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="绑定设备" prop="idNo">
+                            <el-select v-model="jointForm.idNo" :disabled="jointForm.depaCode?false:true" class="_jointStyle" filterable placeholder="请先选择单位名称">
+                                <el-option v-for="item,index in subOptions" :key="index" :label="item.name" :value="item.idNo">
+                                    <div style="display: flex; align-items: center;justify-content: space-between;"> <!-- 使用 flex 布局 -->
+                                        <div class="a" style="flex: 1;">{{ item.name }}</div>
+                                        <div class="b" style="color: #8492a6; font-size: 13px;flex-shrink: 0;min-width: 160px;text-align: right;">{{item.idNo}}</div>
+                                    </div>
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-form>
+                    <div class="diapir-nav1-2">
+						<el-button @click="dialogVisible4 = false">取消</el-button>
+						<el-button type="primary" @click="_subJoin">立即配置</el-button>
+					</div>
+                </el-tab-pane>
 			</el-tabs>
 			<el-dialog width="700px" title="设备参数记录" :visible.sync="dialogVisible4inner" append-to-body>
 				<div style="display: flex;align-items: center;padding-bottom: 10px;">
@@ -950,8 +956,10 @@ import {
     getDepartment,
     getColdEquipment,
     sensorUpload,
-    probeUpload,probeRefUpload
+    probeUpload,probeRefUpload,
+    createMaintainInfo,findMaintainInfo
 } from "../../api/equipmentManagement/management.js"
+
 import store from "../../store"
 export default {
     computed: {
@@ -967,13 +975,16 @@ export default {
                 idNo: [{ required: true, message: '绑定设备', trigger: 'change' }],
             },
             multipleTable:[],//传感器探头列表
-            jointForm:{
+            jointForm:{ 
+                T_id:null,
                 T_sn:'',
                 sensorIdNo:'', //中继器网关序号 (input) sn_年月
-                depaName:'', //单位名称(select)
+                // depaName:'', //单位名称(select)
                 depaCode:'', //单位编码 *
                 idNo:'', //设备唯一编号 *
                 sensorName:'', //传感器名称 *
+                deviceName:'', //传感器探头名称 *
+                probeIdNo:'', //传感器探头序号 *
             },
             options: [],
             subOptions:[],
@@ -1038,7 +1049,6 @@ export default {
 				T_type: 0,
 				T_datashow: null,
 				T_3dview: null,
-                probeIdNo:''
 			},
 			loadTable: false,
 			NavList: [],
@@ -1093,18 +1103,17 @@ export default {
 	},
 	mounted() {
 		this.GetDevListApi()
-		this.times = setInterval(() => {
-			if (this.NavList.length != 0) {
-				this.getDevGetApi(this.descrData)
-				this.GetDevSenListApi(this.descrData)
-			}
-		}, 3000)
+		// this.times = setInterval(() => {
+		// 	if (this.NavList.length != 0) {
+		// 		this.getDevGetApi(this.descrData)
+		// 		this.GetDevSenListApi(this.descrData)
+		// 	}
+		// }, 3000)
 	},
     watch: {
         'jointForm.depaCode': {
             handler(value) {
                 if (value) {
-                    console.log('监听',value)
                     this.loadChildren(value);
                 }
             },
@@ -1112,56 +1121,97 @@ export default {
         }
     },
 	methods: {
-        //同步平台
-        synchronization(){
-            let arr = this.tableData || []
-            if (arr.length > 0) {
-                this.$confirm('此操作将同步平台, 是否继续?', '提示', {
-                    confirmButtonText: '确认同步',
-                    cancelButtonText: '取消',
-                    type: 'warning',
-                    center: true
-                }).then(async () => {
-                    let {depaCode,idNo,sensorIdNo} = this.descrData 
-                    let str = arr.filter(item => item.probeIdNo !== "")
-                                    .map(item => item.probeIdNo)
-                                    .join(',');
-                    const {data:result} = await probeRefUpload({depaCode,idNo,sensorIdNo,probeIdNo:str})
-                    if(result.Code==200){
-                        this.$message.success('同步成功')
-                    }
-                
-                }).catch(() => { 
-                    this.$message.info('已取消同步');
-                });
-            }else{
-                this.$message.warning('请先添加探头')
-                return
+        // 点击标签时触发(等于金卫信对接项&&下拉框为空时拉取单位列表)
+        tabClick(e){
+            if(e.name=='joint'&&this.options.length==0){
+            	this.handleClick()
             }
         },
+        //拉取单位列表,当选择值时,触发监听拉取绑定设备列表
+        async handleClick() {
+            const {data:result} = await getDepartment({})
+            if(result.Code==200){
+                this.options = result.Data || []
+            }
+		},
         // 动态添加子选项
         async loadChildren(code) {
             const {data:result} = await getColdEquipment({DepaCode:code})
             this.subOptions = result.Data || []   
         },
+        
         _subJoin(){
             this.$refs['jointFormRef'].validate(async(valid) => {
                 if (valid) {
-                    let obj = {...this.jointForm}
-                    const res = await DevEdit(obj)
-                    if (res.data.Code === 200 && res.data.Msg === "ok!") {
-                        let {depaCode,sensorIdNo,sensorName} = obj
-                        const {data:result} = await sensorUpload({depaCode,sensorIdNo,sensorName})
-                        if(result.Code==200){
-                            this.$message.success('设置成功')
-                            this.dialogVisible = false
-                            this.pages.page = 1
-                            this.NavList = []
-                            this.GetDevListApi()
+                    console.log('通过验证',this.jointForm)
+                    let {depaCode,sensorIdNo,sensorName,probeIdNo,deviceName,idNo} = this.jointForm
+
+                    const requests = [
+                        { func: sensorUpload, params: { depaCode, sensorIdNo, sensorName } },
+                        { func: probeUpload, params: { depaCode, probeIdNo, deviceName, model: 1, type: 1 } },
+                        { func: probeRefUpload, params: { depaCode, idNo, sensorIdNo, probeIdNo } },
+                        { func: createMaintainInfo, params: this.jointForm }
+                    ];
+                    const loading = this.$loading({
+                        lock: true,
+                        text: 'Loading',
+                        spinner: 'el-icon-loading',
+                        background: 'rgba(0, 0, 0, 0.7)'
+                    });
+                    try {
+                        for (const { func, params } of requests) {
+                            const { data } = await func(params);
+                            if (data.Code!== 200) {
+                                loading.close();
+                                return;
+                            }
                         }
-                        
+                        loading.close();
+                        this.$message.success('所有请求发送成功');
+                    } catch (error) {
+                        loading.close();
+                        this.$message.error('操作失败');
                     }
+
+                    // // 中继器基础信息上传
+                    // const {data:result1} = await sensorUpload({depaCode,sensorIdNo,sensorName})
+                    // console.log('通过验证1',result1)
+                    // //传感器探头信息上传
+                    // const {data:result2} = await probeUpload({ 
+                    //     depaCode,
+                    //     probeIdNo,
+                    //     deviceName,
+                    //     model:1,
+                    //     type:1
+                    // })
+                    // console.log('通过验证2',result1)
+                    // //同步平台
+                    // const {data:result3} = await probeRefUpload({depaCode,idNo,sensorIdNo,probeIdNo})
+                    // console.log('通过验证3',result3)
+                    // const {data:result4} = await createMaintainInfo(this.jointForm)
+                    // console.log('通过验证4',result4)
+                    
                     
+
+                    this.$message.success('设置成功')
+                    this.dialogVisible = false
+                    this.pages.page = 1
+                    this.NavList = []
+                    this.GetDevListApi()
+                    // let obj = {...this.jointForm}
+                    // const res = await DevEdit(obj)
+                    // if (res.data.Code === 200 && res.data.Msg === "ok!") {
+                    //     let {depaCode,sensorIdNo,sensorName} = obj
+                    //     const {data:result} = await sensorUpload({depaCode,sensorIdNo,sensorName})
+                    //     if(result.Code==200){
+                    //         this.$message.success('设置成功')
+                    //         this.dialogVisible = false
+                    //         this.pages.page = 1
+                    //         this.NavList = []
+                    //         this.GetDevListApi()
+                    //     }
+                        
+                    // }
                 } else {
                     console.log('error submit!!');
                     return false;
@@ -1169,13 +1219,7 @@ export default {
             });
            
         },
-        //拉取单位列表
-        async handleClick() {
-            const {data:result} = await getDepartment({})
-            if(result.Code==200){
-                this.options = result.Data || []
-            }
-		},
+        
         handleClear(e,key){if(!e)this.Hostform[key]=''},
         inputChange(valuedown,valuetop,j){
             if(Number(valuedown)>Number(valuetop)){
@@ -1386,11 +1430,7 @@ export default {
 				}
 			})
 		},
-        tabClick(e){
-            if(e.name=='joint'&&this.options.length==0){
-            	this.handleClick()
-            }
-        },
+        
 		showHost() { //点击主机设置
 			var perData1 = pertabs('Device:Parameter')
 			var perData2 = pertabs('Device:Config')
@@ -1418,21 +1458,11 @@ export default {
                     this.Hostform[key] = this.descrData[key];
                 }
             }
-            for (let key in this.jointForm) {
-                if (this.descrData.hasOwnProperty(key)) {
-                    this.jointForm[key] = this.descrData[key];
-                }
-            }
-            if(!this.jointForm.sensorIdNo){// 动态生成中继器网关序号
-                const now = new Date();
-                const year = now.getFullYear();
-                // const month = String(now.getMonth() + 1).padStart(2, '0');
-                this.jointForm.sensorIdNo = this.descrData.T_sn + '_' + year;
-            }
-            if(!this.jointForm.sensorName){
-                this.jointForm.sensorName = this.descrData.T_sn + '_ZJQ';
-            }
-            console.log('主机配置阐述', this.descrData,this.jointForm)
+            // for (let key in this.jointForm) {
+            //     if (this.descrData.hasOwnProperty(key)) {
+            //         this.jointForm[key] = this.descrData[key];
+            //     }
+            // }
 			this.GetDevSenParameter_ListApi()
 		},
 		subHost() { //提交主机配置
@@ -1546,8 +1576,10 @@ export default {
 			})
 		},
 
-		handleEdit(item) { //点击设置按钮
-            console.log('设置',item)
+		async handleEdit(item) { //点击设置按钮
+            console.log('点击设置',item)
+            Object.keys(this.jointForm).forEach(key => {this.jointForm[key] = '';});//清空对象
+            this.activeName1 = 'firsts'
 			var perData1 = pertabs('DeviceSensor:Parameter')
 			var perData2 = pertabs('DeviceSensor:Config')
             this.downArr = [false,false,false,false]
@@ -1568,20 +1600,48 @@ export default {
 				}
 			})
 			this.getDevListAllApi()
-			this.pages2.T_id = item.T_id
-			this.pages2.T_sn = item.T_sn
+            
+			let {T_id,T_sn,T_sort,T_type,T_datashow,T_3dview,probeIdNo,T_name} = item
+
+			this.pages2.T_id = T_id
+			this.pages2.T_sn = T_sn
+
 			this.diaForm2 = {
-				T_id: item.T_id,
-				T_sn: item.T_sn,
-				T_sort: item.T_sort,
-				T_type: item.T_type,
-				T_datashow: item.T_datashow,
-				T_3dview: item.T_3dview,
-                probeIdNo:item.probeIdNo,
-                deviceName:item.T_name
+				T_id,T_sn,T_sort,T_type,T_datashow,T_3dview,probeIdNo,
+                deviceName:T_name
 			}
-			this.getPaGetApi(item.T_name)
-            this.radios = item.T_sn + '_' + item.T_id
+			this.getPaGetApi(T_name)
+            if(this.$store.state.permission.includes('JWX:docking')){//解决金卫信对接项没有权限
+                const {data:res} =  await findMaintainInfo({T_id,T_sn}) 
+                if(res.Code==200){
+                    let obj1 = res.Data || {}
+                    if(Object.keys(obj1).length != 0){
+                        for (let key in this.jointForm) {
+                            this.jointForm[key] = obj1[key];
+                        }
+                    }
+                    
+                    console.log('点击设置', this.jointForm ,'obj1',obj1)
+                    if(this.jointForm.sensorIdNo==''){//随便判断一个如果对象有空数据,就本地生成
+                        this.jointForm.T_sn = T_sn
+                        this.jointForm.probeIdNo = T_sn + '_' + T_id
+                        this.jointForm.T_id = T_id
+                        this.jointForm.deviceName = T_name
+
+                        if(!this.jointForm.sensorIdNo){// 动态生成中继器网关序号
+                            const now = new Date();
+                            const year = now.getFullYear();
+                            // const month = String(now.getMonth() + 1).padStart(2, '0');
+                            this.jointForm.sensorIdNo = T_sn + '_' + year;
+                        }
+                        if(!this.jointForm.sensorName){
+                            this.jointForm.sensorName = T_sn + '_ZJQ';
+                        }
+                        console.log('点击设置1', this.jointForm )
+                    }
+                }
+            }
+            
 		},
 		getPaGetApi(item) {//传感器参数获取数据
 			DevParGet(this.pages2).then(res => {
@@ -1616,20 +1676,8 @@ export default {
             console.log('diaForm2', this.diaForm2,this.descrData)
 			const {data:res} = await DevSenEdit(this.diaForm2) 
             if (res.Code == 200) {
-                if(this.diaForm2.probeIdNo){//显示了探头信息,则调用上传接口
-                    let {depaCode} = this.descrData
-                    let {probeIdNo,deviceName} = this.diaForm2
-                    const {data:result} = await probeUpload({ 
-                        depaCode,
-                        probeIdNo,
-                        deviceName,
-                        model:1,
-                        type:1
-                    })
-                    if (result.Code==200)this._isidno()
-                }else{
-                    this._isidno()
-                }
+                this._isidno()
+                
             }
 		},
 
@@ -1699,10 +1747,12 @@ export default {
 	}
 }
 </script>
-<style scoped>
+<style scoped lang="scss">
 ._jointStyle{
 	width: 260px !important;
 }
+
+
 .el-divider--horizontal {
 	display: block;
 	height: 1px;
@@ -1711,4 +1761,7 @@ export default {
 }</style>
 <style lang="scss">
 @import '../../assets/css/equipmentManagement/management.scss';
+
+
+
 </style>

+ 0 - 265
src/views/layout/Topmenu copy.vue

@@ -1,265 +0,0 @@
-<template>
-	<div class="menus">
-		<div class="menus-mai">
-			<div class="menus-mai-logo" @click="gohome()">
-				<div class="menus-mai-logo-img">
-					<img src="../../assets/img/logo4.png" alt="" srcset="">
-				</div>
-				<div class="menus-mai-logo-txt">
-					冷链v3.0
-				</div>
-			</div>
-			<div class="menus-mai-list">
-				<div v-for="(item,index) in roulist" :key="index">
-					<div class="menus-mai-list-nav"> <!-- v-if="item.meta.showNav" -->
-						<div class="menus-mai-list-nav1">
-							<router-link :to="'/'+item.T_permission+'/'+item.Children[0].T_permission" style="display: flex;flex-direction: column;">
-								<i class="iconfont Oneicon" :class="item.T_icon" style="font-size:30px;"></i>
-								<div class="Onefont">{{item.T_name}}</div>
-							</router-link>
-						</div>
-						<div class="menus-mai-list-nav2 nav2" data-aos="slide-down" data-aos-delay="0">
-							<div class="menus-mai-list-nav2-san"></div>
-							<div class="menus-mai-list-nav2-er">
-								<div v-for="(item1,index1) in item.Children" :key="index1">
-									<router-link  :to="'/'+item.T_permission+'/'+item1.T_permission">
-										<div class="aicon">
-											<i class="iconfont" :class="item1.T_icon" style="font-size:16px;"></i>
-										</div>
-										<div class="a2">
-											{{item1.T_name}}
-										</div>
-									</router-link>
-								</div>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-</template>
-
-<script>
-	import {mapGetters} from "vuex"
-	export default {
-		computed:mapGetters(["navData"]),
-		// computed:{//多个计算属性写法
-		// 	add(){
-		// 		return 'adv'
-		// 	},
-		// 	...mapGetters(["navData"])
-		// },
-		data() {
-			return {
-				roulist : [],
-				NavData: null,
-			}
-		},
-		watch: {
-			navData: { // $route可以用引号,也可以不用引号  监听的对象
-				handler(val) {
-					this.roulist = this.navData
-					////console.log('重新设置菜单========3',val)
-				},
-				deep: true, // 深度观察监听 设置为 true
-				immediate: true, // 第一次初始化渲染就可以监听到
-			},
-		},
-		mounted() {
-			////console.log('daohang', this.navData)
-		},
-		methods: {
-			clickNav(cocor) {
-				// this.$store.commit('setnavNum', index)
-			},
-			searchs() {
-				this.$message('功能正在开发中,敬请期待')
-			},
-			gohome() {
-				this.$router.push({
-					path: '/index'
-				})
-			},
-			quan() {
-				if (this.isScreenFull) {
-					document.exitFullscreen()
-				} else {
-					document.documentElement.requestFullscreen()
-				}
-				this.isScreenFull = !this.isScreenFull // 直接在后边来个取反就好,就不用在if里赋值了
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	.menus-mai {
-		.menus-mai-logo {
-			height: 100px;
-			background: #ee954d;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			flex-direction: column;
-			overflow: hidden;
-			cursor: pointer;
-
-			// box-shadow: 5px 5px 10px -10px #000;
-			.menus-mai-logo-img {
-				width: 35px;
-				height: 35px;
-
-				img {
-					width: 100%;
-					height: 100%;
-					object-fit: contain;
-				}
-			}
-
-			.menus-mai-logo-txt {
-				font-size: 12px;
-				font-weight: 100;
-				transform: scale(1);
-				letter-spacing: 1px;
-				margin-top: 10px;
-				padding: 0 10px;
-			}
-
-		}
-
-		.menus-mai-list {
-			cursor: pointer;
-
-			.menus-mai-list-nav {
-				width: 80px;
-				height: 80px;
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				position: relative;
-
-				.menus-mai-list-nav1 {
-					width: 100%;
-					height: 100%;
-					a {
-						display: block;
-						width: 100%;
-						height: 100%;
-						display: flex;
-						align-items: center;
-						justify-content: center;
-					}
-
-					.Oneicon {
-						color: #7a7f8f !important;
-					}
-					.Onefont{
-						color: #7a7f8f !important;
-						font-size: 12px;
-						transform: scale(.75);
-						letter-spacing: 1px;
-					}
-					.router-link-active {
-						background: #57566b;
-						.Oneicon {
-							color: #fff !important;
-						}
-						.Onefont{
-							color: #fff !important;
-							font-size: 12px;
-						}
-					}
-				}
-
-				.menus-mai-list-nav2 {
-					position: absolute;
-					left: 70px;
-					top: calc((100% - 30px)/2);
-					z-index: 555;
-					min-width: 120px;
-					color: #000;
-					background: #fff;
-					border-radius: 2px;
-					border: 1px solid #ebeef5;
-					box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
-
-					.menus-mai-list-nav2-san {
-						position: absolute;
-						top: 10px;
-						left: -12px;
-						display: block;
-						width: 0;
-						height: 0;
-						border-color: transparent;
-						border-style: solid;
-						border-left-width: 0;
-						border-right-color: #fff;
-						border-width: 6px;
-						filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
-					}
-
-					.menus-mai-list-nav2-er {
-						background: #fff;
-						width: auto;
-						flex-direction: column;
-						min-height: 50px;
-						a {
-							color: #7a7f8f;
-							font-size: 12px;
-							display: flex;
-							align-items: center;
-							padding: 13px 10px;
-
-							.aicon {
-								margin-right: 5px;
-							}
-
-							.a2 {
-								min-width: 100px;
-							}
-						}
-					}
-
-					.menus-mai-list-nav2-er a:hover {
-						background: rgba(#ccc, .1);
-					}
-
-					.router-link-active {
-						color: #ee954d !important;
-					}
-				}
-
-				.nav2 {
-					display: none;
-				}
-			}
-
-			.menus-mai-list-nav:hover {
-				background: rgba(#000, .5);
-
-				.menus-mai-list-nav1 {
-					color: #ee954d !important;
-				}
-			}
-
-			.menus-mai-list-nav:hover .nav2 {
-				display: block;
-				animation: names .3s;
-				animation-fill-mode: none;
-			}
-
-			@keyframes names {
-				from {
-					transform: translateX(100px);
-					opacity: 0;
-				}
-
-				to {
-					transform: translateX(0);
-					opacity: 1;
-				}
-			}
-		}
-	}
-</style>

+ 24 - 8
src/views/layout/Topmenu.vue

@@ -12,19 +12,18 @@
             <div class="menus-mai-list" style="width: 100%;">
                 <el-menu :default-active="$route.path" background-color="rgb(58,57,78)" class="el-menu-vertical-demo" menu-trigger="click"
                     :collapse="true" style="width: auto;border-right:none" router>
-                    <el-submenu :index="item.path"
-                        v-for="item, index in navData" :key="index">
+                    <el-submenu :index="item.path" v-for="item, index in roulist" :key="index">
                         <template slot="title">
                             <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
                                 <i class="iconfont Oneicon" :class="item.icon" style="font-size:30px;"></i>
-                                <div slot="title" style="color: #909399;font-size: 12px;">{{ item.meta.title }}</div>
+                                <div slot="title" style="color: #909399;font-size: 12px;">{{ item.meta.title}}</div>
                             </div>
                         </template>
-                        <el-menu-item class="el-submenus" :index="item1.path"
-                                v-for="(item1, index1) in item.children" :key="index1">
-                                    <i class="iconfont" :class="item1.icon" style="font-size:16px;color: #fff;"></i>
-                                    <span slot="title" style="color: #fff;padding-left: 10px;">{{ item1.meta.title}}</span>
-                            </el-menu-item>
+                        <el-menu-item class="el-submenus" :index="item1.path" 
+                        v-for="(item1, index1) in item.children" :key="index1">
+                            <i class="iconfont" :class="item1.icon" style="font-size:16px;color: #fff;"></i>
+                            <span slot="title" style="color: #fff;padding-left: 10px;">{{ item1.meta.title }}</span>
+                        </el-menu-item>
                     </el-submenu>
                 </el-menu>
             </div>
@@ -44,10 +43,27 @@ export default {
     // },
     data() {
         return {
+            roulist: [],
             NavData: null,
         }
     },
+    watch: {
+        navData: { // $route可以用引号,也可以不用引号  监听的对象
+            handler(val) {
+                this.roulist = this.navData
+                ////console.log('重新设置菜单========3',val)
+            },
+            deep: true, // 深度观察监听 设置为 true
+            immediate: true, // 第一次初始化渲染就可以监听到
+        },
+    },
+    mounted() {
+        ////console.log('daohang', this.navData)
+    },
     methods: {
+        clickNav(cocor) {
+            // this.$store.commit('setnavNum', index)
+        },
         searchs() {
             this.$message('功能正在开发中,敬请期待')
         },

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 26 - 4
src/views/layout/index.vue


BIN
冷链3.0.rar


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است