Compare commits

...

237 Commits

Author SHA1 Message Date
fanluyan 1bbfb99084 数据报表添加 1 month ago
fanluyan b033caa832 优化统计 1 month ago
郭承 7e917bd8be fix:调整统计报表 2 months ago
郭承 1407bb8239 统计报表 表格表头显示调整 2 months ago
fanluyan d60bf45bad Merge branch 'menu1.0' of http://61.169.135.146:8081/git/ly.fan/xy-frontend into menu1.0 2 months ago
fanluyan 4fd62625b8 优化 2 months ago
郭承 b4e0830d72 统计报表条件增加活动选项 2 months ago
fanluyan 6598cab93e 鹤壁 2 months ago
fanluyan 5de657f529 a 2 months ago
郭承 ce73915e3f 添加统计报表 2 months ago
fanluyan 2ea14d17c7 添加photolist 3 months ago
fanluyan 1b7fa0fc83 优化 3 months ago
fanluyan c4f2b1f60f 数据统计 4 months ago
fanluyan 0a18645e6e 优化时间表下发,添加预置位查询 4 months ago
fanluyan 9867e009ea 优化下发时间表 4 months ago
fanluyan c334a75cb8 优化查询所有信息的接口 4 months ago
fanluyan 29910d5ba6 优化 5 months ago
fanluyan 0cbf443c26 优化多个弹出框 6 months ago
fanluyan 15b220d37d 添加微气象覆冰转发 6 months ago
fanluyan 2791fffcd4 样式优化 6 months ago
fanluyan f34aa4b480 优化 6 months ago
fanluyan 999f6238af 云台优化 6 months ago
fanluyan 35bf58297d 优化覆冰微气象展示河南 7 months ago
fanluyan 4c8da93533 拍照时间表下发云台 7 months ago
fanluyan 2d4442ee37 覆冰气象云台装置添加下发时间表 7 months ago
fanluyan 4b1456a99b 优化云台设置 7 months ago
fanluyan 42a0f2dd15 youhua 7 months ago
fanluyan 6bec0b82ce 优化微气象图表 7 months ago
fanluyan 2da372fb23 批量命令生成 7 months ago
fanluyan 696bb0d9e1 所有命令都走udp 7 months ago
fanluyan 9cbf3e69ce 优化覆冰页面 7 months ago
fanluyan b51c25c2ef 优化覆冰微气象页面 7 months ago
fanluyan 1b9e1701e2 优化批量添加shebei 7 months ago
fanluyan 402ebe1f44 覆冰添加拍照 8 months ago
fanluyan 1cb03f598b 优化 8 months ago
fanluyan a86921f3f6 添加devtype 8 months ago
fanluyan 0718f48742 添加devtype 8 months ago
fanluyan f7d9b0dbb8 添加devtype 8 months ago
fanluyan 9ff2e4eb89 优化通道设置 8 months ago
fanluyan 0b954ced79 主动拍照 9 months ago
fanluyan 75a7740ab4 历史图片优化加载 9 months ago
fanluyan dd95854e88 优化加载图片 9 months ago
fanluyan 986efe2314 云台添加功能,实现上下左右,保存预置位 9 months ago
fanluyan 5ab8c7186a 云台添加功能,实现上下左右,保存预置位 9 months ago
fanluyan 8c0c78f4b6 图片加载优化 9 months ago
fanluyan 5f5fd289cf 还原 9 months ago
fanluyan 37cf2800ad 优化查看历史图片 9 months ago
fanluyan 61fef9b3ab 优化水印 9 months ago
fanluyan 1dc6818eca 优化报表 9 months ago
fanluyan 56db09b6f7 优化 10 months ago
fanluyan 0a05d4ad56 装置添加是否监测离线 10 months ago
fanluyan ecd70d66e9 添加手势滑动 10 months ago
fanluyan ebbeddbefb 优化图片选中,居中,优化搜索模糊查询 10 months ago
fanluyan c22c1090fe 优化 10 months ago
fanluyan 5395095210 优化通道选择 11 months ago
fanluyan 12a1c66daa 通道设置 直传修改过的 11 months ago
fanluyan 5c33efee49 优化添加线路参数 11 months ago
fanluyan a61c648a9b 优化报表 11 months ago
fanluyan 938a0a81ee 升级优化 11 months ago
fanluyan 333242bbca iccid 11 months ago
fanluyan 0f16c96997 优化覆冰 11 months ago
fanluyan 0ca01b234c 优化通道设置 11 months ago
fanluyan 477cf59fa2 通道设置优化 11 months ago
fanluyan 807f655f27 优化通道设置 11 months ago
fanluyan 103c57accd 优化鹤壁 11 months ago
fanluyan 5c6d5ca653 优化基本操作 11 months ago
fanluyan acea3b29eb 优化 11 months ago
fanluyan 7cae1278a1 优化 11 months ago
fanluyan 5d1f9b05cf 优化排序 11 months ago
fanluyan 21fc05bb1d 数据报表添加排序 11 months ago
fanluyan 04dda6ab1b 维护卡号 11 months ago
fanluyan 9ff9df45da 超管展示活动 11 months ago
fanluyan 5f975771fe 优化全局配置 11 months ago
fanluyan 0b8b69b16a 通道设置添加 11 months ago
fanluyan 43ec621685 优化 11 months ago
fanluyan 14a4baed83 覆冰数据修改,报表数据修改 11 months ago
fanluyan f676381bc6 覆冰数据优化 12 months ago
fanluyan 7f8d952032 覆冰 12 months ago
fanluyan c6c7ff3ae1 缩略图点击左右箭头加载图片 12 months ago
fanluyan 411ef6d491 优化 12 months ago
fanluyan fadebb3410 升级优化 1 year ago
fanluyan c70d60ea60 优化覆冰 1 year ago
fanluyan 482182bd38 优化 1 year ago
fanluyan 0e377ce0c4 清除时间表 1 year ago
fanluyan 83368b1f10 优化覆冰 1 year ago
fanluyan b831f47089 添加批量 1 year ago
fanluyan b666acee9c 优化 1 year ago
fanluyan c81d67a56f 添加规约 1 year ago
fanluyan 60dff2632b 优化点击获取图片 1 year ago
fanluyan 10cd00ab87 优化点击获取图片 1 year ago
fanluyan 0117821a72 优化 1 year ago
fanluyan ea10c5ee28 通道设置 1 year ago
fanluyan 8a6638ae1a 优化通道 1 year ago
fanluyan 84bcc7b6e4 优化通道场景模式 1 year ago
fanluyan 5702c09105 优化通道 1 year ago
fanluyan b2c7099fae 优化下发时间表 1 year ago
fanluyan f00a7a98ed 优化 1 year ago
fanluyan 88d2c58bc4 覆冰 1 year ago
fanluyan 3fbd7af3cc 优化 1 year ago
fanluyan 6028cff2fa 覆冰样式优化 1 year ago
fanluyan ef2398b980 添加电压等 1 year ago
fanluyan 965aec327b 添加电压等 1 year ago
fanluyan cddc7c6692 通道设置 1 year ago
fanluyan 8d8fd19e5d 优化报表 1 year ago
fanluyan 85423ae3ad 标记告警 1 year ago
fanluyan a4a7fdaaaa 告警 1 year ago
fanluyan d0e2c84d62 优化 1 year ago
fanluyan e3e0b966c0 添加数据报表 1 year ago
fanluyan cea121f20a 优化 1 year ago
fanluyan ba6492eb52 覆冰 1 year ago
fanluyan ed45fe4e3e 覆冰 1 year ago
fanluyan fafc902dd2 优化 1 year ago
fanluyan e3b7b79e74 优化 1 year ago
fanluyan 18ce1d2a85 优化 1 year ago
fanluyan 63bd189786 优化 1 year ago
fanluyan b6ee182149 Merge branch 'role1.0' into menu1.0 1 year ago
fanluyan 2fb20f00ea 优化 1 year ago
fanluyan 273a9509b3 优化 1 year ago
fanluyan 092698f720 a 1 year ago
fanluyan ad9811ab72 取消设置适配器 1 year ago
fanluyan 24b38ab2eb 优化 1 year ago
fanluyan e8074e74f1 在线离线 1 year ago
fanluyan c15df590bd 优化网络适配器查询 1 year ago
fanluyan 95bc9d09a4 优化视频参数 1 year ago
fanluyan 1127c752e1 覆冰接口 1 year ago
fanluyan 17e5e4605c 优化 1 year ago
fanluyan bd3e4b481f youhua 1 year ago
fanluyan 932f0e968a 优化 1 year ago
fanluyan a35c1912f2 优化 1 year ago
fanluyan 8365e5bfea 优化 1 year ago
fanluyan ea73cb1a24 优化 1 year ago
fanluyan 9e2ad20c0b 优化权限 1 year ago
fanluyan 3c869485ab 优化权限 1 year ago
fanluyan b105c7b200 控制资源权限 1 year ago
fanluyan 5d37873db3 优化 1 year ago
fanluyan 6533731144 优化 1 year ago
fanluyan e458251052 菜单权限修改 1 year ago
fanluyan ecddc99dea 优化 1 year ago
fanluyan 23b397081b 用户菜单功能分配隐藏 1 year ago
fanluyan 7b85da722b “优化” 1 year ago
fanluyan 221be28fff 优化 1 year ago
fanluyan 2f54c610a0 youhua 1 year ago
fanluyan b57c0847de 优化 1 year ago
fanluyan 4392ef299b youhua 1 year ago
fanluyan 205574e9b6 hebing 1 year ago
fanluyan 01b008bfec 添加角色管理 1 year ago
fanluyan 45b1aacc7e youhua 1 year ago
fanluyan 90acfc0a27 优化 1 year ago
fanluyan 67b2706c4b 告警 1 year ago
fanluyan ee82d0fc81 升级 1 year ago
fanluyan 8c5ce46d94 各种信息报 1 year ago
fanluyan 283df218bb 优化 1 year ago
fanluyan e1dcadd102 工作状态报 1 year ago
fanluyan 2ab38f7a9f youhua 1 year ago
fanluyan 5f69fddaa5 添加filesize 1 year ago
fanluyan 38b708b4a3 故障报 1 year ago
fanluyan ceb665d724 优化ip显示 1 year ago
fanluyan 656a3daa8d 装置故障报 1 year ago
fanluyan 2326f8d7c7 youhua 1 year ago
fanluyan 3a527fbb18 优化 1 year ago
fanluyan b3a60b2240 优化 1 year ago
fanluyan f18923ebf1 优化 1 year ago
fanluyan 63d72d78dc 优化 1 year ago
fanluyan a642779d14 优化 1 year ago
fanluyan d96eb977eb 优化 1 year ago
fanluyan 71991fe073 权限优化 1 year ago
fanluyan 572dd7a30b 权限 1 year ago
fanluyan 3c55c84392 优化绑定权限 1 year ago
fanluyan 8ffb77634f youhua 1 year ago
fanluyan 414554c0e5 权限设置 1 year ago
fanluyan 4e98177836 权限问题 1 year ago
fanluyan c2797030dc 添加图片视频文件大小 1 year ago
fanluyan b6d67b038e 权限 1 year ago
fanluyan c9a84a7eb3 修改日期 1 year ago
fanluyan 2c2d771878 权限 1 year ago
fanluyan c71cfda1d8 角色增删改查 1 year ago
fanluyan 5c3ce1f285 时间 1 year ago
fanluyan dc83c28dc5 权限 1 year ago
fanluyan e3b3e08682 修改api地址 1 year ago
fanluyan 2dc62f2d57 添加通道设置,app设置 1 year ago
fanluyan c30be6e10c 添加通道查询 1 year ago
fanluyan dd7fc8b9e4 通达设置 1 year ago
fanluyan 6197c53804 优化通道设置 1 year ago
fanluyan 4f7c960e6b 优化通道设置 1 year ago
fanluyan c9f58fb9ce 优化 1 year ago
fanluyan e58d1c07cb 通道设置 1 year ago
fanluyan fcdde8aa33 添加通道设置功能 1 year ago
fanluyan fa46e54a1d 指定时间拍照 1 year ago
fanluyan 818214d10d 优化收起列表树的bug 1 year ago
fanluyan d3ea703444 wp优化 1 year ago
fanluyan e5bf15f4a2 使用008假数据 1 year ago
fanluyan bbed91b05e 上传图片 1 year ago
fanluyan 8ff60d0a52 添加上传图片 1 year ago
fanluyan 4e4cfc26e0 优化在线离线 1 year ago
fanluyan c6c82dc570 添加收藏夹功能 1 year ago
fanluyan ce1b533423 添加收藏夹功能 1 year ago
fanluyan bd9b11294c 更新左侧树状图60s更新状态 1 year ago
fanluyan 88edc135a9 优化 1 year ago
fanluyan fa1d3650dd 优化下载图片名称 1 year ago
fanluyan 92994a3ef0 优化 1 year ago
fanluyan 7970f3e4b3 修改历史图片缓存 2 years ago
fanluyan 733715a903 添加删除图片 2 years ago
fanluyan ff7556dabe 添加复制 2 years ago
fanluyan be998f5ced 删除覆冰 2 years ago
fanluyan 5bc7261752 覆冰 2 years ago
fanluyan ba823ee505 删除图片功能缺少接口 2 years ago
fanluyan 25ca61b79e 添加tags 2 years ago
fanluyan d2249ca1d0 添加tags缓存 2 years ago
fanluyan 0806ead733 优化 2 years ago
fanluyan 70df922e2a 优化时间选择 2 years ago
fanluyan 4b33b2fb93 优化下载图片 2 years ago
fanluyan a2d0bde682 样式优化 2 years ago
fanluyan 9f6463bfd6 拍照时间表提示 2 years ago
fanluyan f734489a79 左侧树搜索给个时间 2 years ago
fanluyan aa9b6a4f09 ss 2 years ago
fanluyan 05037ccc6d 参数配置添加查询的时间 2 years ago
fanluyan df63fb7b81 参数配置添加查询的时间 2 years ago
fanluyan 83a531be52 图片不能被选中 2 years ago
fanluyan 4aa18787c3 样式优化 2 years ago
fanluyan a7a0b600f2 点击展示多图 2 years ago
fanluyan b17f4424a6 优化装置列表 2 years ago
fanluyan 25342a89e9 修改左侧树状结构 2 years ago
fanluyan f606b9003e 修改左侧树状结构 2 years ago
fanluyan 96a75a4e6b 采样参数,图像,id查询添加rf参数 2 years ago
fanluyan 56e425f513 告警 2 years ago
fanluyan a8c6a339c5 样式优化添加echarts 2 years ago
fanluyan c50d9597a0 优化页面 2 years ago
fanluyan 08bb06f78c 优化 2 years ago
fanluyan 1e63720f56 anhuiosd 2 years ago
fanluyan e9cb3bcbbf osd 2 years ago
fanluyan 3fe5f93838 osd河南处理 2 years ago
fanluyan 82f60a0fa9 添加osd 2 years ago
fanluyan c46203b0c1 osd 2 years ago
fanluyan d8bb891ba2 样式优化 2 years ago
fanluyan 42a7c92543 样式优化 2 years ago
fanluyan 1f9476a5c3 优化图片轮播以及左侧树状结构 2 years ago
fanluyan bca647a736 ip添加验证 2 years ago

@ -1,3 +1,6 @@
// module.exports = {
// presets: ["@vue/cli-plugin-babel/preset"],
// };
module.exports = {
presets: ["@vue/cli-plugin-babel/preset"],
plugins: ["@babel/plugin-transform-optional-chaining"],
};

445
package-lock.json generated

@ -260,7 +260,7 @@
},
"@babel/helper-simple-access": {
"version": "7.22.5",
"resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
"integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"requires": {
@ -386,13 +386,13 @@
},
"@babel/plugin-proposal-private-property-in-object": {
"version": "7.21.0-placeholder-for-preset-env.2",
"resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
"integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
"dev": true
},
"@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
"requires": {
@ -401,7 +401,7 @@
},
"@babel/plugin-syntax-class-properties": {
"version": "7.12.13",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
"dev": true,
"requires": {
@ -410,7 +410,7 @@
},
"@babel/plugin-syntax-class-static-block": {
"version": "7.14.5",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
"integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
"dev": true,
"requires": {
@ -437,7 +437,7 @@
},
"@babel/plugin-syntax-export-namespace-from": {
"version": "7.8.3",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
"integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
"dev": true,
"requires": {
@ -464,7 +464,7 @@
},
"@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
"integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
"dev": true,
"requires": {
@ -473,7 +473,7 @@
},
"@babel/plugin-syntax-json-strings": {
"version": "7.8.3",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
"dev": true,
"requires": {
@ -491,7 +491,7 @@
},
"@babel/plugin-syntax-logical-assignment-operators": {
"version": "7.10.4",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
"integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
"dev": true,
"requires": {
@ -500,7 +500,7 @@
},
"@babel/plugin-syntax-nullish-coalescing-operator": {
"version": "7.8.3",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
"dev": true,
"requires": {
@ -509,7 +509,7 @@
},
"@babel/plugin-syntax-numeric-separator": {
"version": "7.10.4",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
"requires": {
@ -518,7 +518,7 @@
},
"@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
"requires": {
@ -527,7 +527,7 @@
},
"@babel/plugin-syntax-optional-catch-binding": {
"version": "7.8.3",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
"requires": {
@ -536,7 +536,7 @@
},
"@babel/plugin-syntax-optional-chaining": {
"version": "7.8.3",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
"requires": {
@ -545,7 +545,7 @@
},
"@babel/plugin-syntax-private-property-in-object": {
"version": "7.14.5",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
"integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
"dev": true,
"requires": {
@ -554,7 +554,7 @@
},
"@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
"dev": true,
"requires": {
@ -563,7 +563,7 @@
},
"@babel/plugin-syntax-unicode-sets-regex": {
"version": "7.18.6",
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
"integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
"dev": true,
"requires": {
@ -830,7 +830,7 @@
},
"@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.22.5",
"resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
"integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
"dev": true,
"requires": {
@ -901,14 +901,22 @@
}
},
"@babel/plugin-transform-optional-chaining": {
"version": "7.22.10",
"resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz",
"integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==",
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz",
"integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-plugin-utils": "^7.24.0",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"dependencies": {
"@babel/helper-plugin-utils": {
"version": "7.24.0",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
"integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
"dev": true
}
}
},
"@babel/plugin-transform-parameters": {
@ -1159,7 +1167,7 @@
},
"@babel/preset-modules": {
"version": "0.1.6-no-external-plugins",
"resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
"resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
"integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
"dev": true,
"requires": {
@ -1170,7 +1178,7 @@
},
"@babel/regjsgen": {
"version": "0.8.0",
"resolved": "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
"dev": true
},
@ -2022,6 +2030,49 @@
"webpack-merge": "^5.7.3",
"webpack-virtual-modules": "^0.4.2",
"whatwg-fetch": "^3.6.2"
},
"dependencies": {
"@vue/vue-loader-v15": {
"version": "npm:vue-loader@15.11.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz",
"integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
}
}
},
"json5": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"loader-utils": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
"integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
}
}
},
"@vue/cli-shared-utils": {
@ -2186,47 +2237,6 @@
}
}
},
"@vue/vue-loader-v15": {
"version": "npm:vue-loader@15.10.1",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.1.tgz",
"integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
},
"json5": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz",
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"loader-utils": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz",
"integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
}
}
},
"@vue/web-component-wrapper": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
@ -2692,8 +2702,7 @@
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"base64-js": {
"version": "1.5.1",
@ -2801,7 +2810,6 @@
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -2816,6 +2824,21 @@
"fill-range": "^7.0.1"
}
},
"browser-resolve": {
"version": "1.11.3",
"resolved": "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-1.11.3.tgz",
"integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
"requires": {
"resolve": "1.1.7"
},
"dependencies": {
"resolve": {
"version": "1.1.7",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.1.7.tgz",
"integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg=="
}
}
},
"browserslist": {
"version": "4.21.10",
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.10.tgz",
@ -2844,6 +2867,11 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
"builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ=="
},
"bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz",
@ -3034,6 +3062,16 @@
"integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==",
"dev": true
},
"clipboard": {
"version": "2.0.11",
"resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
"integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
"requires": {
"good-listener": "^1.2.2",
"select": "^1.1.2",
"tiny-emitter": "^2.0.0"
}
},
"clipboardy": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz",
@ -3170,8 +3208,7 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"connect-history-api-fallback": {
"version": "2.0.0",
@ -3283,8 +3320,7 @@
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"cosmiconfig": {
"version": "7.1.0",
@ -3672,6 +3708,11 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
"integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
@ -4397,6 +4438,11 @@
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
"estree-walker": {
"version": "0.2.1",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.2.1.tgz",
"integrity": "sha512-6/I1dwNKk0N9iGOU3ydzAAurz4NPo/ttxZNCqgIVbWFvWyzWBSNonRrJ5CpjDuyBfmM7ENN7WCzUi9aT/UPXXQ=="
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
@ -4577,6 +4623,11 @@
"flat-cache": "^3.0.4"
}
},
"file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
@ -4722,8 +4773,7 @@
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"functional-red-black-tree": {
"version": "1.0.1",
@ -4813,6 +4863,14 @@
"slash": "^3.0.0"
}
},
"good-listener": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
"integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
"requires": {
"delegate": "^3.1.2"
}
},
"graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
@ -4828,6 +4886,11 @@
"duplexer": "^0.1.2"
}
},
"hammerjs": {
"version": "2.0.8",
"resolved": "https://registry.npmmirror.com/hammerjs/-/hammerjs-2.0.8.tgz",
"integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ=="
},
"handle-thing": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz",
@ -4838,7 +4901,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
@ -5087,6 +5149,11 @@
"dev": true,
"optional": true
},
"immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
@ -5116,8 +5183,7 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ipaddr.js": {
"version": "2.1.0",
@ -5153,7 +5219,6 @@
"version": "2.13.0",
"resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz",
"integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
@ -5251,8 +5316,7 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"isexe": {
"version": "2.0.0",
@ -5381,6 +5445,46 @@
"universalify": "^2.0.0"
}
},
"jszip": {
"version": "3.10.1",
"resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"requires": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"setimmediate": "^1.0.5"
},
"dependencies": {
"readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
}
},
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
@ -5469,6 +5573,14 @@
"type-check": "~0.4.0"
}
},
"lie": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"requires": {
"immediate": "~3.0.5"
}
},
"lilconfig": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
@ -5728,6 +5840,14 @@
"yallist": "^3.0.2"
}
},
"magic-string": {
"version": "0.16.0",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.16.0.tgz",
"integrity": "sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==",
"requires": {
"vlq": "^0.2.1"
}
},
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz",
@ -5886,7 +6006,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -6330,6 +6449,11 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz",
@ -6427,8 +6551,7 @@
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"path-to-regexp": {
"version": "0.1.7",
@ -6874,8 +6997,7 @@
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"progress": {
"version": "2.0.3",
@ -7049,7 +7171,7 @@
},
"regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
"integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
"dev": true
},
@ -7070,7 +7192,7 @@
},
"regenerator-transform": {
"version": "0.15.2",
"resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
"integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
"dev": true,
"requires": {
@ -7085,7 +7207,7 @@
},
"regexpu-core": {
"version": "5.3.2",
"resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
"integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
"dev": true,
"requires": {
@ -7099,7 +7221,7 @@
},
"regjsparser": {
"version": "0.9.1",
"resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz",
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
"integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
"dev": true,
"requires": {
@ -7108,7 +7230,7 @@
"dependencies": {
"jsesc": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
"dev": true
}
@ -7160,7 +7282,6 @@
"version": "1.22.4",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.4.tgz",
"integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
"dev": true,
"requires": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
@ -7204,6 +7325,89 @@
"glob": "^7.1.3"
}
},
"rollup-plugin-cleanup": {
"version": "0.1.4",
"resolved": "https://registry.npmmirror.com/rollup-plugin-cleanup/-/rollup-plugin-cleanup-0.1.4.tgz",
"integrity": "sha512-5TmT816PwinFF2w9RsgJ+5YaWFcXXtEThez9J+WBwmIAkndKEUngHjJxQr5gcBfGzOyK2U8iLTF1yEYdgJMwIw==",
"requires": {
"acorn": "^3.3.0",
"magic-string": "^0.16.0",
"rollup-pluginutils": "^1.5.2"
},
"dependencies": {
"acorn": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-3.3.0.tgz",
"integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw=="
}
}
},
"rollup-plugin-commonjs": {
"version": "7.1.0",
"resolved": "https://registry.npmmirror.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-7.1.0.tgz",
"integrity": "sha512-L+kW1RrHmQxapen8cZqBIHo78LXz+ASoyR4uRhzlwWL17UzhDMKtRXZpY4tt2PYm2Q7f1lkvxnEvnPU66Sc7dw==",
"requires": {
"acorn": "^4.0.1",
"estree-walker": "^0.3.0",
"magic-string": "^0.19.0",
"resolve": "^1.1.7",
"rollup-pluginutils": "^2.0.1"
},
"dependencies": {
"acorn": {
"version": "4.0.13",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz",
"integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug=="
},
"estree-walker": {
"version": "0.3.1",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.3.1.tgz",
"integrity": "sha512-a0V2EAQrmcBKl/RLr5Cu3qZBHC9tuWifbAXezwNLUCuHndgoEAakTenYcESK84nF123BOjKXi33kFc3z4F+Lkw=="
},
"magic-string": {
"version": "0.19.1",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.19.1.tgz",
"integrity": "sha512-AJRZGyg/F3QJUsgz/0Kh7HR09VZ1Mu/Nfyou9WtlXAYyMErN4BvtAOqwsYpHwT+UWbP2QlGPPmHTCvZjk0zcAw==",
"requires": {
"vlq": "^0.2.1"
}
},
"rollup-pluginutils": {
"version": "2.8.2",
"resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
"integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
"requires": {
"estree-walker": "^0.6.1"
},
"dependencies": {
"estree-walker": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz",
"integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
}
}
}
}
},
"rollup-plugin-node-resolve": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz",
"integrity": "sha512-UDDWQc9CzqzEhyoxSp6m0ZU29GhEJw+6HCqMfwoREwGlpKK7K68/4B3n/ysdU0tWz5YHwDKDpHF0MeH7fJIgaw==",
"requires": {
"browser-resolve": "^1.11.0",
"builtin-modules": "^1.1.0",
"resolve": "^1.1.6"
}
},
"rollup-pluginutils": {
"version": "1.5.2",
"resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz",
"integrity": "sha512-SjdWWWO/CUoMpDy8RUbZ/pSpG68YHmhk5ROKNIoi2En9bJ8bTt3IhYi254RWiTclQmL7Awmrq+rZFOhZkJAHmQ==",
"requires": {
"estree-walker": "^0.2.1",
"minimatch": "^3.0.2"
}
},
"run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
@ -7243,6 +7447,11 @@
"ajv-keywords": "^3.5.2"
}
},
"select": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
"integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
},
"select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
@ -7399,6 +7608,11 @@
"send": "0.18.0"
}
},
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
@ -7704,8 +7918,7 @@
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
"svg-tags": {
"version": "1.0.0",
@ -7879,6 +8092,11 @@
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
"dev": true
},
"tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
},
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@ -7945,13 +8163,13 @@
},
"unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
"integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
"dev": true
},
"unicode-match-property-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
"dev": true,
"requires": {
@ -7961,13 +8179,13 @@
},
"unicode-match-property-value-ecmascript": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
"integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
"dev": true
},
"unicode-property-aliases-ecmascript": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
"integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
"dev": true
},
@ -8005,8 +8223,7 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"utila": {
"version": "0.4.0",
@ -8048,6 +8265,11 @@
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true
},
"vlq": {
"version": "0.2.3",
"resolved": "https://registry.npmmirror.com/vlq/-/vlq-0.2.3.tgz",
"integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow=="
},
"vue": {
"version": "2.7.14",
"resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz",
@ -8062,6 +8284,14 @@
"resolved": "https://registry.npmjs.org/vue-awesome-swiper/-/vue-awesome-swiper-5.0.1.tgz",
"integrity": "sha512-mWjFJzUqA4lG+DmsmibvMpoiBnl+IH2SSeiiQ3i5M0t1y9FknTxnGT0DsMb2YdJLgjYMEK3sYOWzqgLnZMH8Lg=="
},
"vue-clipboard2": {
"version": "0.3.3",
"resolved": "https://registry.npmmirror.com/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz",
"integrity": "sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==",
"requires": {
"clipboard": "^2.0.0"
}
},
"vue-eslint-parser": {
"version": "8.3.0",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
@ -8143,9 +8373,9 @@
"dev": true
},
"vue-lazyload": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.3.3.tgz",
"integrity": "sha512-uHnq0FTEeNmqnbBC2aRKlmtd9LofMZ6Q3mWvgfLa+i9vhxU8fDK+nGs9c1iVT85axSua/AUnMttIq3xPaU9G3A=="
"version": "1.2.6",
"resolved": "https://registry.npmmirror.com/vue-lazyload/-/vue-lazyload-1.2.6.tgz",
"integrity": "sha512-6a61+pzwcfowhLRQiPdmRuJ40n/4fL/sEynu8KQZoCf5RVA0NH0X68vplLY0+lUM8mKNScYomaepV+hdjgnZhg=="
},
"vue-loader": {
"version": "17.2.2",
@ -8268,6 +8498,17 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
"vue-touch": {
"version": "2.0.0-beta.4",
"resolved": "https://registry.npmmirror.com/vue-touch/-/vue-touch-2.0.0-beta.4.tgz",
"integrity": "sha512-UvbKsqf7HHwtXzuEodtzeDEX/lkq6ul1QcdHhl8VUKlDTYne5ey15RjNVTkDvigJaKvtVU0UB0x5NURNyRC37A==",
"requires": {
"hammerjs": "^2.0.8",
"rollup-plugin-cleanup": "^0.1.4",
"rollup-plugin-commonjs": "^7.0.0",
"rollup-plugin-node-resolve": "^2.0.0"
}
},
"vuex": {
"version": "3.6.2",
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",

@ -12,18 +12,23 @@
"core-js": "^3.8.3",
"echarts": "^5.4.3",
"element-ui": "^2.15.13",
"file-saver": "^2.0.5",
"jszip": "^3.10.1",
"moment": "^2.29.4",
"postcss-pxtorem": "^6.0.0",
"swiper": "^10.2.0",
"vue": "^2.6.14",
"vue-awesome-swiper": "^5.0.1",
"vue-lazyload": "^1.3.3",
"vue-clipboard2": "^0.3.3",
"vue-lazyload": "^1.2.6",
"vue-router": "^3.5.1",
"vue-touch": "^2.0.0-beta.4",
"vuex": "^3.6.2"
},
"devDependencies": {
"@babel/core": "^7.12.16",
"@babel/eslint-parser": "^7.12.16",
"@babel/plugin-transform-optional-chaining": "^7.24.1",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,589 @@
{
"version": 1.2,
"fileVersion": 1.0,
"type": 7,
"createTime": 20250113163055,
"flag": 1,
"name": "1",
"k": 4096,
"m": 1,
"channels": [
{
"n": 6,
"crests": [
{
"name": "H2",
"j": 0,
"time": 377.0,
"startTime": 309.0,
"endTime": "NaN",
"height": 5685.0,
"area": "NaN"
},
{
"name": "CO",
"j": 1,
"time": 475.0,
"startTime": 437.0,
"endTime": "NaN",
"height": 2287.0,
"area": "NaN"
},
{
"name": "CH4",
"j": 2,
"time": 659.0,
"startTime": 601.0,
"endTime": "NaN",
"height": 3018.0,
"area": "NaN"
},
{
"name": "C2H4",
"j": 3,
"time": 2052.0,
"startTime": 1939.0,
"endTime": "NaN",
"height": 4883.0,
"area": "NaN"
},
{
"name": "C2H6",
"j": 4,
"time": 2576.0,
"startTime": 2438.0,
"endTime": "NaN",
"height": 5909.0,
"area": "NaN"
},
{
"name": "C2H2",
"j": 5,
"time": 2997.0,
"startTime": 2863.0,
"endTime": "NaN",
"height": 1845.0,
"area": "NaN"
}
],
"data": [
28689.0, 28689.0, 28689.0, 28688.0, 28687.0, 28686.0, 28685.0, 28685.0,
28684.0, 28682.0, 28681.0, 28680.0, 28679.0, 28679.0, 28679.0, 28679.0,
28679.0, 28678.0, 28678.0, 28678.0, 28677.0, 28677.0, 28677.0, 28676.0,
28676.0, 28676.0, 28675.0, 28675.0, 28674.0, 28673.0, 28672.0, 28671.0,
28671.0, 28672.0, 28672.0, 28673.0, 28672.0, 28672.0, 28671.0, 28670.0,
28670.0, 28670.0, 28669.0, 28669.0, 28669.0, 28669.0, 28669.0, 28668.0,
28667.0, 28666.0, 28665.0, 28666.0, 28666.0, 28667.0, 28667.0, 28667.0,
28667.0, 28667.0, 28667.0, 28667.0, 28666.0, 28666.0, 28666.0, 28666.0,
28666.0, 28665.0, 28665.0, 28664.0, 28663.0, 28662.0, 28663.0, 28664.0,
28664.0, 28665.0, 28665.0, 28665.0, 28665.0, 28665.0, 28664.0, 28664.0,
28664.0, 28663.0, 28663.0, 28663.0, 28663.0, 28662.0, 28661.0, 28661.0,
28660.0, 28660.0, 28661.0, 28662.0, 28662.0, 28663.0, 28663.0, 28663.0,
28663.0, 28663.0, 28663.0, 28663.0, 28663.0, 28663.0, 28663.0, 28663.0,
28662.0, 28662.0, 28661.0, 28661.0, 28661.0, 28662.0, 28662.0, 28663.0,
28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0,
28662.0, 28662.0, 28662.0, 28661.0, 28661.0, 28660.0, 28659.0, 28660.0,
28660.0, 28661.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0,
28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28661.0,
28660.0, 28659.0, 28659.0, 28660.0, 28661.0, 28662.0, 28662.0, 28662.0,
28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0, 28662.0,
28662.0, 28663.0, 28662.0, 28661.0, 28661.0, 28660.0, 28660.0, 28661.0,
28661.0, 28662.0, 28662.0, 28662.0, 28663.0, 28663.0, 28663.0, 28663.0,
28663.0, 28663.0, 28663.0, 28663.0, 28663.0, 28662.0, 28661.0, 28661.0,
28660.0, 28661.0, 28661.0, 28662.0, 28663.0, 28663.0, 28663.0, 28663.0,
28664.0, 28664.0, 28664.0, 28664.0, 28664.0, 28664.0, 28664.0, 28664.0,
28663.0, 28663.0, 28662.0, 28662.0, 28662.0, 28663.0, 28663.0, 28664.0,
28664.0, 28663.0, 28663.0, 28663.0, 28663.0, 28663.0, 28663.0, 28663.0,
28663.0, 28663.0, 28663.0, 28664.0, 28663.0, 28663.0, 28662.0, 28663.0,
28663.0, 28664.0, 28665.0, 28665.0, 28665.0, 28665.0, 28665.0, 28665.0,
28665.0, 28665.0, 28665.0, 28665.0, 28665.0, 28665.0, 28665.0, 28664.0,
28664.0, 28663.0, 28664.0, 28664.0, 28665.0, 28666.0, 28666.0, 28666.0,
28666.0, 28666.0, 28666.0, 28667.0, 28667.0, 28667.0, 28667.0, 28667.0,
28667.0, 28667.0, 28667.0, 28667.0, 28666.0, 28666.0, 28666.0, 28667.0,
28667.0, 28668.0, 28668.0, 28668.0, 28668.0, 28668.0, 28668.0, 28668.0,
28668.0, 28669.0, 28669.0, 28669.0, 28670.0, 28669.0, 28668.0, 28668.0,
28667.0, 28668.0, 28669.0, 28670.0, 28670.0, 28670.0, 28670.0, 28670.0,
28670.0, 28670.0, 28669.0, 28669.0, 28669.0, 28669.0, 28669.0, 28669.0,
28669.0, 28668.0, 28668.0, 28668.0, 28668.0, 28669.0, 28670.0, 28671.0,
28671.0, 28671.0, 28672.0, 28673.0, 28675.0, 28677.0, 28679.0, 28682.0,
28686.0, 28692.0, 28698.0, 28707.0, 28716.0, 28728.0, 28744.0, 28763.0,
28788.0, 28818.0, 28854.0, 28897.0, 28949.0, 29009.0, 29080.0, 29163.0,
29258.0, 29366.0, 29488.0, 29622.0, 29770.0, 29931.0, 30102.0, 30283.0,
30472.0, 30667.0, 30867.0, 31071.0, 31274.0, 31474.0, 31671.0, 31863.0,
32048.0, 32225.0, 32395.0, 32555.0, 32707.0, 32849.0, 32982.0, 33106.0,
33222.0, 33329.0, 33428.0, 33519.0, 33603.0, 33682.0, 33755.0, 33823.0,
33885.0, 33942.0, 33994.0, 34042.0, 34087.0, 34128.0, 34165.0, 34200.0,
34230.0, 34258.0, 34283.0, 34305.0, 34324.0, 34339.0, 34350.0, 34357.0,
34361.0, 34362.0, 34359.0, 34351.0, 34339.0, 34319.0, 34294.0, 34262.0,
34224.0, 34180.0, 34128.0, 34070.0, 34004.0, 33931.0, 33851.0, 33764.0,
33670.0, 33569.0, 33461.0, 33348.0, 33231.0, 33110.0, 32985.0, 32857.0,
32726.0, 32592.0, 32458.0, 32323.0, 32188.0, 32054.0, 31922.0, 31792.0,
31664.0, 31540.0, 31419.0, 31303.0, 31189.0, 31081.0, 30979.0, 30882.0,
30791.0, 30706.0, 30627.0, 30553.0, 30485.0, 30423.0, 30368.0, 30321.0,
30280.0, 30247.0, 30223.0, 30208.0, 30202.0, 30205.0, 30219.0, 30242.0,
30278.0, 30326.0, 30387.0, 30460.0, 30545.0, 30640.0, 30742.0, 30851.0,
30966.0, 31085.0, 31205.0, 31327.0, 31448.0, 31566.0, 31680.0, 31790.0,
31895.0, 31993.0, 32084.0, 32169.0, 32247.0, 32320.0, 32388.0, 32450.0,
32507.0, 32558.0, 32603.0, 32645.0, 32683.0, 32716.0, 32747.0, 32774.0,
32799.0, 32821.0, 32841.0, 32858.0, 32873.0, 32886.0, 32896.0, 32905.0,
32913.0, 32919.0, 32924.0, 32927.0, 32926.0, 32924.0, 32918.0, 32910.0,
32898.0, 32882.0, 32862.0, 32838.0, 32808.0, 32773.0, 32732.0, 32684.0,
32629.0, 32567.0, 32497.0, 32421.0, 32338.0, 32250.0, 32155.0, 32054.0,
31947.0, 31836.0, 31722.0, 31605.0, 31487.0, 31368.0, 31250.0, 31132.0,
31016.0, 30903.0, 30792.0, 30686.0, 30583.0, 30485.0, 30392.0, 30304.0,
30222.0, 30145.0, 30073.0, 30004.0, 29940.0, 29880.0, 29825.0, 29773.0,
29725.0, 29680.0, 29639.0, 29601.0, 29566.0, 29533.0, 29502.0, 29474.0,
29448.0, 29424.0, 29404.0, 29386.0, 29370.0, 29356.0, 29342.0, 29330.0,
29318.0, 29307.0, 29296.0, 29285.0, 29273.0, 29261.0, 29247.0, 29233.0,
29219.0, 29204.0, 29187.0, 29171.0, 29154.0, 29139.0, 29125.0, 29111.0,
29099.0, 29086.0, 29074.0, 29063.0, 29053.0, 29043.0, 29035.0, 29027.0,
29019.0, 29012.0, 29006.0, 29000.0, 28994.0, 28988.0, 28981.0, 28976.0,
28971.0, 28967.0, 28963.0, 28960.0, 28956.0, 28953.0, 28949.0, 28946.0,
28942.0, 28939.0, 28936.0, 28933.0, 28931.0, 28928.0, 28925.0, 28922.0,
28919.0, 28916.0, 28913.0, 28911.0, 28909.0, 28909.0, 28908.0, 28907.0,
28905.0, 28904.0, 28904.0, 28904.0, 28905.0, 28906.0, 28908.0, 28911.0,
28915.0, 28921.0, 28928.0, 28937.0, 28947.0, 28961.0, 28978.0, 28999.0,
29025.0, 29055.0, 29089.0, 29128.0, 29173.0, 29223.0, 29279.0, 29341.0,
29409.0, 29483.0, 29562.0, 29647.0, 29737.0, 29830.0, 29927.0, 30026.0,
30127.0, 30229.0, 30331.0, 30434.0, 30536.0, 30635.0, 30730.0, 30823.0,
30911.0, 30996.0, 31077.0, 31153.0, 31226.0, 31293.0, 31356.0, 31415.0,
31469.0, 31520.0, 31566.0, 31609.0, 31648.0, 31686.0, 31721.0, 31753.0,
31782.0, 31808.0, 31830.0, 31851.0, 31870.0, 31887.0, 31902.0, 31914.0,
31924.0, 31931.0, 31936.0, 31939.0, 31938.0, 31935.0, 31928.0, 31917.0,
31904.0, 31887.0, 31868.0, 31844.0, 31815.0, 31782.0, 31745.0, 31704.0,
31658.0, 31609.0, 31555.0, 31498.0, 31437.0, 31372.0, 31305.0, 31235.0,
31163.0, 31089.0, 31014.0, 30939.0, 30864.0, 30789.0, 30714.0, 30640.0,
30566.0, 30494.0, 30423.0, 30354.0, 30287.0, 30222.0, 30160.0, 30100.0,
30042.0, 29987.0, 29934.0, 29884.0, 29836.0, 29790.0, 29746.0, 29706.0,
29669.0, 29634.0, 29601.0, 29570.0, 29540.0, 29513.0, 29487.0, 29462.0,
29440.0, 29418.0, 29398.0, 29380.0, 29362.0, 29344.0, 29328.0, 29312.0,
29296.0, 29281.0, 29267.0, 29254.0, 29241.0, 29228.0, 29215.0, 29203.0,
29190.0, 29177.0, 29165.0, 29153.0, 29141.0, 29129.0, 29118.0, 29108.0,
29098.0, 29088.0, 29078.0, 29068.0, 29058.0, 29050.0, 29043.0, 29037.0,
29030.0, 29024.0, 29017.0, 29011.0, 29005.0, 28999.0, 28994.0, 28988.0,
28983.0, 28978.0, 28974.0, 28970.0, 28965.0, 28961.0, 28956.0, 28952.0,
28948.0, 28945.0, 28943.0, 28940.0, 28937.0, 28934.0, 28932.0, 28929.0,
28926.0, 28924.0, 28921.0, 28919.0, 28916.0, 28914.0, 28912.0, 28909.0,
28907.0, 28904.0, 28901.0, 28898.0, 28897.0, 28896.0, 28895.0, 28894.0,
28892.0, 28890.0, 28889.0, 28887.0, 28885.0, 28884.0, 28882.0, 28881.0,
28879.0, 28878.0, 28876.0, 28875.0, 28875.0, 28877.0, 28927.0, 29043.0,
29225.0, 29469.0, 29726.0, 29970.0, 30195.0, 30398.0, 30580.0, 30742.0,
30886.0, 31013.0, 31124.0, 31223.0, 31310.0, 31387.0, 31454.0, 31513.0,
31566.0, 31612.0, 31654.0, 31692.0, 31726.0, 31757.0, 31784.0, 31808.0,
31830.0, 31850.0, 31868.0, 31884.0, 31899.0, 31913.0, 31926.0, 31937.0,
31947.0, 31957.0, 31964.0, 31972.0, 31978.0, 31985.0, 31993.0, 32000.0,
32006.0, 32011.0, 32016.0, 32021.0, 32025.0, 32029.0, 32033.0, 32037.0,
32040.0, 32043.0, 32046.0, 32049.0, 32052.0, 32054.0, 32056.0, 32057.0,
32059.0, 32062.0, 32065.0, 32067.0, 32070.0, 32071.0, 32073.0, 32075.0,
32076.0, 32078.0, 32079.0, 32081.0, 32082.0, 32084.0, 32085.0, 32086.0,
32087.0, 32088.0, 32088.0, 32089.0, 32091.0, 32092.0, 32094.0, 32095.0,
32096.0, 32096.0, 32097.0, 32098.0, 32099.0, 32100.0, 32101.0, 32101.0,
32102.0, 32102.0, 32103.0, 32103.0, 32104.0, 32104.0, 32104.0, 32105.0,
32106.0, 32107.0, 32108.0, 32108.0, 32108.0, 32109.0, 32109.0, 32110.0,
32110.0, 32111.0, 32111.0, 32112.0, 32112.0, 32113.0, 32113.0, 32112.0,
32112.0, 32112.0, 32114.0, 32116.0, 32117.0, 32119.0, 32119.0, 32120.0,
32120.0, 32121.0, 32121.0, 32121.0, 32122.0, 32122.0, 32123.0, 32123.0,
32123.0, 32124.0, 32122.0, 32121.0, 32120.0, 32119.0, 32120.0, 32122.0,
32123.0, 32123.0, 32124.0, 32124.0, 32124.0, 32124.0, 32124.0, 32124.0,
32125.0, 32125.0, 32125.0, 32126.0, 32126.0, 32125.0, 32125.0, 32125.0,
32125.0, 32126.0, 32127.0, 32128.0, 32129.0, 32129.0, 32129.0, 32129.0,
32129.0, 32129.0, 32130.0, 32130.0, 32130.0, 32130.0, 32130.0, 32130.0,
32130.0, 32129.0, 32129.0, 32129.0, 32130.0, 32131.0, 32132.0, 32132.0,
32133.0, 32133.0, 32133.0, 32133.0, 32134.0, 32134.0, 32134.0, 32134.0,
32134.0, 32135.0, 32134.0, 32134.0, 32134.0, 32134.0, 32134.0, 32134.0,
32135.0, 32136.0, 32137.0, 32138.0, 32138.0, 32138.0, 32139.0, 32139.0,
32139.0, 32139.0, 32140.0, 32140.0, 32140.0, 32140.0, 32140.0, 32139.0,
32139.0, 32139.0, 32139.0, 32140.0, 32141.0, 32141.0, 32142.0, 32142.0,
32142.0, 32143.0, 32143.0, 32144.0, 32144.0, 32144.0, 32144.0, 32145.0,
32145.0, 32145.0, 32144.0, 32144.0, 32143.0, 32144.0, 32144.0, 32144.0,
32146.0, 32146.0, 32147.0, 32148.0, 32148.0, 32148.0, 32148.0, 32149.0,
32149.0, 32149.0, 32149.0, 32149.0, 32149.0, 32149.0, 32148.0, 32148.0,
32148.0, 32149.0, 32150.0, 32151.0, 32151.0, 32151.0, 32152.0, 32152.0,
32152.0, 32153.0, 32153.0, 32153.0, 32154.0, 32154.0, 32154.0, 32154.0,
32154.0, 32153.0, 32152.0, 32152.0, 32153.0, 32154.0, 32155.0, 32155.0,
32156.0, 32156.0, 32156.0, 32156.0, 32157.0, 32157.0, 32157.0, 32158.0,
32158.0, 32158.0, 32158.0, 32157.0, 32157.0, 32157.0, 32157.0, 32158.0,
32158.0, 32159.0, 32160.0, 32160.0, 32160.0, 32161.0, 32161.0, 32161.0,
32161.0, 32161.0, 32161.0, 32161.0, 32161.0, 32161.0, 32161.0, 32161.0,
32160.0, 32160.0, 32160.0, 32161.0, 32162.0, 32163.0, 32163.0, 32164.0,
32164.0, 32164.0, 32164.0, 32165.0, 32165.0, 32165.0, 32166.0, 32166.0,
32166.0, 32167.0, 32166.0, 32166.0, 32166.0, 32166.0, 32166.0, 32167.0,
32168.0, 32168.0, 32169.0, 32169.0, 32169.0, 32169.0, 32170.0, 32170.0,
32170.0, 32170.0, 32170.0, 32170.0, 32170.0, 32170.0, 32170.0, 32169.0,
32169.0, 32170.0, 32171.0, 32172.0, 32172.0, 32172.0, 32173.0, 32173.0,
32174.0, 32174.0, 32174.0, 32174.0, 32175.0, 32175.0, 32175.0, 32175.0,
32175.0, 32175.0, 32174.0, 32174.0, 32175.0, 32176.0, 32176.0, 32177.0,
32177.0, 32177.0, 32177.0, 32178.0, 32178.0, 32178.0, 32178.0, 32179.0,
32179.0, 32179.0, 32179.0, 32179.0, 32179.0, 32178.0, 32178.0, 32179.0,
32179.0, 32180.0, 32181.0, 32181.0, 32182.0, 32182.0, 32183.0, 32183.0,
32183.0, 32183.0, 32183.0, 32183.0, 32183.0, 32183.0, 32184.0, 32183.0,
32182.0, 32182.0, 32182.0, 32183.0, 32184.0, 32185.0, 32185.0, 32186.0,
32186.0, 32186.0, 32186.0, 32187.0, 32187.0, 32187.0, 32188.0, 32188.0,
32188.0, 32188.0, 32188.0, 32188.0, 32187.0, 32187.0, 32188.0, 32189.0,
32190.0, 32191.0, 32191.0, 32192.0, 32192.0, 32192.0, 32192.0, 32192.0,
32192.0, 32193.0, 32193.0, 32193.0, 32193.0, 32192.0, 32192.0, 32191.0,
32192.0, 32193.0, 32194.0, 32194.0, 32195.0, 32195.0, 32195.0, 32195.0,
32196.0, 32196.0, 32197.0, 32197.0, 32198.0, 32198.0, 32198.0, 32198.0,
32197.0, 32196.0, 32196.0, 32195.0, 32196.0, 32197.0, 32199.0, 32199.0,
32200.0, 32200.0, 32200.0, 32200.0, 32200.0, 32201.0, 32201.0, 32201.0,
32201.0, 32202.0, 32202.0, 32201.0, 32201.0, 32200.0, 32200.0, 32201.0,
32201.0, 32202.0, 32203.0, 32203.0, 32203.0, 32204.0, 32204.0, 32204.0,
32204.0, 32205.0, 32205.0, 32205.0, 32206.0, 32206.0, 32205.0, 32205.0,
32204.0, 32204.0, 32205.0, 32206.0, 32208.0, 32209.0, 32209.0, 32209.0,
32209.0, 32209.0, 32210.0, 32210.0, 32210.0, 32210.0, 32210.0, 32211.0,
32211.0, 32211.0, 32210.0, 32210.0, 32210.0, 32210.0, 32211.0, 32212.0,
32213.0, 32213.0, 32213.0, 32214.0, 32214.0, 32214.0, 32215.0, 32215.0,
32215.0, 32215.0, 32216.0, 32216.0, 32216.0, 32216.0, 32215.0, 32214.0,
32214.0, 32215.0, 32216.0, 32217.0, 32218.0, 32218.0, 32218.0, 32219.0,
32219.0, 32220.0, 32220.0, 32220.0, 32220.0, 32221.0, 32221.0, 32221.0,
32221.0, 32221.0, 32221.0, 32221.0, 32222.0, 32223.0, 32224.0, 32225.0,
32225.0, 32225.0, 32225.0, 32225.0, 32225.0, 32226.0, 32226.0, 32227.0,
32227.0, 32227.0, 32227.0, 32227.0, 32226.0, 32226.0, 32226.0, 32227.0,
32227.0, 32228.0, 32229.0, 32229.0, 32230.0, 32230.0, 32230.0, 32230.0,
32230.0, 32230.0, 32231.0, 32231.0, 32231.0, 32232.0, 32231.0, 32231.0,
32230.0, 32230.0, 32231.0, 32232.0, 32233.0, 32235.0, 32235.0, 32235.0,
32236.0, 32236.0, 32236.0, 32236.0, 32236.0, 32236.0, 32236.0, 32236.0,
32236.0, 32236.0, 32235.0, 32235.0, 32234.0, 32235.0, 32235.0, 32236.0,
32237.0, 32237.0, 32237.0, 32237.0, 32238.0, 32238.0, 32238.0, 32238.0,
32239.0, 32239.0, 32239.0, 32239.0, 32239.0, 32238.0, 32238.0, 32238.0,
32238.0, 32239.0, 32240.0, 32241.0, 32241.0, 32241.0, 32241.0, 32241.0,
32241.0, 32242.0, 32242.0, 32243.0, 32243.0, 32243.0, 32243.0, 32243.0,
32242.0, 32242.0, 32241.0, 32242.0, 32242.0, 32243.0, 32244.0, 32244.0,
32244.0, 32245.0, 32245.0, 32245.0, 32245.0, 32246.0, 32246.0, 32246.0,
32246.0, 32247.0, 32246.0, 32246.0, 32245.0, 32245.0, 32245.0, 32246.0,
32247.0, 32248.0, 32249.0, 32249.0, 32249.0, 32250.0, 32250.0, 32250.0,
32250.0, 32250.0, 32250.0, 32251.0, 32251.0, 32251.0, 32250.0, 32250.0,
32249.0, 32249.0, 32249.0, 32250.0, 32251.0, 32252.0, 32252.0, 32253.0,
32253.0, 32253.0, 32253.0, 32254.0, 32254.0, 32254.0, 32254.0, 32254.0,
32254.0, 32254.0, 32253.0, 32253.0, 32252.0, 32253.0, 32254.0, 32255.0,
32255.0, 32256.0, 32256.0, 32256.0, 32256.0, 32256.0, 32256.0, 32257.0,
32257.0, 32257.0, 32257.0, 32257.0, 32257.0, 32257.0, 32256.0, 32256.0,
32256.0, 32257.0, 32258.0, 32259.0, 32259.0, 32259.0, 32260.0, 32260.0,
32260.0, 32260.0, 32261.0, 32261.0, 32261.0, 32261.0, 32262.0, 32261.0,
32261.0, 32260.0, 32260.0, 32260.0, 32261.0, 32262.0, 32262.0, 32263.0,
32263.0, 32263.0, 32263.0, 32263.0, 32264.0, 32264.0, 32264.0, 32264.0,
32264.0, 32265.0, 32265.0, 32264.0, 32264.0, 32263.0, 32263.0, 32264.0,
32265.0, 32266.0, 32266.0, 32267.0, 32267.0, 32267.0, 32267.0, 32267.0,
32267.0, 32267.0, 32268.0, 32268.0, 32268.0, 32267.0, 32267.0, 32267.0,
32266.0, 32266.0, 32267.0, 32267.0, 32268.0, 32269.0, 32269.0, 32270.0,
32270.0, 32270.0, 32271.0, 32271.0, 32271.0, 32271.0, 32271.0, 32271.0,
32271.0, 32271.0, 32271.0, 32271.0, 32270.0, 32271.0, 32272.0, 32274.0,
32275.0, 32276.0, 32276.0, 32276.0, 32276.0, 32276.0, 32276.0, 32276.0,
32276.0, 32276.0, 32277.0, 32277.0, 32276.0, 32276.0, 32275.0, 32274.0,
32274.0, 32275.0, 32276.0, 32278.0, 32278.0, 32278.0, 32278.0, 32278.0,
32278.0, 32278.0, 32278.0, 32278.0, 32278.0, 32278.0, 32279.0, 32279.0,
32278.0, 32278.0, 32277.0, 32277.0, 32278.0, 32279.0, 32279.0, 32280.0,
32280.0, 32280.0, 32280.0, 32281.0, 32281.0, 32281.0, 32281.0, 32281.0,
32281.0, 32282.0, 32282.0, 32281.0, 32281.0, 32281.0, 32281.0, 32282.0,
32283.0, 32283.0, 32284.0, 32284.0, 32284.0, 32285.0, 32285.0, 32285.0,
32285.0, 32285.0, 32286.0, 32286.0, 32287.0, 32287.0, 32286.0, 32285.0,
32285.0, 32284.0, 32285.0, 32286.0, 32287.0, 32288.0, 32288.0, 32288.0,
32288.0, 32289.0, 32289.0, 32290.0, 32290.0, 32290.0, 32290.0, 32290.0,
32290.0, 32290.0, 32290.0, 32290.0, 32290.0, 32290.0, 32291.0, 32291.0,
32292.0, 32292.0, 32292.0, 32292.0, 32292.0, 32293.0, 32293.0, 32293.0,
32293.0, 32294.0, 32294.0, 32295.0, 32294.0, 32294.0, 32293.0, 32292.0,
32292.0, 32293.0, 32294.0, 32295.0, 32296.0, 32296.0, 32296.0, 32296.0,
32296.0, 32296.0, 32297.0, 32297.0, 32298.0, 32298.0, 32298.0, 32298.0,
32297.0, 32296.0, 32296.0, 32296.0, 32297.0, 32298.0, 32299.0, 32299.0,
32299.0, 32300.0, 32300.0, 32300.0, 32300.0, 32300.0, 32300.0, 32300.0,
32301.0, 32301.0, 32301.0, 32300.0, 32300.0, 32299.0, 32299.0, 32300.0,
32301.0, 32302.0, 32303.0, 32303.0, 32304.0, 32304.0, 32304.0, 32305.0,
32305.0, 32305.0, 32305.0, 32305.0, 32305.0, 32305.0, 32304.0, 32304.0,
32303.0, 32303.0, 32304.0, 32304.0, 32305.0, 32306.0, 32306.0, 32306.0,
32307.0, 32307.0, 32307.0, 32307.0, 32306.0, 32291.0, 32238.0, 32137.0,
31982.0, 31786.0, 31572.0, 31357.0, 31150.0, 30957.0, 30781.0, 30620.0,
30476.0, 30346.0, 30231.0, 30128.0, 30037.0, 29956.0, 29884.0, 29819.0,
29762.0, 29710.0, 29664.0, 29623.0, 29586.0, 29550.0, 29518.0, 29490.0,
29465.0, 29443.0, 29424.0, 29405.0, 29387.0, 29370.0, 29355.0, 29341.0,
29327.0, 29315.0, 29304.0, 29293.0, 29283.0, 29273.0, 29264.0, 29255.0,
29246.0, 29238.0, 29230.0, 29224.0, 29218.0, 29214.0, 29209.0, 29204.0,
29198.0, 29193.0, 29188.0, 29184.0, 29179.0, 29175.0, 29171.0, 29168.0,
29164.0, 29160.0, 29156.0, 29152.0, 29148.0, 29144.0, 29141.0, 29139.0,
29138.0, 29136.0, 29133.0, 29130.0, 29128.0, 29125.0, 29123.0, 29121.0,
29119.0, 29117.0, 29115.0, 29113.0, 29111.0, 29109.0, 29106.0, 29104.0,
29102.0, 29100.0, 29099.0, 29100.0, 29099.0, 29098.0, 29096.0, 29095.0,
29093.0, 29092.0, 29091.0, 29090.0, 29089.0, 29088.0, 29087.0, 29086.0,
29085.0, 29083.0, 29081.0, 29079.0, 29078.0, 29077.0, 29077.0, 29078.0,
29077.0, 29077.0, 29076.0, 29075.0, 29074.0, 29073.0, 29073.0, 29072.0,
29071.0, 29071.0, 29070.0, 29069.0, 29068.0, 29067.0, 29066.0, 29065.0,
29064.0, 29065.0, 29065.0, 29065.0, 29065.0, 29065.0, 29064.0, 29064.0,
29063.0, 29063.0, 29063.0, 29063.0, 29062.0, 29062.0, 29062.0, 29061.0,
29061.0, 29060.0, 29060.0, 29061.0, 29062.0, 29063.0, 29065.0, 29066.0,
29067.0, 29068.0, 29070.0, 29071.0, 29073.0, 29075.0, 29077.0, 29080.0,
29083.0, 29086.0, 29089.0, 29093.0, 29096.0, 29100.0, 29106.0, 29112.0,
29120.0, 29128.0, 29137.0, 29146.0, 29155.0, 29165.0, 29177.0, 29189.0,
29202.0, 29216.0, 29232.0, 29248.0, 29266.0, 29285.0, 29305.0, 29327.0,
29349.0, 29374.0, 29401.0, 29431.0, 29462.0, 29495.0, 29529.0, 29565.0,
29602.0, 29642.0, 29684.0, 29728.0, 29774.0, 29822.0, 29873.0, 29926.0,
29980.0, 30036.0, 30094.0, 30153.0, 30215.0, 30280.0, 30347.0, 30416.0,
30487.0, 30558.0, 30631.0, 30706.0, 30782.0, 30859.0, 30937.0, 31016.0,
31097.0, 31178.0, 31260.0, 31343.0, 31425.0, 31508.0, 31590.0, 31673.0,
31756.0, 31840.0, 31924.0, 32007.0, 32089.0, 32170.0, 32250.0, 32330.0,
32408.0, 32485.0, 32561.0, 32636.0, 32709.0, 32781.0, 32851.0, 32919.0,
32985.0, 33049.0, 33112.0, 33172.0, 33232.0, 33290.0, 33345.0, 33399.0,
33449.0, 33497.0, 33543.0, 33586.0, 33628.0, 33667.0, 33703.0, 33737.0,
33768.0, 33797.0, 33824.0, 33847.0, 33868.0, 33886.0, 33903.0, 33918.0,
33930.0, 33940.0, 33948.0, 33952.0, 33954.0, 33954.0, 33950.0, 33945.0,
33937.0, 33926.0, 33913.0, 33898.0, 33881.0, 33861.0, 33839.0, 33814.0,
33787.0, 33758.0, 33727.0, 33695.0, 33661.0, 33624.0, 33586.0, 33545.0,
33502.0, 33458.0, 33411.0, 33363.0, 33313.0, 33262.0, 33209.0, 33154.0,
33099.0, 33041.0, 32982.0, 32921.0, 32860.0, 32798.0, 32737.0, 32674.0,
32610.0, 32545.0, 32478.0, 32412.0, 32345.0, 32278.0, 32210.0, 32142.0,
32074.0, 32006.0, 31938.0, 31870.0, 31802.0, 31733.0, 31665.0, 31598.0,
31531.0, 31466.0, 31402.0, 31338.0, 31274.0, 31211.0, 31149.0, 31088.0,
31028.0, 30969.0, 30911.0, 30854.0, 30798.0, 30743.0, 30690.0, 30638.0,
30586.0, 30535.0, 30486.0, 30438.0, 30393.0, 30349.0, 30306.0, 30264.0,
30224.0, 30184.0, 30146.0, 30109.0, 30074.0, 30039.0, 30006.0, 29973.0,
29942.0, 29912.0, 29883.0, 29854.0, 29826.0, 29800.0, 29775.0, 29752.0,
29730.0, 29708.0, 29687.0, 29667.0, 29647.0, 29629.0, 29611.0, 29594.0,
29577.0, 29561.0, 29546.0, 29531.0, 29517.0, 29503.0, 29489.0, 29476.0,
29463.0, 29451.0, 29441.0, 29431.0, 29422.0, 29412.0, 29403.0, 29394.0,
29385.0, 29377.0, 29369.0, 29362.0, 29354.0, 29347.0, 29340.0, 29333.0,
29326.0, 29320.0, 29313.0, 29307.0, 29301.0, 29296.0, 29291.0, 29287.0,
29282.0, 29278.0, 29273.0, 29269.0, 29265.0, 29261.0, 29257.0, 29253.0,
29249.0, 29245.0, 29242.0, 29239.0, 29235.0, 29231.0, 29227.0, 29223.0,
29221.0, 29219.0, 29216.0, 29214.0, 29211.0, 29209.0, 29206.0, 29204.0,
29201.0, 29199.0, 29197.0, 29195.0, 29192.0, 29190.0, 29188.0, 29186.0,
29183.0, 29181.0, 29179.0, 29177.0, 29176.0, 29175.0, 29173.0, 29171.0,
29169.0, 29168.0, 29166.0, 29165.0, 29163.0, 29162.0, 29160.0, 29159.0,
29157.0, 29156.0, 29154.0, 29152.0, 29150.0, 29148.0, 29147.0, 29146.0,
29146.0, 29145.0, 29144.0, 29142.0, 29141.0, 29139.0, 29139.0, 29138.0,
29137.0, 29136.0, 29135.0, 29134.0, 29133.0, 29131.0, 29129.0, 29127.0,
29126.0, 29125.0, 29124.0, 29125.0, 29124.0, 29124.0, 29123.0, 29121.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29119.0, 29119.0, 29118.0, 29117.0, 29116.0, 29115.0,
29115.0, 29113.0, 29112.0, 29110.0, 29109.0, 29109.0, 29109.0, 29109.0,
29109.0, 29108.0, 29108.0, 29107.0, 29106.0, 29106.0, 29105.0, 29104.0,
29103.0, 29103.0, 29102.0, 29101.0, 29100.0, 29099.0, 29096.0, 29095.0,
29094.0, 29094.0, 29094.0, 29094.0, 29094.0, 29093.0, 29093.0, 29092.0,
29091.0, 29091.0, 29090.0, 29089.0, 29089.0, 29088.0, 29088.0, 29087.0,
29085.0, 29084.0, 29083.0, 29082.0, 29083.0, 29083.0, 29084.0, 29084.0,
29083.0, 29083.0, 29082.0, 29082.0, 29082.0, 29081.0, 29081.0, 29080.0,
29081.0, 29081.0, 29081.0, 29081.0, 29080.0, 29080.0, 29081.0, 29082.0,
29083.0, 29085.0, 29085.0, 29086.0, 29088.0, 29089.0, 29091.0, 29092.0,
29094.0, 29096.0, 29099.0, 29101.0, 29104.0, 29107.0, 29109.0, 29113.0,
29117.0, 29121.0, 29127.0, 29133.0, 29140.0, 29147.0, 29153.0, 29161.0,
29169.0, 29177.0, 29187.0, 29197.0, 29208.0, 29220.0, 29232.0, 29245.0,
29259.0, 29274.0, 29289.0, 29306.0, 29324.0, 29344.0, 29366.0, 29389.0,
29412.0, 29437.0, 29462.0, 29489.0, 29518.0, 29548.0, 29580.0, 29613.0,
29647.0, 29684.0, 29722.0, 29762.0, 29803.0, 29846.0, 29890.0, 29937.0,
29986.0, 30038.0, 30091.0, 30147.0, 30203.0, 30260.0, 30320.0, 30381.0,
30444.0, 30509.0, 30576.0, 30644.0, 30713.0, 30784.0, 30856.0, 30929.0,
31004.0, 31079.0, 31156.0, 31235.0, 31315.0, 31396.0, 31478.0, 31559.0,
31641.0, 31724.0, 31807.0, 31889.0, 31972.0, 32056.0, 32140.0, 32223.0,
32307.0, 32389.0, 32472.0, 32553.0, 32633.0, 32713.0, 32793.0, 32873.0,
32953.0, 33031.0, 33108.0, 33184.0, 33259.0, 33333.0, 33405.0, 33477.0,
33546.0, 33615.0, 33683.0, 33748.0, 33813.0, 33875.0, 33936.0, 33995.0,
34052.0, 34109.0, 34165.0, 34220.0, 34273.0, 34323.0, 34371.0, 34418.0,
34462.0, 34506.0, 34547.0, 34588.0, 34626.0, 34662.0, 34696.0, 34728.0,
34759.0, 34787.0, 34813.0, 34837.0, 34860.0, 34883.0, 34903.0, 34921.0,
34938.0, 34952.0, 34965.0, 34976.0, 34984.0, 34991.0, 34996.0, 34999.0,
35000.0, 35000.0, 34998.0, 34994.0, 34988.0, 34979.0, 34969.0, 34958.0,
34945.0, 34932.0, 34917.0, 34899.0, 34880.0, 34859.0, 34836.0, 34811.0,
34785.0, 34758.0, 34729.0, 34698.0, 34666.0, 34633.0, 34597.0, 34561.0,
34522.0, 34481.0, 34440.0, 34398.0, 34356.0, 34312.0, 34267.0, 34219.0,
34170.0, 34121.0, 34070.0, 34018.0, 33965.0, 33911.0, 33857.0, 33801.0,
33744.0, 33687.0, 33628.0, 33568.0, 33507.0, 33446.0, 33385.0, 33324.0,
33262.0, 33200.0, 33137.0, 33073.0, 33009.0, 32945.0, 32880.0, 32815.0,
32750.0, 32685.0, 32619.0, 32555.0, 32489.0, 32424.0, 32358.0, 32292.0,
32226.0, 32162.0, 32098.0, 32035.0, 31972.0, 31909.0, 31846.0, 31784.0,
31723.0, 31662.0, 31602.0, 31542.0, 31483.0, 31425.0, 31367.0, 31311.0,
31255.0, 31199.0, 31144.0, 31089.0, 31036.0, 30984.0, 30934.0, 30885.0,
30837.0, 30789.0, 30742.0, 30695.0, 30650.0, 30606.0, 30563.0, 30520.0,
30479.0, 30438.0, 30399.0, 30360.0, 30323.0, 30285.0, 30249.0, 30214.0,
30181.0, 30149.0, 30118.0, 30087.0, 30057.0, 30028.0, 29999.0, 29972.0,
29945.0, 29919.0, 29893.0, 29869.0, 29845.0, 29822.0, 29800.0, 29778.0,
29756.0, 29735.0, 29714.0, 29696.0, 29678.0, 29661.0, 29644.0, 29628.0,
29612.0, 29596.0, 29581.0, 29566.0, 29552.0, 29538.0, 29524.0, 29512.0,
29499.0, 29487.0, 29475.0, 29463.0, 29451.0, 29439.0, 29429.0, 29419.0,
29410.0, 29401.0, 29393.0, 29384.0, 29375.0, 29367.0, 29358.0, 29351.0,
29343.0, 29335.0, 29328.0, 29321.0, 29314.0, 29307.0, 29300.0, 29292.0,
29285.0, 29279.0, 29274.0, 29269.0, 29264.0, 29259.0, 29254.0, 29248.0,
29243.0, 29238.0, 29233.0, 29228.0, 29223.0, 29219.0, 29214.0, 29210.0,
29205.0, 29200.0, 29195.0, 29191.0, 29186.0, 29183.0, 29181.0, 29178.0,
29175.0, 29171.0, 29167.0, 29164.0, 29160.0, 29157.0, 29153.0, 29150.0,
29147.0, 29143.0, 29141.0, 29138.0, 29134.0, 29131.0, 29127.0, 29124.0,
29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0,
29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0,
29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0,
29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0,
29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0, 29122.0,
29122.0, 29122.0, 29121.0, 29120.0, 29119.0, 29118.0, 29117.0, 29116.0,
29115.0, 29114.0, 29113.0, 29112.0, 29112.0, 29111.0, 29109.0, 29108.0,
29107.0, 29106.0, 29106.0, 29106.0, 29106.0, 29106.0, 29106.0, 29105.0,
29105.0, 29104.0, 29104.0, 29104.0, 29104.0, 29103.0, 29103.0, 29103.0,
29103.0, 29102.0, 29102.0, 29101.0, 29101.0, 29102.0, 29103.0, 29104.0,
29105.0, 29105.0, 29106.0, 29107.0, 29107.0, 29108.0, 29110.0, 29111.0,
29112.0, 29113.0, 29114.0, 29116.0, 29117.0, 29118.0, 29119.0, 29121.0,
29124.0, 29127.0, 29130.0, 29134.0, 29137.0, 29140.0, 29143.0, 29147.0,
29151.0, 29155.0, 29159.0, 29164.0, 29169.0, 29174.0, 29179.0, 29185.0,
29191.0, 29196.0, 29203.0, 29210.0, 29218.0, 29227.0, 29235.0, 29244.0,
29253.0, 29262.0, 29271.0, 29281.0, 29291.0, 29302.0, 29313.0, 29324.0,
29336.0, 29349.0, 29362.0, 29374.0, 29387.0, 29401.0, 29415.0, 29431.0,
29448.0, 29464.0, 29481.0, 29498.0, 29515.0, 29532.0, 29550.0, 29568.0,
29587.0, 29606.0, 29626.0, 29645.0, 29666.0, 29687.0, 29707.0, 29728.0,
29749.0, 29771.0, 29794.0, 29817.0, 29841.0, 29864.0, 29888.0, 29911.0,
29935.0, 29960.0, 29984.0, 30008.0, 30033.0, 30057.0, 30081.0, 30106.0,
30131.0, 30155.0, 30179.0, 30202.0, 30227.0, 30252.0, 30277.0, 30302.0,
30326.0, 30350.0, 30373.0, 30397.0, 30421.0, 30444.0, 30466.0, 30489.0,
30510.0, 30532.0, 30553.0, 30574.0, 30594.0, 30613.0, 30632.0, 30651.0,
30670.0, 30689.0, 30708.0, 30726.0, 30743.0, 30759.0, 30774.0, 30789.0,
30803.0, 30816.0, 30830.0, 30842.0, 30854.0, 30865.0, 30876.0, 30885.0,
30894.0, 30902.0, 30910.0, 30918.0, 30925.0, 30932.0, 30938.0, 30943.0,
30947.0, 30950.0, 30953.0, 30955.0, 30956.0, 30956.0, 30956.0, 30955.0,
30953.0, 30951.0, 30948.0, 30943.0, 30938.0, 30932.0, 30926.0, 30922.0,
30916.0, 30909.0, 30901.0, 30892.0, 30883.0, 30873.0, 30863.0, 30852.0,
30840.0, 30828.0, 30816.0, 30803.0, 30789.0, 30775.0, 30759.0, 30743.0,
30727.0, 30711.0, 30695.0, 30680.0, 30663.0, 30646.0, 30628.0, 30610.0,
30591.0, 30572.0, 30553.0, 30534.0, 30514.0, 30494.0, 30474.0, 30454.0,
30434.0, 30413.0, 30391.0, 30370.0, 30349.0, 30328.0, 30308.0, 30288.0,
30268.0, 30247.0, 30226.0, 30205.0, 30183.0, 30162.0, 30141.0, 30120.0,
30099.0, 30079.0, 30058.0, 30038.0, 30017.0, 29996.0, 29975.0, 29955.0,
29935.0, 29917.0, 29898.0, 29880.0, 29861.0, 29843.0, 29824.0, 29806.0,
29789.0, 29772.0, 29755.0, 29738.0, 29721.0, 29705.0, 29689.0, 29672.0,
29656.0, 29640.0, 29624.0, 29610.0, 29597.0, 29583.0, 29570.0, 29557.0,
29544.0, 29531.0, 29519.0, 29507.0, 29495.0, 29483.0, 29472.0, 29461.0,
29451.0, 29440.0, 29430.0, 29419.0, 29409.0, 29399.0, 29390.0, 29382.0,
29375.0, 29367.0, 29359.0, 29352.0, 29344.0, 29337.0, 29329.0, 29322.0,
29316.0, 29309.0, 29302.0, 29297.0, 29291.0, 29285.0, 29280.0, 29273.0,
29267.0, 29262.0, 29258.0, 29255.0, 29251.0, 29247.0, 29243.0, 29239.0,
29235.0, 29231.0, 29228.0, 29224.0, 29221.0, 29218.0, 29214.0, 29211.0,
29208.0, 29204.0, 29200.0, 29196.0, 29193.0, 29192.0, 29191.0, 29190.0,
29188.0, 29185.0, 29183.0, 29181.0, 29179.0, 29178.0, 29176.0, 29174.0,
29173.0, 29171.0, 29169.0, 29168.0, 29166.0, 29163.0, 29161.0, 29160.0,
29159.0, 29159.0, 29158.0, 29157.0, 29156.0, 29155.0, 29154.0, 29153.0,
29152.0, 29151.0, 29150.0, 29149.0, 29148.0, 29147.0, 29146.0, 29145.0,
29143.0, 29142.0, 29141.0, 29140.0, 29141.0, 29141.0, 29140.0, 29140.0,
29139.0, 29139.0, 29138.0, 29137.0, 29137.0, 29136.0, 29136.0, 29136.0,
29135.0, 29135.0, 29134.0, 29133.0, 29132.0, 29130.0, 29130.0, 29130.0,
29130.0, 29130.0, 29131.0, 29130.0, 29130.0, 29129.0, 29129.0, 29128.0,
29128.0, 29127.0, 29127.0, 29127.0, 29127.0, 29126.0, 29125.0, 29124.0,
29123.0, 29123.0, 29123.0, 29124.0, 29124.0, 29124.0, 29124.0, 29124.0,
29124.0, 29124.0, 29123.0, 29123.0, 29123.0, 29123.0, 29123.0, 29123.0,
29122.0, 29121.0, 29120.0, 29119.0, 29119.0, 29120.0, 29120.0, 29121.0,
29121.0, 29121.0, 29121.0, 29121.0, 29121.0, 29121.0, 29121.0, 29121.0,
29121.0, 29120.0, 29120.0, 29119.0, 29119.0, 29118.0, 29118.0, 29118.0,
29118.0, 29118.0, 29119.0, 29119.0, 29119.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0,
29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0, 29120.0
]
}
],
"yunit": 48,
"xinterval": 1.0,
"xunit": 49,
"ymax": 35000.0
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

@ -1,15 +1,19 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<title>视频监控可视化平台</title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
<strong
>We're sorry but 视频监控可视化平台 doesn't work properly without
JavaScript enabled. Please enable it to continue.</strong
>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->

@ -1,10 +1,119 @@
<template>
<div id="app">
<router-view />
<div id="app" :class="mobelH == 1 ? 'zoomclass' : ''">
<router-view></router-view>
</div>
</template>
<script>
import { mapActions } from "vuex";
export default {
name: "App",
data() {
return { mobelH: 0 };
},
mounted() {
this.isMobile2();
let goUrl = this.isMobile();
if (goUrl === 1) {
this.$confirm(
"您正在使用手机访问本站,可能无法获得最佳浏览体验, 即将跳转到手机端...",
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
customClass: "phonemesBox",
}
)
.then(() => {
// this.$message({
// type: "success",
// message: "!",
// });
//
location = "http://61.169.135.146:40080/phone/#/login";
})
.catch(() => {
// this.$message({
// type: "info",
// message: "",
// });
});
}
},
methods: {
...mapActions("cache", ["addCache", "removeCache"]),
//
collectCaches() {
//
this.$route.matched.forEach((routeMatch) => {
const instance = routeMatch.components?.default;
const componentName = instance?.name;
console.log(componentName);
if (process.env.NODE_ENV === "development") {
this.checkRouteComponentName(componentName, instance?.__file);
}
// meta.keepAlive
if (routeMatch.meta.keepAlive) {
if (!componentName) {
console.warn(`${routeMatch.path} 路由的组件名称name为空`);
return;
}
this.addCache(componentName);
} else {
this.removeCache(componentName);
}
});
},
//
checkRouteComponentName(name, file) {
if (!this.cmpNames) this.cmpNames = {};
if (this.cmpNames[name]) {
if (this.cmpNames[name] !== file) {
console.warn(
`${file}${this.cmpNames[name]} 组件名称重复: ${name}`
);
}
} else {
this.cmpNames[name] = file;
}
},
isMobile() {
let flag = navigator.userAgent.match(
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
);
// localStorage.setItem('isiphone',flag)
localStorage.setItem("ismobile", flag ? 1 : 0);
let goUrl = flag ? 1 : 0;
return goUrl;
},
isMobile2() {
let flag = navigator.userAgent.match(
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
);
// localStorage.setItem('isiphone',flag)
this.mobelH = flag ? 1 : 0;
},
},
watch: {
"$route.path": {
immediate: true,
handler() {
this.collectCaches();
},
},
},
};
</script>
<style lang="less">
#app {
.phonemesBox {
width: 80% !important;
max-width: 450px;
}
.zoomclass {
zoom: 0.6;
}
</style>

@ -0,0 +1,60 @@
<template>
<div class="error-page">
<div class="error-code">4<span>0</span>3</div>
<div class="error-desc">啊哦~ 你没有权限访问该页面哦</div>
<div class="error-handle">
<router-link to="/stritl">
<el-button type="primary" size="large">返回首页</el-button>
</router-link>
<el-button class="error-btn" type="primary" size="large" @click="goBack"
>返回上一页</el-button
>
</div>
</div>
</template>
<script>
export default {
methods: {
goBack() {
this.$router.go(-1);
},
},
};
</script>
<style lang="less">
.error-page {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
height: 100%;
background: #f3f3f3;
box-sizing: border-box;
.error-code {
line-height: 1;
font-size: 250px;
font-weight: bolder;
color: #f02d2d;
}
.error-code span {
color: #00a854;
}
.error-desc {
font-size: 30px;
color: #777;
}
.error-handle {
margin-top: 30px;
padding-bottom: 200px;
}
.el-button--primary {
width: auto !important;
}
.error-btn {
margin-left: 100px;
}
}
</style>

@ -78,3 +78,6 @@
.el-image-viewer__actions {
background: rgba(0, 0, 0, 0.15);
}
.el-form-item__label{
padding: 0 6px 0 0;
}

@ -1,5 +1,5 @@
//Brand @color
@color-primary: #169e8c;
@color-primary: #1c77ac;
@color-primary-light: mix(@color-white, @color-primary, 80%);
@color-primary-lighter: mix(@color-white, @color-primary, 90%);
//Functional @color

@ -2,7 +2,12 @@
margin: 0;
padding: 0;
}
img {
-webkit-user-select: none; /* Safari 3.1+ */
-moz-user-select: none; /* Firefox 2+ */
-ms-user-select: none; /* IE 10+ */
user-select: none; /* Standard syntax */
}
html,
body,
#app,
@ -30,18 +35,22 @@ a {
/* 整个滚动条 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb {
background-color: #ccc;
/* 关键代码 */
border-radius: 32px;
border-radius: 2px;
}
/* 滚动条轨道 */
::-webkit-scrollbar-track {
background-color: #f0f0f0;
border-radius: 32px;
border-radius: 2px;
}
.el-table__fixed,
.el-table__fixed-right {
height: auto !important;
bottom: 15px !important;
}

@ -0,0 +1,61 @@
@font-face {
font-family: "iconfont"; /* Project id */
src: url('iconfont.ttf?t=1690188947515') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-paizhao:before {
content: "\e6ba";
}
.icon-paizhao-xianxing:before {
content: "\e8d1";
}
.icon-tuiguanglishitupianjinqun:before {
content: "\e613";
}
.icon-gongsi:before {
content: "\e62e";
}
.icon-dianli:before {
content: "\e649";
}
.icon-dianlihangye:before {
content: "\e791";
}
.icon-shexiangtoulixian:before {
content: "\e7b2";
}
.icon-video-camera:before {
content: "\e962";
}
.icon-shexiangtou-lixian:before {
content: "\ef1c";
}
.icon-shexiangtou-zaixian:before {
content: "\ef1d";
}
.icon-shudianxianlu_2722010801:before {
content: "\efed";
}
.icon-tupian_normal:before {
content: "\e681";
}

@ -1,6 +1,6 @@
@font-face {
font-family: "iconfont"; /* Project id */
src: url('iconfont.ttf?t=1690188947515') format('truetype');
src: url('iconfont.ttf?t=1709789909096') format('truetype');
}
.iconfont {
@ -11,6 +11,10 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-1wenhe:before {
content: "\e653";
}
.icon-paizhao:before {
content: "\e6ba";
}
@ -27,6 +31,10 @@
content: "\e62e";
}
.icon-shudianxianlu:before {
content: "\e60a";
}
.icon-dianli:before {
content: "\e649";
}
@ -43,6 +51,10 @@
content: "\e962";
}
.icon-qixiang:before {
content: "\e67c";
}
.icon-shexiangtou-lixian:before {
content: "\ef1c";
}
@ -59,3 +71,7 @@
content: "\e681";
}
.icon-fubing:before {
content: "\e7ac";
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -1,11 +1,15 @@
<template>
<div class="wrapper">
<v-head></v-head>
<layout-tabs></layout-tabs>
<div class="content-box">
<div class="content">
<transition name="move" mode="out-in">
<router-view></router-view>
</transition>
<!-- <transition name="move" mode="out-in"> -->
<keep-alive :include="caches">
<router-view v-if="isRenderTab"></router-view>
</keep-alive>
<!-- </transition> -->
</div>
</div>
</div>
@ -13,13 +17,19 @@
<script>
import vHead from "./header.vue";
import LayoutTabs from "./LayoutTabs.vue";
import { mapState } from "vuex";
export default {
data() {
return {};
},
components: {
vHead,
LayoutTabs,
},
computed: {
...mapState("cache", ["caches"]),
...mapState(["isRenderTab"]),
},
created() {},
};
@ -31,7 +41,7 @@ export default {
position: absolute;
left: 0px;
right: 0;
top: 56px;
top: 92px;
bottom: 0;
//padding-bottom: 30px;
-webkit-transition: left 0.3s ease-in-out;

@ -0,0 +1,251 @@
<template>
<div class="layout-tabs">
<el-tabs
type="border-card"
v-model="curTabKey"
closable
@tab-click="clickTab"
@tab-remove="removeTab"
>
<el-tab-pane
v-for="item in tabs"
:label="item.title"
:name="item.tabKey"
:key="item.tabKey"
>
<template slot="label"
>{{ item.title }}
<i
v-if="curTabKey === item.tabKey"
class="el-icon-refresh"
@click="refreshTab(item)"
></i
></template>
</el-tab-pane>
</el-tabs>
<div class="close-tabs" @click="closeOtherTabs"></div>
</div>
</template>
<script>
import { mapMutations, mapActions } from "vuex";
import EventBus from "@/utils/event-bus";
export default {
name: "LayoutTabs",
props: {
// tab router-view
tabRouteViewDepth: {
type: Number,
default: 2,
},
// tabkeyroutekeytab
// matchRoute.path
getTabKey: {
type: Function,
default: function (routeMatch /* , route */) {
return routeMatch.path;
},
},
// tabmeta.title
tabTitleKey: {
type: String,
default: "title",
},
},
data() {
return {
tabs: [],
curTabKey: "",
};
},
methods: {
...mapActions("cache", ["addCache", "removeCache", "removeCacheEntry"]),
...mapMutations(["setIsRenderTab"]),
// tab
changeCurTab() {
//
const { path, query, params, hash, matched } = this.$route;
// tabmetacomponentName
const routeMatch = matched[this.tabRouteViewDepth - 1];
const meta = routeMatch.meta;
const componentName = routeMatch.components?.default?.name;
// tabtabKeykeytitle-tab-
const tabKey = this.getTabKey(routeMatch, this.$route);
const title = String(meta[this.tabTitleKey] || "");
const tab = this.tabs.find((tab) => tab.tabKey === tabKey);
if (!tabKey) {
// tabKeyname
console.warn(
`LayoutTabs组件${path} 路由没有匹配的tab标签页如有需要请配置tab标签页的key值`
);
return;
}
// route.path '/detail/:id'
// props.tabRouteViewDepth === matched.length tab
if (
tab &&
tab.path !== path &&
this.tabRouteViewDepth === matched.length
) {
this.removeCacheEntry(componentName || "");
tab.title = "";
}
const newTab = {
tabKey,
title: tab?.title || title,
path,
params,
query,
hash,
componentName,
};
tab ? Object.assign(tab, newTab) : this.tabs.push(newTab);
this.curTabKey = tabKey;
},
// tab
clickTab(pane) {
if (!pane.index) return;
const tab = this.tabs[Number(pane.index)];
if (tab.path !== this.$route.path) {
this.gotoTab(tab);
}
},
// tab
async removeTab(tabKey) {
//
if (this.tabs.length === 1) return;
const index = this.tabs.findIndex((tab) => tab.tabKey === tabKey);
if (index < -1) return;
const tab = this.tabs[index];
this.tabs.splice(index, 1);
// tabtab
if (tab.tabKey === this.curTabKey) {
const lastTab = this.tabs[this.tabs.length - 1];
lastTab && this.gotoTab(lastTab);
}
this.removeCache(tab.componentName || "");
},
// tab
async gotoTab(tab) {
await this.$router.push({
path: tab.path,
query: tab.query,
hash: tab.hash,
});
},
// tab
closeOtherTabs() {
this.tabs
.filter((tab) => tab.tabKey !== this.curTabKey)
.forEach((tab) => {
this.removeCache(tab.componentName || "");
});
this.tabs = this.tabs.filter((tab) => tab.tabKey === this.curTabKey);
},
// tab
async refreshTab(tab) {
this.setIsRenderTab(false);
await this.removeCacheEntry(tab.componentName);
this.setIsRenderTab(true);
},
// tab
async closeLayoutTab(tabKey = this.curTabKey) {
const index = this.tabs.findIndex((tab) => tab.tabKey === tabKey);
if (index > -1) {
this.removeCache(this.tabs[index].componentName);
this.tabs.splice(index, 1);
}
},
// tab
setCurTabTitle(title) {
const curTab = this.tabs.find((tab) => tab.tabKey === this.curTabKey);
if (curTab) {
curTab.title = title;
}
},
},
watch: {
"$route.path": {
handler() {
this.changeCurTab();
},
immediate: true,
},
},
created() {
// tab
EventBus.$on("LayoutTabs:closeTab", (tabKey) => {
this.closeLayoutTab(tabKey);
});
EventBus.$on("LayoutTabs:setTabTitle", (title) => {
this.setCurTabTitle(title);
});
},
};
</script>
<style lang="less">
.layout-tabs {
position: relative;
height: 32px;
line-height: 32px;
display: flex;
justify-content: space-between;
align-items: center;
background-color: #f5f7fa;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
//background-color: #fcc;
.close-tabs {
padding-right: 12px;
cursor: pointer;
color: #999;
height: 32px;
line-height: 32px;
font-size: 12px;
&:hover {
color: #169e8c;
}
}
.el-tabs--border-card {
height: 30px;
flex: 1;
margin-right: 12px;
border: 1px solid #dcdfe6;
box-shadow: none;
}
.el-icon-refresh {
margin: 0px 8px 0px 4px;
}
.el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
color: #fff;
background-color: #169e8c;
}
.el-tabs--border-card
> .el-tabs__header
.el-tabs__item:not(.is-disabled):hover {
color: #fff;
background-color: #169e8c;
}
.el-tabs__item .el-icon-close {
transition: none;
}
.el-tabs__item {
height: 30px;
line-height: 30px;
font-size: 12px;
padding: 0 10px !important;
}
.el-tabs__content {
display: none;
}
}
</style>

@ -63,7 +63,6 @@ export default {
index: "/realTimeMonitor",
title: "实时监控",
},
{
icon: "el-icon-film",
index: "/pictureRotation",
@ -74,106 +73,35 @@ export default {
index: "/photoAlarm",
title: "告警处理",
},
{
icon: "el-icon-search",
index: "/realTimeSearch",
title: "历史图片",
},
{
icon: "el-icon-files",
index: "/property",
title: "资产管理",
icon: "iconfont icon-fubing",
index: "/weatherIce",
title: "气象覆冰",
subs: [
{
index: "/lineInformation",
title: "线路信息管理",
},
{
index: "/towerInformation",
title: "杆塔信息管理",
},
{
index: "/cameraChannel",
title: "通道管理",
},
{
index: "/photographicDevice",
title: "拍照装置管理",
},
{
index: "/devicePhotoSchedule",
title: "拍照时间表设置",
},
{
index: "/deviceReport",
title: "装置报表",
index: "/weather",
title: "气象监测",
},
{
index: "/waterMark",
title: "水印下发",
index: "/icing",
title: "覆冰监测",
},
// {
// index: "/deviceUpgrade",
// title: "",
// },
// {
// icon: "el-icon-picture-outline",
// index: "imageSettings",
// title: "",
// },
],
},
{
icon: "el-icon-monitor",
index: "/system",
title: "系统管理",
subs: [
{
index: "/userManagement",
title: "用户管理",
},
{
index: "/globalTools",
title: "全局设置",
},
],
},
],
items1: [
{
icon: "el-icon-s-home",
index: "stritl",
title: "首页",
},
{
icon: "el-icon-camera",
index: "/realTimeMonitor",
title: "实时监控",
},
{
icon: "el-icon-film",
index: "/pictureRotation",
title: "图片轮巡",
},
{
icon: "el-icon-bell",
index: "/photoAlarm",
title: "告警处理",
},
{
icon: "el-icon-search",
index: "/realTimeSearch",
title: "历史图片",
},
{
icon: "el-icon-files",
index: "/property",
title: "资产管理",
subs: [
{
index: "/dyInformation",
title: "电压信息管理",
},
{
index: "/lineInformation",
title: "线路信息管理",
@ -189,21 +117,20 @@ export default {
},
{
index: "/photographicDevice",
title: "拍照装置管理",
title: "装置管理",
},
{
index: "/devicePhotoSchedule",
title: "拍照时间表设置",
},
// {
// index: "/deviceUpgrade",
// title: "",
// },
// {
// icon: "el-icon-picture-outline",
// index: "imageSettings",
// title: "",
// },
{
index: "/reportData",
title: "数据报表",
},
{
index: "/statisticalReport",
title: "统计报表",
},
],
},
{
@ -215,82 +142,47 @@ export default {
index: "/userManagement",
title: "用户管理",
},
// {
// index: "/globalTools",
// title: "",
// },
],
},
],
items2: [
{
icon: "el-icon-s-home",
index: "stritl",
title: "首页",
index: "/roleManagement",
title: "角色管理",
},
// {
// index: "/menuManagement",
// title: "",
// },
{
icon: "el-icon-camera",
index: "/realTimeMonitor",
title: "实时监控",
index: "/deviceUpgrade",
title: "升级管理",
},
{
icon: "el-icon-film",
index: "/pictureRotation",
title: "图片轮巡",
},
{
icon: "el-icon-bell",
index: "photoAlarm",
title: "告警处理",
},
{
icon: "el-icon-search",
index: "/realTimeSearch",
title: "历史图片",
index: "/globalTools",
title: "全局设置",
},
{
icon: "el-icon-files",
index: "/property",
title: "资产管理",
subs: [
{
index: "/lineInformation",
title: "线路信息管理",
index: "/waterMark",
title: "水印下发",
},
{
index: "/towerInformation",
title: "杆塔信息管理",
index: "/otherCommon",
title: "批量命令",
},
// {
// index: "/cameraChannel",
// title: "",
// },
{
index: "/photographicDevice",
title: "拍照装置管理",
index: "/aiWork",
title: "AI绘图",
},
{
index: "/devicePhotoSchedule",
title: "拍照时间表设置",
index: "/weatherIceConfig",
title: "覆冰微气象转发",
},
// {
// index: "/deviceUpgrade",
// title: "",
// },
// {
// icon: "el-icon-picture-outline",
// index: "imageSettings",
// title: "",
// },
],
},
],
role: "",
menuList: [],
};
},
watch: {
$route() {
this.setCurrentRoute();
@ -298,24 +190,131 @@ export default {
},
methods: {
setCurrentRoute() {
console.log(this.$route.path);
this.$nextTick(() => {
this.activeIndex = this.$route.path; //
console.log(this.activeIndex);
localStorage.setItem("menuActive", this.activeIndex);
});
},
getMenuArr(originalArray) {
const icons = {
stritl: "el-icon-s-home",
realTimeMonitor: "el-icon-camera",
pictureRotation: "el-icon-film",
photoAlarm: "el-icon-bell",
realTimeSearch: "el-icon-search",
// ...
default: "el-icon-default", //
};
const assetManagementSubs = []; //
const systemManagementSubs = []; //
const weatherManagementSubs = []; //
const newArray = [];
//
originalArray.forEach((item) => {
const { id, key, desc } = item;
console.log(key, desc);
const index = key.startsWith("/") ? key.substring(1) : key; //
// desc"-"
const processedDesc = desc.split("-")[0].trim();
console.log(index, processedDesc);
const icon = icons[index] || icons["default"]; // 使
if (
[
"dyInformation",
"lineInformation",
"towerInformation",
"cameraChannel",
"photographicDevice",
"devicePhotoSchedule",
"reportData",
].includes(index)
) {
// 线
assetManagementSubs.push({
index: "/" + index,
title: processedDesc,
});
} else if (
[
"userManagement",
"roleManagement",
"menuManagement",
"deviceUpgrade",
"globalTools",
"waterMark",
].includes(index)
) {
//
systemManagementSubs.push({
index: "/" + index,
title: processedDesc,
});
} else if (["weather", "icing"].includes(index)) {
//
weatherManagementSubs.push({
index: "/" + index,
title: processedDesc,
});
} else {
//
newArray.push({ icon, index: "/" + index, title: processedDesc });
}
});
//
if (weatherManagementSubs.length > 0) {
newArray.push({
icon: "iconfont icon-fubing",
index: "weatherIce",
title: "气象覆冰",
subs: weatherManagementSubs,
});
}
//
if (assetManagementSubs.length > 0) {
newArray.push({
icon: "el-icon-files",
index: "property",
title: "资产管理",
subs: assetManagementSubs,
});
}
//
if (systemManagementSubs.length > 0) {
newArray.push({
icon: "el-icon-setting", //
index: "system",
title: "系统管理",
subs: systemManagementSubs,
});
}
console.log("我是最后的", newArray);
//return newArray;
this.items = newArray;
},
},
created() {
console.log("我是被选中的", this.activeIndex);
this.setCurrentRoute();
this.role = localStorage.getItem("role");
console.log("用户管理");
console.log(this.role);
if (this.role == 0) {
if (this.role !== "0") {
this.menuList = JSON.parse(localStorage.getItem("menuPermission"));
console.log(this.menuList);
this.menuList.push({ id: 8, key: "/stritl", desc: "首页-菜单" });
this.menuList = this.menuList.sort((a, b) => a.id - b.id);
this.getMenuArr(this.menuList);
} else {
console.log("我是超管");
this.items = this.items;
} else if (this.role == 1) {
this.items = this.items1;
} else if (this.role == 2) {
this.items = this.items2;
}
console.log(this.items);
},
};
</script>
@ -335,6 +334,9 @@ export default {
}
.el-submenu__title {
padding: 0 10px;
.iconfont {
margin-right: 5px;
}
}
.el-dropdown-menu__item,
.el-menu-item,
@ -411,5 +413,12 @@ export default {
border: 1px solid #169e8c;
background-color: #169e8c;
}
.el-menu-item [class^="iconfont"] {
margin-right: 5px;
width: 24px;
text-align: center;
font-size: 18px;
vertical-align: middle;
}
}
</style>

@ -1,6 +1,7 @@
<template>
<div class="header">
<div class="logoTitle">视频监控可视化平台</div>
<div class="logoTitle" v-if="notes == '覆冰用户使用'">线</div>
<div class="logoTitle" v-else></div>
<div class="menuBox">
<vSidebar></vSidebar>
<div class="userInfo">
@ -41,6 +42,8 @@ export default {
data() {
return {
userName: localStorage.getItem("userName"),
role: localStorage.getItem("role"),
notes: localStorage.getItem("notes"),
};
},
methods: {

@ -6,9 +6,19 @@
:close-on-click-modal="false"
width="420px"
>
<el-form :model="psdForm" :rules="rules" ref="formInfo" label-position="left" label-width="80px">
<el-form
:model="psdForm"
:rules="rules"
ref="formInfo"
label-position="left"
label-width="80px"
>
<el-form-item label="用户名:">
<el-input v-model="psdForm.userName" autocomplete="off" :disabled="true"></el-input>
<el-input
v-model="psdForm.userName"
autocomplete="off"
:disabled="true"
></el-input>
</el-form-item>
<!-- <el-form-item label="原密码:">
<el-input v-model="psdForm.originalPsd" autocomplete="off"></el-input>
@ -31,9 +41,9 @@ import { updateUserApi } from "@/utils/api/index";
export default {
data() {
return {
isShow:false,
isShow: false,
psdForm: {
userName: localStorage.getItem('userName'),
userName: localStorage.getItem("userName"),
originalPsd: "",
newPsd: "",
password: "",
@ -54,12 +64,12 @@ export default {
submitForm() {
this.$refs.formInfo.validate((valid) => {
if (valid) {
this.$set(this.psdForm,'userId',localStorage.getItem('userid'))
this.$set(this.psdForm, "uid", localStorage.getItem("uid"));
updateUserApi(this.psdForm)
.then((res) => {
if (res.code == 200) {
this.$message.success("修改成功,请重新登录");
this.isShow = false
this.isShow = false;
this.$store.commit("REMOVE_INFO");
this.$router.push("/login");
} else {

@ -0,0 +1,576 @@
<template>
<div class="echartsBox">
<div class="gropName">
<!-- <el-checkbox-group v-model="checkList">
<el-checkbox
v-for="item in qtOption"
:label="item.groupName"
:key="item.groupName"
><span v-if="item.groupName == 'H2'">{{ item.groupName }}()</span>
<span v-if="item.groupName == 'CO'"
>{{ item.groupName }}(一氧化碳)</span
>
<span v-if="item.groupName == 'CH4'">{{ item.groupName }}()</span>
<span v-if="item.groupName == 'C2H4'"
>{{ item.groupName }}(乙烯)</span
>
<span v-if="item.groupName == 'C2H6'"
>{{ item.groupName }}(乙烷)</span
>
<span v-if="item.groupName == 'C2H2'"
>{{ item.groupName }}(乙炔)</span
></el-checkbox
>
</el-checkbox-group> -->
</div>
<div id="demo1"></div>
<div id="demo2"></div>
<div id="demo3"></div>
<div id="demo4"></div>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "",
data() {
return {
checkList: [], //
qtOption: [], //
myChart: "",
xData1: [], //
lineData1: [], //
yMax1: "", //y
channelCrests1: [], //
dataPointer1: [], //
xData2: [], //
lineData2: [], //
yMax2: "", //y
channelCrests2: [], //
dataPointer2: [], //
xData3: [], //
lineData3: [], //
yMax3: "", //y
channelCrests3: [], //
dataPointer3: [], //
xData4: [], //
lineData4: [], //
yMax4: "", //y
channelCrests4: [], //
dataPointer4: [], //
};
},
created() {
this.getMenuData1();
this.getMenuData2();
this.getMenuData3();
this.getMenuData4();
},
mounted() {},
watch: {},
methods: {
//1
getMenuData1() {
axios
.get("/aa.json")
.then((res) => {
console.log("getMenuData", res);
// this.qtOption = res.data.config.channels[0].crests;//
// console.log(this.qtOption);
this.lineData1 = res.data.data[0]; //
this.yMax1 = res.data.config.yMax; //y
this.channelCrests1 = res.data.config.channels[0].crests;
var timeSpan = 1; //
for (
var i = 0;
i < res.data.config.numberOfData * timeSpan;
i = i + timeSpan
) {
this.xData1.push(i);
}
for (var i = 0; i < this.channelCrests1.length; i++) {
this.dataPointer1.push({
name: this.channelCrests1[i].groupName,
label: this.channelCrests1[i].crestNo + "",
xAxis: this.channelCrests1[i].crestTime,
yAxis: this.lineData1[this.channelCrests1[i].crestTime],
});
}
console.log(this.dataPointer1);
//
this.getEchart1();
})
.catch((error) => {
console.log(error);
});
},
//2
getMenuData2() {
axios
.get("/bb.json")
.then((res) => {
this.lineData2 = res.data.data[0]; //
this.yMax2 = res.data.config.yMax; //y
this.channelCrests2 = res.data.config.channels[0].crests;
var timeSpan = 1; //
for (
var i = 0;
i < res.data.config.numberOfData * timeSpan;
i = i + timeSpan
) {
this.xData2.push(i);
}
for (var i = 0; i < this.channelCrests2.length; i++) {
this.dataPointer2.push({
name: this.channelCrests2[i].groupName,
label: this.channelCrests2[i].crestNo + "",
xAxis: this.channelCrests2[i].crestTime,
yAxis: this.lineData2[this.channelCrests2[i].crestTime],
});
}
console.log(this.dataPointer2);
//
//
this.getEchart2();
})
.catch((error) => {
console.log(error);
});
},
//3
getMenuData3() {
axios
.get("/cc.json")
.then((res) => {
this.lineData3 = res.data.data[0]; //
this.yMax3 = res.data.config.yMax; //y
this.channelCrests3 = res.data.config.channels[0].crests;
var timeSpan = 1; //
for (
var i = 0;
i < res.data.config.numberOfData * timeSpan;
i = i + timeSpan
) {
this.xData3.push(i);
}
console.log(this.lineData3);
for (var i = 0; i < this.channelCrests3.length; i++) {
this.dataPointer3.push({
name: this.channelCrests3[i].groupName,
label: this.channelCrests3[i].crestNo + "",
xAxis: this.channelCrests3[i].crestTime,
yAxis: this.lineData3[this.channelCrests3[i].crestTime],
});
}
console.log(this.dataPointer3);
//
this.getEchart3();
})
.catch((error) => {
console.log(error);
});
},
//4
getMenuData4() {
axios
.get("/dd.json")
.then((res) => {
this.lineData4 = res.data.channels[0].data; //
this.yMax4 = res.data.yMax; //y
this.channelCrests4 = res.data.channels[0].crests;
var timeSpan = 1; //
for (var i = 0; i < res.data.k * timeSpan; i = i + timeSpan) {
this.xData4.push(i);
}
console.log(this.lineData4);
for (var i = 0; i < this.channelCrests4.length; i++) {
this.dataPointer4.push({
name: this.channelCrests4[i].name,
label: this.channelCrests4[i].j + "",
xAxis: this.channelCrests4[i].time,
yAxis: this.lineData4[this.channelCrests4[i].time],
});
}
console.log(this.dataPointer4);
//
this.getEchart4();
})
.catch((error) => {
console.log(error);
});
},
//
getEchart1() {
this.$nextTick(() => {
let that = this;
that.myChart = this.$echarts.init(document.getElementById("demo1"));
let option = {
title: {
text: "图谱1",
left: "left",
},
tooltip: {
trigger: "axis",
axisPointer: {
animation: false,
},
},
dataZoom: [
{
type: "inside",
start: 0,
end: 100,
},
{
start: 0,
end: 100,
},
],
xAxis: {
type: "category",
data: this.xData1, // x
boundaryGap: false,
showMaxLabel: true,
name: "单位:s", //
},
yAxis: {
type: "value",
scale: true,
name: "单位:mV", //
nameTextStyle: {
//
color: "#000", //
fontSize: 10, //
padding: [0, 28, 4, 0], //
},
},
series: [
{
data: this.lineData1,
type: "line",
smooth: true,
symbol: "none",
sampling: "lttb",
itemStyle: {
color: "rgb(255, 70, 131)",
},
markPoint: {
data: this.dataPointer1,
symbol: "pin",
symbolSize: 18,
itemStyle: {
normal: {
label: {
show: true,
position: "top",
distance: 0,
formatter: function (params) {
console.log(params);
return params.data.label + ":" + params.name;
},
},
},
},
},
},
],
};
that.myChart.setOption(option);
window.addEventListener("resize", () => {
that.myChart.resize();
});
});
},
getEchart2() {
this.$nextTick(() => {
let that = this;
that.myChart = this.$echarts.init(document.getElementById("demo2"));
let option = {
title: {
text: "图谱2",
left: "left",
},
tooltip: {
trigger: "axis",
axisPointer: {
animation: false,
},
},
dataZoom: [
{
type: "inside",
start: 0,
end: 100,
},
{
start: 0,
end: 100,
},
],
xAxis: {
type: "category",
data: this.xData2, // x
boundaryGap: false,
showMaxLabel: true,
name: "单位:s", //
},
yAxis: {
type: "value",
scale: true,
name: "单位:mV", //
nameTextStyle: {
//
color: "#000", //
fontSize: 10, //
padding: [0, 28, 4, 0], //
},
},
series: [
{
data: this.lineData2,
type: "line",
smooth: true,
symbol: "none",
sampling: "lttb",
itemStyle: {
color: "rgb(255, 70, 131)",
},
markPoint: {
data: this.dataPointer2,
symbol: "pin",
symbolSize: 18,
itemStyle: {
normal: {
label: {
show: true,
position: "top",
distance: 0,
formatter: function (params) {
console.log(params);
return params.data.label + ":" + params.name;
},
},
},
},
},
},
],
};
that.myChart.setOption(option);
window.addEventListener("resize", () => {
that.myChart.resize();
});
});
},
getEchart3() {
this.$nextTick(() => {
let that = this;
that.myChart = this.$echarts.init(document.getElementById("demo3"));
let option = {
title: {
text: "图谱3",
left: "left",
},
tooltip: {
trigger: "axis",
axisPointer: {
animation: false,
},
},
dataZoom: [
{
type: "inside",
start: 0,
end: 100,
},
{
start: 0,
end: 100,
},
],
xAxis: {
type: "category",
data: this.xData3, // x
boundaryGap: false,
showMaxLabel: true,
name: "单位:s", //
},
yAxis: {
type: "value",
scale: true,
show: true, // y
name: "单位:mV", //
nameTextStyle: {
//
color: "#000", //
fontSize: 10, //
padding: [0, 28, 4, 0], //
},
},
series: [
{
data: this.lineData3,
type: "line",
smooth: true,
symbol: "none",
sampling: "lttb",
itemStyle: {
color: "rgb(255, 70, 131)",
},
markPoint: {
data: this.dataPointer3,
symbol: "pin",
symbolSize: 18,
itemStyle: {
normal: {
label: {
show: true,
position: "top",
distance: 0,
formatter: function (params) {
console.log(params);
return params.data.label + ":" + params.name;
},
},
},
},
},
},
],
};
that.myChart.setOption(option);
window.addEventListener("resize", () => {
that.myChart.resize();
});
});
},
getEchart4() {
this.$nextTick(() => {
let that = this;
that.myChart = this.$echarts.init(document.getElementById("demo4"));
let option = {
title: {
text: "图谱4",
left: "left",
},
tooltip: {
trigger: "axis",
axisPointer: {
animation: false,
},
},
dataZoom: [
{
type: "inside",
start: 0,
end: 100,
},
{
start: 0,
end: 100,
},
],
xAxis: {
type: "category",
data: this.xData4, // x
boundaryGap: false,
showMaxLabel: true,
name: "单位:s", //
},
yAxis: {
type: "value",
scale: true,
show: true, // y
name: "单位:mV", //
nameTextStyle: {
//
color: "#000", //
fontSize: 10, //
padding: [0, 28, 4, 0], //
},
},
series: [
{
data: this.lineData4,
type: "line",
smooth: true,
symbol: "none",
sampling: "lttb",
itemStyle: {
color: "rgb(255, 70, 131)",
},
markPoint: {
data: this.dataPointer4,
symbol: "pin",
symbolSize: 18,
itemStyle: {
normal: {
label: {
show: true,
position: "top",
distance: 0,
formatter: function (params) {
console.log(params);
return params.data.label + ":" + params.name;
},
},
},
},
},
},
],
};
that.myChart.setOption(option);
window.addEventListener("resize", () => {
that.myChart.resize();
});
});
},
},
};
</script>
<style lang="less">
.echartsBox {
height: calc(100% - 32px);
padding: 16px;
// display: flex;
// flex-direction: column;
overflow: auto;
// justify-content: space-around;
#demo1,
#demo2,
#demo3,
#demo4 {
height: 400px;
width: 80%;
}
.gropName {
.el-checkbox-group {
display: flex;
flex-direction: column;
.el-checkbox {
height: 40px;
line-height: 40px;
}
}
}
}
</style>

@ -28,8 +28,22 @@ Vue.use(ElementUI, {
//引入插件
import VueLazyload from "vue-lazyload";
//注册插件
// 全局配置vue-lazyload
// Vue.use(VueLazyload, {
// listenEvents: ["scroll"], // 监听的事件类型
// });
Vue.use(VueLazyload, {
error: require("./assets/img/nodatapic2.jpg"),
listenEvents: [
"scroll",
"wheel",
"mousewheel",
"resize",
"animationend",
"transitionend",
"touchmove",
],
});
/* 引入公共js*/
import common from "@/utils/common/common.js";
@ -54,17 +68,42 @@ Vue.directive("noMoreClick", {
//使用钩子函数对路由进行权限跳转
router.beforeEach((to, from, next) => {
document.title = `${to.meta.title} | 视频监控可视化平台`;
// 获取用户的角色和token
const role = localStorage.getItem("role");
const token = localStorage.getItem("token");
console.log(role, token);
// 如果没有token并且不是登录页面重定向到登录页面
if (!token && to.path !== "/login") {
//next("/login");
next({
path: "/login",
});
} else {
next();
return next({ path: "/login" });
}
// 如果用户是超级管理员role == 0则允许访问任何页面
if (role === "0") {
return next();
}
// 如果用户从登录页面跳转到其他页面并且已经拥有token则允许通过
if (from.path === "/login" && token) {
return next();
}
// 获取权限列表这里假设permissions是从后端获取的权限数组
const permissions = JSON.parse(localStorage.getItem("menuPermission")) || [];
// 检查用户是否有访问当前路由的权限
const hasPermission = permissions.some(
(permission) => permission.key === to.path
);
// 如果路由需要权限,但用户没有权限,则重定向到无权限页面
if (to.meta.requiresAuth && !hasPermission) {
return next({ path: "/permission" });
}
// 如果路由在免登录白名单中,则直接通过
if (to.meta.noAuth) {
return next();
}
// 如果以上条件都不满足,正常通过
next();
});
new Vue({
router,

@ -4,135 +4,312 @@ import VueRouter from "vue-router";
Vue.use(VueRouter);
const routes = [
{ path: "/", redirect: "/login" },
{
path: "/stritl",
path: "/",
redirect: "/stritl",
component: () => import("../components/Home.vue"),
meta: { title: "首页" },
children: [
{
path: "/stritl",
component: () =>
import(
/* webpackChunkName: "dashboard" */ "../views/homePage/index.vue"
),
component: () => import("../views/homePage/index.vue"),
name: "stritl",
meta: {
title: "首页",
icon: "el-icon-s-home",
keepAlive: true,
noAuth: true,
},
},
{
path: "/realTimeMonitor",
component: () =>
import(
/* webpackChunkName: "home" */ "../views/realTimeMonitor/index.vue"
),
component: () => import("../views/realTimeMonitor/index.vue"),
name: "realTimeMonitor",
meta: {
title: "实时监控",
permission: true,
icon: "el-icon-camera",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/pictureRotation",
component: () =>
import(
/* webpackChunkName: "home" */ "../views/pictureRotation/index.vue"
),
component: () => import("../views/pictureRotation/index.vue"),
name: "pictureRotation",
meta: {
title: "图片轮巡",
permission: true,
icon: "el-icon-camera",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/realTimeSearch",
component: () =>
import(
/* webpackChunkName: "home" */ "../views/realTimeSearch/index.vue"
),
component: () => import("../views/realTimeSearch/index.vue"),
name: "realTimeSearch",
meta: {
title: "历史图片",
permission: true,
icon: "el-icon-camera",
requiresAuth: true,
//keepAlive: true,
},
},
{
path: "/photoAlarm",
component: () =>
import(
/* webpackChunkName: "home" */ "../views/alarmHandling/index.vue"
),
component: () => import("../views/alarmHandling/index.vue"),
name: "alarmHandling",
meta: {
title: "告警处理",
permission: true,
icon: "el-icon-camera",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/userManagement",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/system/userManagement.vue"
),
meta: { title: "用户管理", icon: "el-icon-monitor" },
component: () => import("../views/system/user/userManagement.vue"),
name: "userManagement",
meta: {
title: "用户管理",
icon: "el-icon-monitor",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/roleManagement",
component: () => import("../views/system/roleManagement/index.vue"),
name: "roleManagement",
meta: {
title: "角色管理",
icon: "el-icon-monitor",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/menuManagement",
component: () => import("../views/system/menuManagement/index.vue"),
name: "menuManagement",
meta: {
title: "菜单功能管理",
icon: "el-icon-monitor",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/deviceUpgrade",
component: () => import("../views/system/deviceUpgrade/index.vue"),
name: "deviceUpgrade",
meta: {
title: "升级管理",
icon: "el-icon-monitor",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/globalTools",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/system/globalTools/index.vue"
),
meta: { title: "全局设置" },
component: () => import("../views/system/globalTools/index.vue"),
name: "globalTools",
meta: { title: "全局设置", keepAlive: true, requiresAuth: true },
},
{
path: "/dyInformation",
component: () => import("../views/dyInformation/index.vue"),
name: "dyInformation",
meta: {
title: "电压信息管理",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/lineInformation",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/lineInformation/index.vue"
),
meta: { title: "线路信息管理", icon: "" },
component: () => import("../views/lineInformation/index.vue"),
name: "lineInformation",
meta: {
title: "线路信息管理",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/towerInformation",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/towerInformation/index.vue"
),
meta: { title: "杆塔信息管理", icon: "" },
component: () => import("../views/towerInformation/index.vue"),
name: "towerInformation",
meta: {
title: "杆塔信息管理",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/cameraChannel",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/cameraChannel/index.vue"
),
meta: { title: "通道管理", icon: "" },
component: () => import("../views/cameraChannel/index.vue"),
name: "cameraChannel",
meta: {
title: "通道管理",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/photographicDevice",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/photographicDevice/index.vue"
),
meta: { title: "拍照装置管理", icon: "" },
component: () => import("../views/photographicDevice/index.vue"),
name: "photographicDevice",
meta: {
title: "拍照装置管理",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/devicePhotoSchedule",
component: () =>
import(
/* webpackChunkName: "tabs" */ "../views/devicePhotoSchedule/index.vue"
),
meta: { title: "拍照时间表设置", icon: "" },
component: () => import("../views/devicePhotoSchedule/index.vue"),
name: "devicePhotoSchedule",
meta: {
title: "拍照时间表设置",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/waterMark",
component: () => import("../views/waterMark/index.vue"),
name: "waterMark",
meta: {
title: "水印下发",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/otherCommon",
component: () => import("../views/otherCommon/index.vue"),
name: "otherCommon",
meta: {
title: "批量命令",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/reportData",
component: () => import("../views/reportData/index.vue"),
name: "reportData",
meta: {
title: "数据报表",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
// {
// path: "/photoTotal",
// component: () => import("../views/photoTotal/index.vue"),
// name: "photoTotal",
// meta: {
// title: "图片数据统计",
// icon: "",
// keepAlive: true,
// requiresAuth: true,
// },
// },
{
path: "/aiwork",
component: () => import("../views/system/drawPic.vue"),
name: "aiwork",
meta: {
title: "ai绘图",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
{
path: "/weatherIceConfig",
component: () => import("../views/system/weatherIceConfig.vue"),
name: "weatherIceConfig",
meta: {
title: "微气象覆冰转发",
icon: "",
keepAlive: true,
requiresAuth: true,
},
],
},
{
path: "/echarts",
component: () => import("../echartsDemo.vue"),
name: "echartsDemo",
meta: {
title: "echarts图表",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
//气象检测
{
path: "/weather",
component: () => import("../views/iceWeather/weather/index.vue"),
name: "weather",
meta: {
title: "气象检测",
keepAlive: true,
requiresAuth: true,
},
},
//覆冰
{
path: "/icing",
component: () => import("../views/iceWeather/icing/index.vue"),
name: "icing",
meta: { title: "覆冰监测", keepAlive: true, requiresAuth: true },
},
//数据报表
{
path: "/statisticalReport",
component: () => import("../views/statisticalReport/index.vue"),
name: "statisticalReport",
meta: {
title: "统计报表",
icon: "",
keepAlive: true,
requiresAuth: true,
},
},
],
},
{
path: "/login",
name: "login",
component: () => import("../views/login/index.vue"),
meta: { title: "登录" },
meta: { title: "登录", noAuth: true }, // 标记为免登录页面
},
{
// 权限页面
path: "/permission",
component: () =>
import(/* webpackChunkName: "permission" */ "../Permission.vue"),
meta: { title: "权限测试" },
},
];

@ -0,0 +1,57 @@
import Vue from "vue";
export default {
namespaced: true,
state: {
caches: [],
},
actions: {
// 添加缓存的路由组件
addCache({ state, dispatch }, componentName) {
if (Array.isArray(componentName)) {
componentName.forEach((item) => {
dispatch("addCache", item);
});
return;
}
const { caches } = state;
if (!componentName || caches.includes(componentName)) return;
caches.push(componentName);
console.log("缓存路由组件:", componentName);
},
// 移除缓存的路由组件
removeCache({ state, dispatch }, componentName) {
if (Array.isArray(componentName)) {
componentName.forEach((item) => {
dispatch("removeCache", item);
});
return;
}
const { caches } = state;
const index = caches.indexOf(componentName);
if (index > -1) {
console.log("清除缓存的路由组件:", componentName);
return caches.splice(index, 1)[0];
}
},
// 移除缓存的路由组件的实例
async removeCacheEntry({ dispatch }, componentName) {
const cacheRemoved = await dispatch("removeCache", componentName);
if (cacheRemoved) {
await Vue.nextTick();
dispatch("addCache", componentName);
}
},
// 清除缓存的路由组件的实例
clearEntry({ state, dispatch }) {
const { caches } = state;
caches.slice().forEach((key) => {
dispatch("removeCacheEntry", key);
});
},
},
};

@ -1,6 +1,6 @@
import Vue from "vue";
import Vuex from "vuex";
import cacheModule from "./cache";
Vue.use(Vuex);
export default new Vuex.Store({
@ -8,21 +8,29 @@ export default new Vuex.Store({
//用户登录token 存储
token: "",
userName: "",
userid: "",
uid: "",
role: "",
notes: "",
currentData: "",
channelId: "",
termId: "",
protocol: "",
cmdId: "",
channelIdList: [],
isRenderTab: true,
responseProcessing: false, // 用于防止重复处理相同错误状态的标志
},
getters: {
token: (state) => state.token,
userName: (state) => state.userName,
role: (state) => state.role,
notes: (state) => state.notes,
menuPermission: (state) => state.resources,
},
mutations: {
setResponseProcessing(state, status) {
state.responseProcessing = status;
},
//点击获取的左侧列表
currentData(state, currentData) {
state.currentData = currentData;
@ -63,17 +71,34 @@ export default new Vuex.Store({
},
SET_USERINFO(state, val) {
state.userName = val.userName;
state.userid = val.id;
state.uid = val.uid;
state.role = val.role;
state.notes = val.notes;
if (val.role !== 0) {
state.resources = val.resources;
const menuArr = val.resources
.filter((item) => item.key.includes("/"))
.sort((a, b) => a.id - b.id);
const btnArr = val.resources
.filter((item) => item.key.includes("Btn"))
.sort((a, b) => a.id - b.id);
localStorage.setItem("menuPermission", JSON.stringify(menuArr));
localStorage.setItem("btnPermission", JSON.stringify(btnArr));
}
localStorage.setItem("userName", state.userName);
localStorage.setItem("userid", state.userid);
localStorage.setItem("uid", state.uid);
localStorage.setItem("role", state.role);
localStorage.setItem("notes", state.notes);
},
//退出清除locastorge
REMOVE_INFO(state) {
localStorage.clear();
},
setIsRenderTab(state, data) {
state.isRenderTab = data;
},
},
actions: {},
modules: {},
modules: { cache: cacheModule },
});

@ -0,0 +1,17 @@
import request from "../request";
//获取图片
export function getTestTerminalPhotoListApi(data) {
return request({
url: "/xymanager/getTestTerminalPhotoList",
method: "post",
data,
});
}
//上传坐标
export function takeAlarmApi(data) {
return request({
url: "/xymanager/takeAlarm",
method: "post",
data,
});
}

@ -0,0 +1,142 @@
import request from "../request";
//获取装置总数图表
//郑州左侧树状结构接口
export function getICEdyTreeList(data) {
return request({
url: "/xymanager/getdyTreeList",
method: "post",
data,
});
}
//查询附带天气
export function weatherJoggle(data) {
return request({
url: "/xymanager/terminal/listWithWeather",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//查询天气列表
export function weatherListJoggle(data) {
return request({
url: "/xymanager/weather/list",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//查询附带覆冰拉力
export function LeadPullJoggle(data) {
return request({
url: "/xymanager/terminal/listWithLeadPull",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//查询覆冰拉力列表
export function leadpullsListJoggle(data) {
return request({
url: "/xymanager/leadpulls/list",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//获取相位码
export function funccodeJoggle(data) {
return request({
url: "/xapi/funccode.php",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//导出覆冰数据
export function exportJoggle(data) {
return request({
url: "/xymanager/leadpulls/export",
method: "get",
params: data,
responseType: "blob",
});
}
//查询天气装置列表
export function getWeatherListApi(data) {
return request({
url: "/xymanager/henan/getWeatherList",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//查询拉力装置点表
export function getPointListApi(data) {
return request({
url: "/xymanager/henan/getPointList",
method: "get",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//新增微气象转发
export function addWeatherApi(data) {
return request({
url: "/xymanager/henan/addWeather",
method: "post",
data,
});
}
//新增覆冰转发
export function addIcePointApi(data) {
return request({
url: "/xymanager/henan/addPoint",
method: "post",
data,
});
}
//删除微气象转发
export function delWeatherApi(data) {
return request({
url: "/xymanager/henan/delWeather",
method: "post",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}
//删除覆冰转发
export function delPointApi(data) {
return request({
url: "/xymanager/henan/delPoint",
method: "post",
params: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
},
});
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,61 @@
import request from "../request";
//照片统计
// export function getphotoList(data) {
// return request({
// url: "/xymanager/terminal/listWithPhoto",
// method: "get",
// params: data,
// });
// }
//获取电压-线路-杆塔等信息
export function getSearchInfo(data) {
return request({
url: "/xymanager/getLineAndGt",
method: "post",
data,
});
}
//获取实时图片数据
export function getphotoApi(data) {
return request({
url: "/xymanager/getPhotoList",
method: "post",
data,
});
}
//获取心跳历史
export function getIpList(data) {
return request({
url: "/xymanager/terminal/heartbeat",
method: "get",
params: data,
});
}
//获取装置状态统表
export function gettermAllList(data) {
return request({
url: "/xymanager/terminal/listWithAll",
method: "get",
params: data,
});
}
//规约版本
export function getProtocolList(data) {
return request({
url: "/xymanager/getProtocolList",
method: "get",
params: data,
});
}
//获取活动列表
export function getActivityApi(data) {
return request({
url: "/xymanager/activity/listAll",
method: "get",
params: data,
});
}

@ -0,0 +1,4 @@
import Vue from 'vue'
const EventBus = new Vue()
export default EventBus

@ -1,61 +1,55 @@
import axios from "axios";
import { MessageBox, Message } from "element-ui";
import router from "../router/index";
import store from "../store/index"; // 确保路径正确
const service = axios.create({
// process.env.NODE_ENV === 'development' 来判断是否开发环境
// easy-mock服务挂了暂时不使用了
// baseURL: '',
// timeout: 5000
baseURL: "api", //把原来的项目地址改成api解决跨域问题
timeout: 30000,
timeout: 600000,
});
service.interceptors.request.use((config) => {
if (localStorage.getItem("token")) {
config.headers.sessionId = localStorage.getItem("token");
// console.log("aaaaaaaaaaaaaa", localStorage.getItem("token"));
config.headers.Authorization = localStorage.getItem("token");
}
return config;
});
service.interceptors.response.use(
// (response) => {
// if (response.status === 200) {
// return response.data;
// } else {
// Promise.reject();
// }
// },
// (error) => {
// console.log(error);
// return Promise.reject();
// }
(response) => {
const res = response.data;
if (res.code !== 200) {
// Message({
// showClose: true,
// message: res.msg || "Error",
// type: "error",
// duration: 5 * 1000,
// });
if (res.code !== 200 && !store.state.responseProcessing) {
store.commit("setResponseProcessing", true); // 设置状态为处理中
if (res.code === 401) {
Message({ message: res.msg, type: "error", duration: 1500 });
Message({
showClose: true,
message: res.msg,
type: "error",
duration: 1500,
});
localStorage.removeItem("token");
router.push("/login");
}
if (res.code === 400) {
Message({ message: res.msg, type: "error", duration: 1500 });
}
if (res.code === 500) {
} else if (res.code === 400) {
Message({
showClose: true,
message: 服务器错误(500),
message: res.msg,
type: "error",
duration: 1500,
});
} else if (res.code === 500) {
Message({
showClose: true,
message: res.msg || "Error",
type: "error",
duration: 1500,
});
}
store.commit("setResponseProcessing", false); // 重置状态
return Promise.reject(new Error(res.msg || "Error"));
} else {
return res;

@ -364,6 +364,7 @@ import {
import morePicPreveiw from "../realTimeMonitor/components/morePicPreveiw";
import moment from "moment";
export default {
name: "alarmHandling",
components: {
morePicPreveiw,
},
@ -950,7 +951,7 @@ export default {
alias: val.alias,
channnelname: val.channnelName,
photoTime: val.alarmTime,
termid: val.id,
termid: val.termId,
channelid: val.channelId,
};
this.$refs.morePicPreveiw_ref.display(currentPrams);
@ -1241,6 +1242,7 @@ export default {
bottom: 0px;
background: rgba(0, 0, 0, 0.5);
width: calc(100% - 12px);
z-index: 3;
.alarmInfo {
color: #fff;
}

@ -100,6 +100,7 @@ import addChannelDialog from "./components/addChannelDialog.vue";
import { getChannelListapi, deleteChannelapi } from "@/utils/api/index";
export default {
name: "cameraChannel",
components: {
addChannelDialog,
},

@ -249,6 +249,10 @@ export default {
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
@ -269,12 +273,21 @@ export default {
.add(node.setNum, "minute")
.format("YYYY-MM-DD HH:mm:ss");
var Etime = this.$moment(scheduleTimeList[i].endTime, "HH:mm")
.add(node.setNum, "minute")
.format("YYYY-MM-DD HH:mm:ss");
// var Etime = this.$moment(scheduleTimeList[i].endTime, "HH:mm")
// .add(node.setNum, "minute")
// .format("YYYY-MM-DD HH:mm:ss");
//
var Etime = this.$moment(scheduleTimeList[i].endTime, "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
var spanTime = scheduleTimeList[i].timeSpan;
console.log(Stime, Etime, spanTime);
if (node.protocol == "65283" || node.protocol == "65285") {
if (
node.protocol == "65283" ||
node.protocol == "65285" ||
node.protocol == "65290" ||
node.protocol == "65298"
) {
//
console.log("湖南,河南", scheduleTimeList.length);
@ -445,7 +458,7 @@ export default {
}
}
.treeDevice {
background-color: #169e8c;
//background-color: #169e8c;
height: 366px;
// overflow: auto;
display: flex;

@ -346,9 +346,10 @@ export default {
var Stime = moment(this.ruleSchedule[j].startTime)
.add(this.allCheckNode[i].offsetNum, "minute")
.format();
var Etime = moment(this.ruleSchedule[j].endTime)
.add(this.allCheckNode[i].offsetNum, "minute")
.format();
// var Etime = moment(this.ruleSchedule[j].endTime)
// .add(this.allCheckNode[i].offsetNum, "minute")
// .format();
var Etime = moment(this.ruleSchedule[j].endTime).format();
var lastETime = moment(this.ruleSchedule[j].endTime).format();
var spanTime = this.ruleSchedule[j].span;

@ -235,10 +235,11 @@ export default {
"minute"
);
var Etime = this.$moment(this.rulesList[j].endTime).add(
this.allCheckNode[i].offsetNum,
"minute"
);
// var Etime = this.$moment(this.rulesList[j].endTime).add(
// this.allCheckNode[i].offsetNum,
// "minute"
// );
var Etime = this.$moment(this.rulesList[j].endTime);
var spanTime = this.rulesList[j].span;
console.log(Stime, Etime, spanTime);

@ -96,6 +96,7 @@ import adddeviceDialog from "./components/adddeviceDialog.vue";
import bdSchedule from "./components/bdSchedule.vue";
export default {
name: "devicePhotoSchedule",
components: {
adddeviceDialog,
bdSchedule,

@ -0,0 +1,129 @@
<template>
<el-dialog
class="addDyDialog"
:title="title"
:visible.sync="isShow"
:close-on-click-modal="false"
width="470px"
>
<el-form
label-position="left"
ref="formInfo"
label-width="100px"
:rules="rules"
:model="formdata"
>
<el-form-item label="电压名称:" prop="name">
<el-input v-model="formdata.name" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button type="primary" @click="submitForm()"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { addDyJoggle, updateDyJoggle } from "@/utils/api/index";
export default {
props: {
title: String,
},
data() {
return {
isShow: false,
formdata: {},
rules: {
name: [{ required: true, message: "请输入电压名称", trigger: "blur" }],
},
};
},
mounted() {},
methods: {
//
getdataform(val) {
if (val == null) {
return (this.formdata = {});
}
//this.formdata = val;
this.formdata = JSON.parse(JSON.stringify(val));
},
//
submitForm() {
this.$refs.formInfo.validate((valid) => {
if (valid) {
if (this.title == "新增") {
this.$set(this.formdata, "dyValue", "220");
addDyJoggle(this.formdata)
.then((res) => {
this.isShow = false;
this.$message({
duration: 1500,
showClose: true,
message: "添加成功",
type: "success",
});
this.$parent.deviceList();
})
.catch((err) => {
this.$message({
duration: 1500,
showClose: true,
message: "添加失败",
type: "error",
});
});
} else {
console.log(this.formdata);
updateDyJoggle(this.formdata)
.then((res) => {
this.isShow = false;
//this.$message.success("");
this.$message({
duration: 1500,
showClose: true,
message: "修改成功",
type: "success",
});
this.$parent.deviceList();
})
.catch((err) => {
//this.$message.error("");
this.$message({
duration: 1500,
showClose: true,
message: "修改失败",
type: "error",
});
});
}
} else {
console.log("error submit!!");
return false;
}
});
},
display() {
this.isShow = true;
},
hide() {
this.isShow = false;
},
},
};
</script>
<style lang="less">
.addDyDialog {
.el-select {
width: 100%;
}
.el-input-number {
width: 100%;
}
.el-input-number .el-input__inner {
text-align: left;
}
}
</style>

@ -0,0 +1,271 @@
<template>
<div class="dyInfoBox">
<div class="deviceBox">
<div class="deviceBtnGroup">
<h4>电压信息管理</h4>
<el-button
type="primary"
icon="el-icon-plus"
@click.native.stop="handleAdddevice()"
>新增</el-button
>
</div>
<div class="searchBox">
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item>
<el-input
v-model="formdata.search"
placeholder="请输入电压"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary" @click="onReset"></el-button>
</el-form-item>
</el-form>
</div>
<div class="deviceTable">
<el-table
ref="multipleTable"
:data="tableDate"
tooltip-effect="dark"
stripe
style="width: 100%"
height="calc(100% - 40px)"
@selection-change="handleSelectionChange"
@row-click="handleRowClick"
v-loading="loading"
highlight-current-row
:row-key="getRowKeys"
>
<template slot="empty">
<el-empty :image-size="160" description="暂无数据"></el-empty>
</template>
<el-table-column prop="name" label="电压等级" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column
prop="createTime"
label="创建时间"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ scope.row.createTime }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="200">
<template slot-scope="scope">
<el-button
@click.native.stop="handleResive(scope.row)"
type="text"
>修改</el-button
>
<el-button
type="text"
class="deleteText"
@click.native.stop="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<div class="pageNation">
<el-pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page="page"
:page-size="pageSize"
layout="sizes, prev, pager, next, jumper,total"
:total="total"
background
>
</el-pagination>
</div>
</div>
</div>
<!-- 新增电压 -->
<addDyDialog :title="title" ref="addDialogref"></addDyDialog>
</div>
</template>
<script>
import { getDyListJoggle, deleteDyJoggle } from "@/utils/api/index";
import addDyDialog from "./components/addDyDialog.vue";
export default {
name: "dyInformation",
components: {
addDyDialog,
},
data() {
return {
title: "", //
tableDate: [],
//multipleSelection: [], //
page: 1, //
pageSize: 20, //
total: 0, //
loading: true,
formdata: {
search: "",
},
};
},
created() {},
mounted() {
this.deviceList();
},
methods: {
getRowKeys(row) {
return row.id;
},
//
onSubmit() {
this.page = 1;
this.deviceList();
},
//
onReset() {
this.formdata = {
search: "",
};
this.page = 1;
this.pageSize = 20;
this.deviceList();
},
//
deviceList() {
this.loading = true;
this.$set(this.formdata, "pageindex", this.page);
this.$set(this.formdata, "pagesize", this.pageSize);
getDyListJoggle(this.formdata)
.then((res) => {
this.tableDate = res.data.list;
this.total = res.data.total;
this.loading = false;
})
.catch((err) => {});
},
//
handleRowClick(row, column, event) {
this.$refs.multipleTable.toggleRowSelection(row);
},
//
handleSelectionChange(val) {
this.multipleSelection = val;
},
//
handleAdddevice() {
this.title = "新增";
this.$refs.addDialogref.display();
this.$refs.addDialogref.getdataform(null);
},
//
handleResive(data) {
this.title = "修改";
this.$refs.addDialogref.display();
this.$refs.addDialogref.getdataform(data);
},
//
handleDelete(data) {
let deleteArr = [];
deleteArr.push(data.id);
console.log("aaaaaaaaaaaaaaaaaaaaaaaaaaa", deleteArr);
this.$confirm("确定要删除记录吗,同时删除关联关系?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
deleteDyJoggle({ list: deleteArr }).then((res) => {
if (res.code == 200) {
this.$message({
duration: 1500,
showClose: true,
type: "success",
message: "删除成功!",
});
this.deviceList(); //
} else {
this.$message({
duration: 1500,
showClose: true,
type: "error",
message: "删除失败!",
});
}
});
})
.catch(() => {
this.$message({
duration: 1500,
showClose: true,
type: "info",
message: "已取消删除",
});
});
},
//
handleCurrentChange(val) {
this.page = val;
this.deviceList();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.deviceList();
},
},
};
</script>
<style lang="less">
.dyInfoBox {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
background: #fff;
.deviceBox {
border: 1px solid #dddddd;
height: calc(100% - 24px);
padding: 12px;
border-radius: 4px;
.searchBox {
margin-top: 8px;
.ml10 {
margin-left: 10px;
}
.el-form {
.dybox {
.el-form-item__content {
width: 120px;
}
}
.xlbox {
.el-form-item__content {
width: 160px;
}
}
}
}
}
.deviceBtnGroup {
display: flex;
justify-content: space-between;
align-items: center;
}
.deviceTable {
height: calc(100% - 94px);
//background: #fcc;
}
}
</style>

@ -46,7 +46,7 @@
<div id="echart2" class="chartClass" v-loading="pieloading"></div>
</el-card>
</div>
<div class="echart-top">
<div class="echart-top" v-if="notes !== '覆冰用户使用'">
<el-card class="box-card" v-loading="barloading">
<h3>7天告警数量统计</h3>
<div class="dateBox">
@ -98,16 +98,30 @@
tooltip-effect="dark"
height="calc(100% - 54px)"
>
<el-table-column prop="lineName" label="线路名称"></el-table-column>
<el-table-column prop="towerName" label="杆塔名称"></el-table-column>
<el-table-column prop="cmdId" label="装置ID"></el-table-column>
<el-table-column
prop="lineName"
label="线路名称"
min-width="120"
></el-table-column>
<el-table-column
prop="towerName"
label="杆塔名称"
min-width="120"
></el-table-column>
<el-table-column
prop="cmdId"
label="装置ID"
min-width="120"
></el-table-column>
<el-table-column
prop="hearttime"
label="最新心跳时间"
min-width="120"
></el-table-column>
<el-table-column
prop="pictime"
label="最新图片拍照时间"
min-width="120"
></el-table-column>
<el-table-column prop="isonline" label="是否在线"></el-table-column>
<el-table-column prop="longitude" label="经度"></el-table-column>
@ -126,7 +140,7 @@ import {
getOnlineTerminalListExcel,
} from "@/utils/api/index";
export default {
name: "",
name: "stritl",
data() {
return {
termDataNum: "", //
@ -151,6 +165,7 @@ export default {
onLineData: [],
exportLoading: false,
paramsLineVal: "",
notes: localStorage.getItem("notes"),
};
},
created() {
@ -177,6 +192,9 @@ export default {
methods: {
//线
handleLook(val) {
if (this.notes == "覆冰用户使用") {
return;
}
console.log(val);
this.paramsLineVal = val;
this.dialogTableVisible = true;
@ -195,7 +213,8 @@ export default {
//
handleExport(val) {
console.log(val);
window.location.href = "/api/api/getOnlineTerminalListExcel?type=" + val;
window.location.href =
"/api/xymanager/getOnlineTerminalListExcel?type=" + val;
},
//
changedate() {
@ -225,6 +244,13 @@ export default {
.then((res) => {
console.log(res);
this.termDataNum = res.data;
// this.termDataNum = {
// totalNum: 2185,
// onlineNum: 2165,
// offlineNum: 20,
// onlinePercent: 0.9908,
// offlinePercent: 0.0092,
// };
this.numloading = false;
this.pieloading = false;
this.getEchart2();
@ -477,11 +503,11 @@ export default {
</script>
<style lang="less">
.stritleEchartsPage {
height: calc(100% - 32px);
padding: 16px;
height: calc(100% - 24px);
padding: 12px;
display: flex;
flex-direction: column;
justify-content: space-around;
justify-content: space-between;
.echart-top {
display: flex;
height: 48%;

@ -0,0 +1,291 @@
<template>
<div class="leftTreeBox">
<div class="companyBox">
<span class="spanLabel"
><i class="el-icon-office-building"></i>公司</span
>
<el-select v-model="companyVal" placeholder="请选择公司">
<!-- <el-option label="捕鱼达人" value="budr"></el-option> -->
<el-option
v-for="item in companyOptions"
:key="item.value"
:label="item.label"
:value="item.value"
@click.native="handleClick(item.value)"
>
</el-option>
</el-select>
</div>
<el-divider></el-divider>
<div class="searchBar">
<el-input
placeholder="输入关键字进行过滤"
v-model="filterText"
prefix-icon="el-icon-search"
>
</el-input>
</div>
<el-tree
ref="tree"
v-loading="treeLoading"
:data="lineTreeData"
:props="defaultProps"
node-key="id"
highlight-current
:default-expanded-keys="[9]"
:expand-on-click-node="false"
:filter-node-method="filterNode"
:current-node-key="currentNodekey"
@node-click="handleNodeClick"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span v-if="node.level === 1">
<span class="iconfont icon-dianli" style="margin-right: 6px"></span>
<span>{{ node.label }} </span>
<!-- <span>捕鱼达人</span> -->
</span>
<span v-else-if="node.level === 2">
<span class="iconfont icon-dianlihangye" style="margin-right: 6px">
</span>
<span
>{{ node.label }}
<span class="num">({{ data.list.length }}) </span></span
>
</span>
<span v-else>
<span
class="iconfont icon-shexiangtoulixian"
v-if="data.onlinestatus == 0"
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
style="margin-right: 6px"
></span>
<span
class="iconfont icon-shexiangtou-lixian"
v-else
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
style="margin-right: 6px"
></span>
<span
:id="data.id"
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
>{{ node.label }}</span
>
</span>
</span>
</el-tree>
</div>
</template>
<script>
import { getICEdyTreeList } from "@/utils/api/iceApi";
export default {
data() {
return {
treeLoading: false,
companyVal: "", //
companyOptions: [
{
value: "bydr",
label: "捕鱼达人",
},
],
filterText: "", //
lineTreeData: [],
defaultExpandedKeys: [], //
collapsedKeys: [], // key
defaultProps: {
//
children: "list",
label: "name",
},
icecurrentData: {}, //
currentNodekey: "", //,
role: "",
};
},
watch: {
filterText(newVal) {
this.handleFilter(); // filterText
},
},
created() {
this.getLineTreeList(); //
this.companyVal = this.companyOptions[0].value;
},
methods: {
handleClick(val) {
console.log(val);
},
handleFilter() {
// 500
setTimeout(() => {
this.$refs.tree.filter(this.filterText);
}, 500);
},
//
filterNode(value, data, node) {
//
if (!value) return true;
this.searchName = data.name + data.cmdid;
//console.log(this.searchName);
// valuedatalabel
if (this.searchName.indexOf(value) !== -1) {
return true;
}
},
//
getLineTreeList() {
this.role = localStorage.getItem("role");
console.log(this.role);
const menuName = this.$route.path;
console.log(menuName);
this.treeLoading = true;
let devtypeList;
//
if (menuName == "/weather") {
devtypeList = [3, 23, 123];
}
//
if (menuName == "/icing") {
devtypeList = [2, 23, 123];
}
console.log(devtypeList);
getICEdyTreeList({
type: -1,
devtype: devtypeList,
})
.then((res) => {
this.lineTreeData = [];
this.lineTreeData = res.data.list;
this.treeLoading = false;
this.icecurrentData = JSON.parse(
localStorage.getItem("icecurrentData")
);
this.lineTreeData.forEach((node) => {
if (node.list) {
node.list.forEach((child) => {
this.defaultExpandedKeys.push(child.id);
});
} else {
this.defaultExpandedKeys.push(node.id);
}
});
this.defaultExpandedKeys =
JSON.parse(localStorage.getItem("defaultKey")) !== null
? JSON.parse(localStorage.getItem("defaultKey"))
: this.defaultExpandedKeys; //defaultKey ;
//console.log(this.defaultExpandedKeys);
if (this.lineTreeData[0].list[0].list.length > 0) {
}
if (
this.icecurrentData !== null &&
Object.keys(this.icecurrentData).length !== 0
) {
this.currentNodekey = this.icecurrentData.id;
this.handleNodeClick(this.icecurrentData);
} else {
this.icecurrentData = this.lineTreeData[0]; //
this.currentNodekey = this.lineTreeData[0].id; //
this.handleNodeClick(this.icecurrentData);
}
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.currentNodekey); //
});
})
.catch((err) => {
console.log(err); //
});
},
//treenode
handleNodeClick(data) {
this.icecurrentData = data;
this.$parent.getCurrentData(this.icecurrentData);
},
},
};
</script>
<style lang="less">
.leftTreeBox {
width: 260px;
display: flex;
flex-direction: column;
padding: 16px 0;
.companyBox {
display: flex;
width: 94%;
margin: 0 auto;
margin-bottom: 8px;
align-items: center;
.spanLabel {
font-size: 14px;
width: 96px;
}
}
.el-divider--horizontal {
margin: 0px 0px 8px 0px;
}
.searchBar {
width: 94%;
margin: 0 auto;
margin-bottom: 8px;
}
.el-tree {
overflow-y: scroll;
overflow-x: hidden;
.el-tree-node__content {
height: 32px;
font-size: 12px;
}
.custom-tree-node {
color: #333;
overflow: hidden;
span {
display: flex;
display: inline-table;
overflow: hidden;
align-items: center;
}
.num {
color: #1c77ac;
}
}
}
.disconnect {
color: #d3d3d3;
}
.el-tree--highlight-current
.el-tree-node.is-current
> .el-tree-node__content {
//
color: #fff;
background: #169e8c;
.custom-tree-node {
color: #fff;
//overflow: hidden;
span {
display: flex;
//overflow: hidden;
align-items: center;
.num {
color: #fff;
}
.iconfont {
//width: 30px;
display: inline-table;
}
}
}
}
}
.el-table thead {
color: #333;
th {
font-weight: 400;
}
}
.el-table {
color: #666;
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,914 @@
<template>
<div class="weatherBox">
<div class="weatherContain">
<leftTree ref="sideTree"></leftTree>
<div class="rightTable">
<div class="dataBox">
<div class="fatherTableShowBox" v-if="!childFlag">
<el-table
:data="tableData"
style="width: 100%"
v-loading="loading"
height="calc(100% - 40px)"
>
<el-table-column prop="lineName" label="线路"> </el-table-column>
<el-table-column prop="towerName" label="杆塔"> </el-table-column>
<el-table-column prop="cmdid" label="终端"> </el-table-column>
<el-table-column prop="updateTime" label="时间">
<template slot-scope="scope">
<span v-if="scope.row.lastWeathers !== null">
{{
$moment(scope.row.lastWeathers.updateTime * 1000).format(
"YYYY-MM-DD HH:mm:ss"
)
}}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column label="温度(℃)">
<template slot-scope="scope">
<span v-if="scope.row.lastWeathers !== null">{{
scope.row.lastWeathers.airTemperature.toFixed(1)
}}</span>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="humidity" label="湿度(%RH)">
<template slot-scope="scope">
<span v-if="scope.row.lastWeathers !== null"
><span
v-if="
scope.row.lastWeathers.humidity != 65535 &&
scope.row.lastWeathers.humidity != 255
"
>
{{ scope.row.lastWeathers.humidity.toFixed(1) }}</span
><span v-else> - </span></span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="maxWindSpeed" label="最大风速(m/s)">
<template slot-scope="scope">
<span v-if="scope.row.lastWeathers !== null">{{
scope.row.lastWeathers.maxWindSpeed.toFixed(1)
}}</span>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="windDirection" label="瞬时风向(°)">
<template slot-scope="scope">
<span
v-if="
scope.row.lastWeathers !== null &&
scope.row.lastWeathers.windDirection !== null
"
>{{ scope.row.lastWeathers.windDirection.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="precipitation" label="雨量(mm/hour)">
<template slot-scope="scope">
<span
v-if="
scope.row.lastWeathers !== null &&
scope.row.lastWeathers.precipitation != 255
"
>{{ scope.row.lastWeathers.precipitation.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="airPressure" label="气压(hPa(百帕))">
<template slot-scope="scope">
<span
v-if="
scope.row.lastWeathers !== null &&
scope.row.lastWeathers.airPressure != 255
"
>{{ scope.row.lastWeathers.airPressure.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="radiationIntensity" label="日照(W/m2)">
<template slot-scope="scope">
<span v-if="scope.row.lastWeathers !== null"
><span
v-if="
scope.row.lastWeathers.radiationIntensity != 255 &&
scope.row.lastWeathers.radiationIntensity != 65535
"
>
{{
scope.row.lastWeathers.radiationIntensity.toFixed(0)
}}</span
><span v-else> - </span></span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="text"
@click="moreDataClick(scope.row)"
v-if="scope.row.lastWeathers !== null"
>更多历史数据</el-button
>
<span v-else> </span>
</template>
</el-table-column>
</el-table>
<div class="pageNation">
<el-pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page="page"
:page-size="pageSize"
layout="sizes, prev, pager, next, jumper,total"
:total="total"
>
</el-pagination>
</div>
</div>
<div class="childBox" v-else>
<div class="searchBox" ref="searchref">
<el-form
:inline="true"
:model="formdata"
class="demo-form-inline"
>
<el-form-item label="开始日期">
<el-date-picker
v-model="formdata.starttime"
type="date"
placeholder="开始日期"
>
</el-date-picker>
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
@change="changedate"
v-model="formdata.endtime"
type="date"
placeholder="结束日期"
class="ml10"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
</div>
<div class="termalBox">
<p>
<span class="text"
>线路:{{ childMsg.lineName || childMsg.lineName }}</span
>
<span class="text"
>杆塔:{{ childMsg.towerName || childMsg.name }}</span
>
<span class="text">终端:{{ childMsg.cmdid }}</span>
</p>
<div class="gropBtn">
<el-button type="text" @click="onWdLine" icon="el-icon-odometer"
>温度趋势</el-button
>
<el-button
type="text"
@click="onSdLine"
icon="el-icon-heavy-rain"
>湿度趋势</el-button
>
</div>
</div>
<!-- <div class="echartsBox">
<div class="btnbox">
<el-button type="primary" @click="onWdLine"
>温度变化趋势</el-button
>
<el-button type="primary" @click="onSdLine"
>湿度变化趋势</el-button
>
<el-button type="primary" @click="onHidden"></el-button>
</div>
<div id="wDechart" class="chartClass" v-show="wdFlag"></div>
<div id="sDechart" class="chartClass" v-show="sdFlag"></div>
</div> -->
<div class="childTableShowBox">
<el-table
:data="childTableDate"
style="width: 100%"
v-loading="loading"
height="calc(100% - 2px)"
>
<el-table-column prop="updateTime" label="时间" width="138px">
<template slot-scope="scope">
<span v-if="scope.row.updateTime">
{{
$moment(scope.row.updateTime * 1000).format(
"YYYY-MM-DD HH:mm:ss"
)
}}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="airTemperature" label="温度(℃)">
<template slot-scope="scope">
<span
v-if="
scope.row.airTemperature !== null &&
scope.row.airTemperature != 255
"
>{{ scope.row.airTemperature.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="humidity" label="湿度(%RH)">
<template slot-scope="scope">
<span
v-if="
scope.row.humidity !== null && scope.row.humidity != 255
"
>{{ scope.row.humidity.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="maxWindSpeed" label="瞬时风速(m/s)">
<template slot-scope="scope">
<span
v-if="
scope.row.maxWindSpeed !== null &&
scope.row.maxWindSpeed != 255
"
>{{ scope.row.maxWindSpeed.toFixed(1) }}</span
>
<span v-else> - </span>
</template></el-table-column
>
<el-table-column prop="windDirection" label="瞬时风向(°)">
<template slot-scope="scope">
<span
v-if="
scope.row.windDirection !== null &&
scope.row.windDirection != 255
"
>{{ scope.row.windDirection.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="precipitation" label="雨量(mm/hour)">
<template slot-scope="scope">
<span
v-if="
scope.row.precipitation !== null &&
scope.row.precipitation != 255
"
>{{ scope.row.precipitation.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="airPressure" label="气压(hPa(百帕))">
<template slot-scope="scope">
<span
v-if="
scope.row.airPressure !== null &&
scope.row.airPressure != 255
"
>{{ scope.row.airPressure.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="radiationIntensity" label="日照(W/m2)">
<template slot-scope="scope">
<span
v-if="
scope.row.radiationIntensity !== null &&
scope.row.radiationIntensity != 255
"
>{{ scope.row.radiationIntensity.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column
prop="avgWindDir1min"
label="1分钟平均风速(m/s)"
></el-table-column>
<el-table-column
prop="avgWindSpeed1min"
label="1分钟平均风向(°)"
>
<template slot-scope="scope">
<span
v-if="
scope.row.avgWindSpeed1min !== null &&
scope.row.avgWindSpeed1min != 255
"
>{{ scope.row.avgWindSpeed1min.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column
prop="avgWindSpeed10min"
label="10分钟平均风速(m/s)"
>
<template slot-scope="scope">
<span> {{ scope.row.avgWindSpeed10min.toFixed(1) }} </span>
</template>
</el-table-column>
<el-table-column
prop="avgWindDir10min"
label="10分钟平均风向(°)"
>
<template slot-scope="scope">
<span v-if="scope.row.avgWindDir10min !== 65535">
{{ scope.row.avgWindDir10min.toFixed(1) }}</span
>
<span v-else> - </span>
</template>
</el-table-column>
<el-table-column prop="maxWindSpeed" label="10分钟最大风速(m/s)"
><template slot-scope="scope">
<span> {{ scope.row.maxWindSpeed.toFixed(1) }} </span>
</template></el-table-column
>
</el-table>
</div>
<div class="pageNation">
<el-pagination
@current-change="handlechildCurrentChange"
@size-change="handlechildSizeChange"
:current-page="childpage"
:page-size="childpageSize"
layout="sizes, prev, pager, next, jumper,total"
:total="childtotal"
>
</el-pagination>
</div>
<el-dialog title="温度折线图" :visible.sync="wdFlag">
<div id="wDechart" class="chartClass"></div>
</el-dialog>
<el-dialog title="湿度折线图" :visible.sync="sdFlag">
<div id="sDechart" class="chartClass"></div>
</el-dialog>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import leftTree from "../components/leftTree";
import { weatherJoggle, weatherListJoggle } from "@/utils/api/iceApi";
export default {
name: "weather",
components: {
leftTree,
},
data() {
return {
loading: false,
childFlag: false,
tableData: [],
childTableDate: [],
formdata: {},
page: 1, //
pageSize: 20, //
total: 0, //
paramsData: "",
childpage: 1, //
childpageSize: 20, //
childtotal: 0, //
childParma: "",
childMsg: "",
echartsData: "", //echarts
wdFlag: false,
sdFlag: false,
};
},
created() {
var that = this;
document.onkeydown = function (e) {
var key = window.event.keyCode;
if (key === 13) {
that.onSubmit(); //
}
};
},
watch: {
endtime(newVal) {
if (newVal) {
const date = new Date(newVal);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
this.formdata.endtime = date.getTime();
}
},
},
mounted() {
//this.getWeatherData();
},
methods: {
getCurrentData(data) {
console.log("执行父组件", data);
this.paramsData = data;
let weatherParams;
console.log(data);
if (data.dyValue) {
console.log("电压-公司");
weatherParams = {
devType: "3",
dyId: data.id,
pageNum: 1,
pageSize: this.pageSize,
};
this.getWeatherData(weatherParams);
} else if (data.bsManufacturer) {
console.log("线路-电压");
weatherParams = {
devType: "3",
lineId: data.id,
pageNum: 1,
pageSize: this.pageSize,
};
this.getWeatherData(weatherParams);
} else {
console.log("装置-杆塔");
// weatherParams = {
// pageNum: 1,
// pageSize: this.pageSize,
// towerId: data.towerid,
// };
this.childpage = 1;
this.moreDataClick(data);
// this.getWeatherData(weatherParams);
}
//this.getAllData(data);
},
getWeatherData(data) {
console.log(data);
this.childFlag = false;
this.loading = true;
weatherJoggle(data)
.then((res) => {
console.log(res);
this.tableData = res.data.list;
this.total = res.data.total;
this.loading = false;
})
.catch((err) => {
console.log(err); //
});
},
//
handleCurrentChange(val) {
this.page = val;
let data = this.paramsData;
let weatherParams;
this.tableData = [];
if (data.dyValue) {
console.log("电压-公司");
weatherParams = {
devType: "3",
dyId: data.id,
pageNum: this.page,
pageSize: this.pageSize,
};
this.getWeatherData(weatherParams);
} else if (data.bsManufacturer) {
console.log("线路-电压");
weatherParams = {
devType: "3",
lineId: data.id,
pageNum: this.page,
pageSize: this.pageSize,
};
this.getWeatherData(weatherParams);
} else {
console.log("装置-杆塔");
weatherParams = {
pageNum: this.page,
pageSize: this.pageSize,
towerId: data.towerid,
};
this.getWeatherData(weatherParams);
}
//this.getCurrentData(this.paramsData);
},
//
handleSizeChange(val) {
this.pageSize = val;
this.tableData = [];
let data = this.paramsData;
let weatherParams;
this.tableData = [];
if (data.dyValue) {
console.log("电压-公司");
weatherParams = {
devType: "3",
dyId: data.id,
pageNum: this.page,
pageSize: this.pageSize,
};
this.getWeatherData(weatherParams);
} else if (data.bsManufacturer) {
console.log("线路-电压");
weatherParams = {
devType: "3",
lineId: data.id,
pageNum: this.page,
pageSize: this.pageSize,
};
this.getWeatherData(weatherParams);
} else {
console.log("装置-杆塔");
weatherParams = {
pageNum: this.page,
pageSize: this.pageSize,
towerId: data.towerid,
};
this.getWeatherData(weatherParams);
}
},
//
moreDataClick(row) {
this.childFlag = true;
console.log(row);
this.$set(
this.formdata,
"starttime",
new Date(new Date().toLocaleDateString()).getTime()
);
const currentDate = new Date(); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.$set(this.formdata, "endtime", currentDate.getTime());
this.childParma = row;
this.getchildWeatherData(row);
},
//
onSubmit() {
this.getchildWeatherData(this.childParma);
},
getchildWeatherData(row) {
this.loading = true;
this.childMsg = row;
console.log("我是子数据", row);
const sTime = Math.floor(this.formdata.starttime / 1000);
const eTime = Math.floor(this.formdata.endtime / 1000);
weatherListJoggle({
// lineId: row.lineId,
termId: row.id,
towerId: row.towerId,
start: sTime,
end: eTime,
pageNum: this.childpage,
pageSize: this.childpageSize,
})
.then((res) => {
console.log(res);
this.childTableDate = res.data.list;
this.childtotal = res.data.total;
this.loading = false;
//线
this.getAllData(row);
})
.catch((err) => {
console.log(err); //
});
},
getAllData(row) {
const sTime = Math.floor(this.formdata.starttime / 1000);
const eTime = Math.floor(this.formdata.endtime / 1000);
weatherListJoggle({
// lineId: row.lineId,
termId: row.id,
towerId: row.towerId,
start: sTime,
end: eTime,
pageNum: 1,
pageSize: 1000,
})
.then((res) => {
console.log(res);
this.echartsData = res.data.list;
})
.catch((err) => {
console.log(err); //
});
},
onWdLine() {
this.wdFlag = true;
this.sdFlag = false;
//线
this.getEchart4(this.echartsData);
},
onSdLine() {
this.wdFlag = false;
this.sdFlag = true;
this.getEchart5(this.echartsData);
},
onHidden() {
this.wdFlag = false;
this.sdFlag = false;
},
//
getEchart4(wd) {
this.$nextTick(() => {
this.$echarts.init(document.getElementById("wDechart"));
this.mywDechart = this.$echarts.init(
document.getElementById("wDechart")
);
console.log(wd);
var xData = [];
var yData = [];
xData = wd.map((item) =>
this.$moment(item.updateTime * 1000).format("YYYY-MM-DD HH:mm:ss")
);
yData = wd.map((item) => item.airTemperature);
let option = {
tooltip: {
trigger: "axis",
},
grid: {
//left: "6%", //
//right: "6%", //
bottom: "15%", //
//top: "2%", //
},
title: {
text: "温度变化趋势",
x: "center", //
textStyle: {
//
color: "#333", //
fontSize: 16, //
fontWeight: "normal",
},
},
toolbox: {
show: true,
feature: {
dataView: { readOnly: false },
magicType: { type: ["line", "bar"] },
restore: {},
saveAsImage: {},
},
},
dataZoom: [
{
show: true,
realtime: true,
start: 0,
end: 100,
},
{
type: "inside",
realtime: true,
start: 0,
end: 100,
},
],
xAxis: {
name: "时间", //
type: "category",
boundaryGap: false,
data: xData,
},
yAxis: {
name: "温度", //
type: "value",
axisLabel: {
formatter: "{value} °C",
},
},
series: [
{
name: "温度",
symbol: "none",
type: "line",
data: yData,
},
],
};
this.mywDechart.setOption(option);
window.addEventListener("resize", () => {
this.mywDechart.resize();
});
});
},
getEchart5(sd) {
this.$nextTick(() => {
this.$echarts.init(document.getElementById("sDechart"));
this.mysDechart = this.$echarts.init(
document.getElementById("sDechart")
);
console.log(sd);
var xData = [];
var yData = [];
xData = sd.map((item) =>
this.$moment(item.updateTime * 1000).format("YYYY-MM-DD HH:mm:ss")
);
yData = sd.map((item) => item.humidity);
let option = {
tooltip: {
trigger: "axis",
},
grid: {
//left: "6%", //
//right: "6%", //
bottom: "15%", //
//top: "2%", //
},
title: {
text: "湿度变化趋势",
x: "center", //
textStyle: {
//
color: "#333", //
fontSize: 16, //
fontWeight: "normal",
},
},
toolbox: {
show: true,
feature: {
dataView: { readOnly: false },
magicType: { type: ["line", "bar"] },
restore: {},
saveAsImage: {},
},
},
dataZoom: [
{
show: true,
realtime: true,
start: 0,
end: 100,
},
{
type: "inside",
realtime: true,
start: 0,
end: 100,
},
],
xAxis: {
name: "时间", //
type: "category",
boundaryGap: false,
data: xData,
},
yAxis: {
name: "湿度", //
type: "value",
axisLabel: {
formatter: "{value} %RH",
},
},
series: [
{
name: "湿度",
symbol: "none",
type: "line",
data: yData,
},
],
};
this.mysDechart.setOption(option);
window.addEventListener("resize", () => {
this.mysDechart.resize();
});
});
},
changedate() {
console.log(new Date(this.formdata.endtime));
const currentDate = new Date(this.formdata.endtime); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.formdata.endtime = currentDate;
console.log("结束时间", this.formdata.endtime);
},
//child
handlechildCurrentChange(val) {
this.childpage = val;
this.childTableDate = [];
this.getchildWeatherData(this.childParma);
},
//child
handlechildSizeChange(val) {
this.childpageSize = val;
this.childTableDate = [];
this.getchildWeatherData(this.childParma);
},
},
};
</script>
<style lang="less">
.weatherBox {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
background: #fff;
.weatherContain {
display: flex;
height: 100%;
box-sizing: border-box;
background: #fff;
border: 1px solid #ddd;
border-radius: 4px;
}
.rightTable {
display: flex;
width: 100%;
height: 100%;
flex: 1;
overflow: auto;
border-left: 1px solid #ddd;
.el-table .el-table__cell {
text-align: center;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.dataBox {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
background: #fff;
}
.fatherTableShowBox {
height: calc(100% - 0px);
}
.childBox {
height: 100%;
.chartClass {
height: 450px;
width: 100%;
}
// .echartsBox {
// display: flex;
// flex-direction: column;
// align-items: center;
// .btnbox {
// display: flex;
// margin-bottom: 8px;
// .el-button--primary {
// width: auto;
// }
// }
// }
.childTableShowBox {
h3 {
font-size: 16px;
font-weight: normal;
margin-bottom: 8px;
text-align: center;
color: #666;
margin-top: 16px;
}
height: calc(100% - 124px);
}
.termalBox {
margin-bottom: 4px;
display: flex;
align-items: center;
line-height: 32px;
p {
.text {
margin-right: 12px;
}
}
.gropBtn {
//margin-left: auto;
}
}
}
}
}
</style>

@ -19,8 +19,8 @@
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="DY等级" prop="dyLevelid">
<el-select v-model="formdata.dyLevelid" placeholder="请选择电压等级">
<el-form-item label="DY等级" prop="dyLevelId">
<el-select v-model="formdata.dyLevelId" placeholder="请选择电压等级">
<el-option
v-for="items in dyOptions"
:key="items.id"
@ -32,6 +32,12 @@
<el-form-item label="线路名称:" prop="name">
<el-input v-model="formdata.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="上图数量:" prop="photoCount">
<el-input v-model="formdata.photoCount" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="正常上图率:" prop="photoRate">
<el-input v-model="formdata.photoRate" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
@ -60,7 +66,7 @@ export default {
bsManufacturer: [
{ required: true, message: "请输入公司名称", trigger: "blur" },
],
dyLevelid: [
dyLevelId: [
{ required: true, message: "请选择DY等级", trigger: "change" },
],
@ -154,7 +160,7 @@ export default {
created() {
getdyListJoggle().then((res) => {
console.log(res);
this.dyOptions = res.data.list;
this.dyOptions = res.data;
console.log(this.dyOptions);
});
},

@ -9,6 +9,17 @@
</div>
<div class="searchBox">
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="电压等级" class="dybox">
<el-select v-model="formdata.dyId">
<el-option
v-for="item in dyOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input
v-model="formdata.search"
@ -48,7 +59,7 @@
</el-table-column>
<el-table-column
prop="dyLevelname"
prop="dyLevelName"
label="电压等级名称"
show-overflow-tooltip
min-width="120"
@ -79,7 +90,10 @@
{{ scope.row.status == 1 ? "已启用" : "未启用" }}</template
>
</el-table-column>
<el-table-column prop="photoCount" label="上图数量" min-width="120">
</el-table-column>
<el-table-column prop="photoRate" label="正常上图率" min-width="120">
</el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button
@ -123,10 +137,15 @@
</div>
</template>
<script>
import { getLineListJoggle, deleteLineJoggle } from "@/utils/api/index";
import {
getLineListJoggle,
getSearchInfo,
deleteLineJoggle,
} from "@/utils/api/index";
import addLineDialog from "./components/addLineDialog.vue";
import addTowerDialog from "./components/addTowerDialog.vue";
export default {
name: "lineInformation",
components: {
addLineDialog,
addTowerDialog,
@ -141,8 +160,11 @@ export default {
total: 0, //
loading: true,
formdata: {
dyId: -1,
search: "",
},
dyOptions: [{ id: -1, name: "全部" }], //
};
},
created() {
@ -158,12 +180,23 @@ export default {
// console.log(this.formdata.search);
},
mounted() {
this.getSearchdy();
this.lineList();
},
methods: {
getRowKeys(row) {
return row.id;
},
//
getSearchdy() {
getSearchInfo({ type: 1 })
.then((res) => {
this.dyOptions = this.dyOptions.concat(res.data.list);
this.formdata.dyId = this.dyOptions[0].id;
})
.catch((err) => {});
},
//线
lineList() {
this.loading = true;
@ -192,7 +225,11 @@ export default {
},
//
onReset() {
this.formdata = {};
this.formdata = {
dyId: -1,
search: "",
};
this.page = 1;
this.pageSize = 20;
this.lineList();
@ -221,9 +258,7 @@ export default {
//
handleDelete(data) {
let deleteArr = [];
deleteArr.push({
id: data.id,
});
deleteArr.push(data.id);
this.$confirm("确定要删除记录吗,同时删除关联关系?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
@ -231,7 +266,22 @@ export default {
})
.then(() => {
deleteLineJoggle({ list: deleteArr }).then((res) => {
if (res.code == 200) {
this.$message({
duration: 1500,
showClose: true,
type: "success",
message: "删除成功!",
});
this.lineList(); //
} else {
this.$message({
duration: 1500,
showClose: true,
type: "error",
message: "删除失败!",
});
}
});
this.$message({
duration: 1500,

@ -49,6 +49,7 @@ import { mapMutations } from "vuex";
import { loginJoggle } from "@/utils/api/index";
export default {
name: "login",
components: {},
data: function () {
return {
@ -78,7 +79,8 @@ export default {
loginJoggle(this.userInfo)
.then((res) => {
if (res.code == 200) {
this.$store.commit("SET_TOKEN", res.data.sessionId); //tokenvuex
console.log(res.data);
this.$store.commit("SET_TOKEN", res.data.token); //tokenvuex
this.$store.commit("SET_USERINFO", res.data); //vuex
this.$router.push("/stritl");
this.$message({

@ -0,0 +1,285 @@
<template>
<div class="otherCommon">
<div class="setWater">
<h4>termid 转换</h4>
<div class="waterForm">
<div class="cmdidBox">
<h5>装置编号</h5>
<el-input
type="textarea"
:rows="16"
placeholder="请输入装置编号"
v-model="cmdidtextarea"
>
</el-input>
</div>
<div class="leftWaterBox">
<h5>新装置编号</h5>
<el-input
type="textarea"
:rows="16"
placeholder="请输入左侧水印"
v-model="newCmdidText"
>
</el-input>
</div>
</div>
<el-button type="primary" @click="handleSure"> </el-button>
<el-button type="primary" @click="copyShare"> </el-button>
<el-button class="mlspan" type="text"
><i>{{ issueCommands.length }}</i
>条命令</el-button
>
<div class="commandsBox" id="copy-content">
<div class="aaa" v-for="item in issueCommands" v-html="item"></div>
</div>
</div>
<!-- 上位机转换 -->
<div class="setWater">
<h4>上位机转换</h4>
<div class="waterForm">
<div class="cmdidBox">
<h5>装置编号</h5>
<el-input
type="textarea"
:rows="16"
placeholder="请输入装置编号"
v-model="cmdidCmatextarea"
>
</el-input>
</div>
</div>
<el-button type="primary" @click="handleSureCma"> </el-button>
<el-button type="primary" @click="copyCmaShare"> </el-button>
<el-button class="mlspan" type="text"
><i>{{ cmaissueCommands.length }}</i
>条命令</el-button
>
<div class="commandsBox" id="copy-content2">
<div class="aaa" v-for="item in cmaissueCommands" v-html="item"></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "otherCommon",
data() {
return {
cmdidtextarea: "", //
cmdidArr: [],
newCmdidText: "", //
newCmdidArr: [],
issueCommands: [], //
cmdidCmatextarea: "",
cmdidCmaArr: [],
cmaissueCommands: [], //
};
},
created() {},
methods: {
handleSure() {
if (this.cmdidtextarea !== "") {
this.cmdidArr = [...this.cmdidtextarea.trim().split("\n")]; //
} else {
this.$message({
showClose: true,
message: "请输入装置编号",
type: "warning",
});
return;
}
if (this.newCmdidText !== "") {
this.newCmdidArr = [...this.newCmdidText.trim().split("\n")]; //
} else {
this.$message({
showClose: true,
message: "请输入新装置编号",
type: "warning",
});
return;
}
console.log(this.cmdidArr);
console.log(this.newCmdidArr);
this.issueCommands = [];
this.getnewID();
},
getnewID() {
//.\bin\xympadmn.exe --server=61.169.135.150 --port=6891 --act=termid --cmdid=XYIGA10C241000036 --rf=1 --newcmdid=12M10010107183656
for (let i = 0; i < this.cmdidArr.length; i++) {
var command =
".\\bin\\xympadmn.exe --server=61.169.135.150 --port=6891 --act=termid --cmdid=" +
this.cmdidArr[i] +
" --rf=1" +
" --newcmdid=" +
this.newCmdidArr[i];
this.issueCommands.push(command); //push
}
console.log(this.issueCommands);
},
copyShare() {
let div = document.getElementById("copy-content");
let range = "";
if (document.body.createTextRange) {
//ie
range = document.body.createTextRange();
range.moveToElementText(div);
range.select();
} else if (window.getSelection) {
// IEFirefox/chrome
let selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(div);
selection.removeAllRanges();
selection.addRange(range);
}
document.execCommand("Copy"); //
console.log("已复制好,可贴粘");
},
//cma
handleSureCma() {
if (this.cmdidCmatextarea !== "") {
this.cmdidCmaArr = [...this.cmdidCmatextarea.trim().split("\n")]; //
} else {
this.$message({
showClose: true,
message: "请输入装置编号",
type: "warning",
});
return;
}
console.log(this.cmdidCmaArr);
this.cmaissueCommands = [];
this.getnewCma();
},
getnewCma() {
//.\bin\xympadmn.exe --server=61.169.135.150 --port=6891 --act=termid --cmdid=XYIGA10C241000036 --rf=1 --newcmdid=12M10010107183656
//.\bin\xympadmn.exe --server=61.169.135.150 --port=6891 --act=cma --cmdid=12M10010107183755 --ip=220.248.250.22 --cmaport=18096 --domain=
for (let i = 0; i < this.cmdidCmaArr.length; i++) {
var command =
".\\bin\\xympadmn.exe --server=61.169.135.150 --port=6891 --act=cma --cmdid=" +
this.cmdidCmaArr[i] +
" --ip=220.248.250.22 --cmaport=18096 --domain=";
this.cmaissueCommands.push(command); //push
}
console.log(this.cmaissueCommands);
},
copyCmaShare() {
let div = document.getElementById("copy-content2");
let range = "";
if (document.body.createTextRange) {
//ie
range = document.body.createTextRange();
range.moveToElementText(div);
range.select();
} else if (window.getSelection) {
// IEFirefox/chrome
let selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(div);
selection.removeAllRanges();
selection.addRange(range);
}
document.execCommand("Copy"); //
console.log("已复制好,可贴粘");
},
},
};
</script>
<style lang="less">
.otherCommon {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
background: #fff;
display: flex;
justify-content: space-between;
.setWater {
width: 48%;
border: 1px solid #dddddd;
height: calc(100% - 24px);
padding: 12px;
border-radius: 4px;
.waterForm {
width: 100%;
height: 50%;
margin-top: 16px;
// background: #fcc;
display: flex;
.channelBox {
width: 150px;
border: 1px solid #dddddd;
padding: 12px;
border-radius: 4px;
margin-right: 8px;
.groupCheck {
display: flex;
flex-direction: column;
margin-top: 12px;
.el-checkbox {
height: 32px;
line-height: 32px;
}
}
}
.cmdidBox {
width: 250px;
border: 1px solid #dddddd;
padding: 12px;
border-radius: 4px;
margin-right: 8px;
.el-textarea {
margin-top: 2px;
}
}
.leftWaterBox {
margin-right: 8px;
}
.leftWaterBox,
.rghtWaterBox {
flex: 1;
border: 1px solid #dddddd;
padding: 12px;
border-radius: 4px;
.el-textarea {
margin-top: 2px;
}
}
}
.el-button {
margin-top: 4px;
}
.commandsBox {
width: auto;
height: calc(50% - 106px);
margin-top: 8px;
border: 1px solid #fcc;
overflow: auto;
padding: 8px;
border-radius: 4px;
}
.mlspan {
// margin-left: 24px;
// height: 32px;
// line-height: 32px;
// margin-top: 4px;
// display: inline-block;
font-size: 14px;
color: #000;
cursor: default;
i {
color: #169e8c;
font-weight: bold;
font-style: normal;
}
}
}
}
</style>

@ -0,0 +1,547 @@
<template>
<div class="realTimeSearchTotal">
<div class="searchMain">
<div class="searchBox" ref="searchref">
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="电压等级">
<el-select v-model="formdata.dyid" @change="getSearchxl">
<el-option
v-for="item in dyOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
{{ item.name }}
</el-option>
</el-select>
</el-form-item>
<el-form-item label="线路名称">
<el-select
v-model="formdata.lineid"
@change="getSearchgt"
filterable
>
<el-option
v-for="item in xlOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="杆塔名称">
<el-select
v-model="formdata.towerid"
@change="getSearchzz"
filterable
>
<el-option
v-for="item in gtOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="装置名称">
<el-select
v-model="formdata.termid"
@change="getSearchtd"
filterable
>
<el-option
v-for="item in zzOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="通道">
<el-select v-model="formdata.channelid">
<el-option
v-for="item in tdOptions"
:key="item.id"
:label="
item.alias !== null && item.alias !== ''
? item.alias
: item.name
"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="开始日期">
<el-date-picker
v-model="formdata.starttime"
type="datetime"
placeholder="开始日期"
value-format="timestamp"
:picker-options="pickerOptions"
default-time="00:00:00"
>
</el-date-picker>
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
v-model="formdata.endtime"
type="datetime"
default-time="23:59:59"
placeholder="结束日期"
value-format="timestamp"
:picker-options="pickerOptions"
class="ml10"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-input
v-model="formdata.search"
placeholder="请输入线路/杆塔/设备名称"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
</div>
<div class="pictureBox" v-loading="loading">
<el-table :data="picList" style="width: 100%" height="calc(100% - 0px)">
<el-table-column prop="cmdid" label="装置编号" width="180">
</el-table-column>
<el-table-column prop="total" label="图片总数" width="180">
</el-table-column>
<el-table-column prop="wrongCount" label="异常时间点" width="180">
</el-table-column>
<el-table-column prop="channels" label="异常数据列表">
<template slot-scope="scope">
<div v-for="channelItem in scope.row.channels">
<span v-for="presetItem in channelItem.presets">
<p
v-for="wrongHour in presetItem.hours"
v-if="wrongHour.wrong == true"
>
通道{{ channelItem.channelId }}-预置位{{
presetItem.presetId
}}
-<span>
{{ wrongHour.hour }}-<span v-if="wrongHour.total > 2"
>{{ wrongHour.total - 2 }}</span
><span v-else="wrongHour.total < 2"
>{{ 2 - wrongHour.total }}</span
></span
>
</p>
</span>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="pageNation" v-if="picList.length !== 0">
<el-pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page="page"
:page-size="pageSize"
:page-sizes="[20, 50, 100, 200]"
layout="sizes, prev, pager, next, jumper,total"
:total="total"
background
>
</el-pagination>
</div>
</div>
</div>
</template>
<script>
import { getSearchInfo, getPhotoStatApi } from "@/utils/api/index";
import defaultImage from "../../assets/img/nodatapic2.jpg";
export default {
name: "realTimeSearch",
data() {
return {
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
picList: [],
dyOptions: [{ id: -1, name: "全部" }], //
xlOptions: [{ id: -1, name: "全部" }], //线
gtOptions: [{ id: -1, name: "全部" }], //
zzOptions: [{ id: -1, name: "全部" }], //
tdOptions: [{ id: -1, name: "全部", alias: null }], //
formdata: {
dyid: -1,
lineid: -1,
towerid: -1,
channelid: -1,
termid: -1,
search: "",
},
tdTermid: "",
page: 1, //
pageSize: 20, //
total: 0, //
loading: false,
signtype: 0, //0
channels: [
{ id: 1, name: "通道 1" },
{ id: 5, name: "通道 5" },
{ id: 7, name: "通道 7" },
],
presets: [
{ id: 1, name: "预置位1" },
{ id: 255, name: "默认预置位" },
],
};
},
created() {
var that = this;
document.onkeydown = function (e) {
var key = window.event.keyCode;
if (key === 13) {
that.onSubmit(); //
}
};
},
mounted() {
this.$set(this.formdata, "endtime", new Date().getTime());
if (JSON.stringify(this.$route.query) === "{}") {
this.$set(
this.formdata,
"starttime",
new Date(new Date().toLocaleDateString()).getTime()
);
this.getSearchdy();
} else {
this.getSearchdy();
this.formdata.dyid = this.$route.query.dyId;
this.formdata.lineid = this.$route.query.lineId;
this.formdata.towerid = this.$route.query.towerId;
this.formdata.channelid = this.$route.query.channelId;
this.formdata.termid = this.$route.query.termId;
this.$set(this.formdata, "starttime", Number(this.$route.query.date));
this.getPicData();
}
},
methods: {
setDefaultImage(e) {
e.target.src = defaultImage;
},
//
getSearchdy() {
getSearchInfo({ type: 1 })
.then((res) => {
this.dyOptions = this.dyOptions.concat(res.data.list);
console.log(this.dyOptions);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.dyid = this.dyOptions[0].id;
} else {
this.formdata.dyid = Number(this.$route.query.dyId);
}
this.getSearchxl();
})
.catch((err) => {});
},
//线
getSearchxl() {
getSearchInfo({ type: 2, id: this.formdata.dyid })
.then((res) => {
this.xlOptions = [{ id: -1, name: "全部" }];
this.xlOptions = this.xlOptions.concat(res.data.list);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.lineid = this.xlOptions[0].id;
} else {
this.formdata.lineid = Number(this.$route.query.lineId);
}
this.getSearchgt();
})
.catch((err) => {});
},
//
getSearchgt() {
getSearchInfo({ type: 3, id: this.formdata.lineid })
.then((res) => {
this.gtOptions = [{ id: -1, name: "全部" }];
this.gtOptions = this.gtOptions.concat(res.data.list);
// this.formdata.towerid = this.gtOptions[0].id;
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.towerid = this.gtOptions[0].id;
} else {
this.formdata.towerid = Number(this.$route.query.towerId);
}
this.getSearchzz();
})
.catch((err) => {});
},
//
getSearchzz() {
getSearchInfo({ type: 4, id: this.formdata.towerid })
.then((res) => {
this.zzOptions = [{ id: -1, name: "全部" }];
this.zzOptions = this.zzOptions.concat(res.data.list);
// this.formdata.termid = this.zzOptions[0].id;
console.log("切换了杆塔");
// console.log(this.formdata.termid);
// console.log(this.zzOptions[0].id);
// this.formdata.termid = this.zzOptions[0].id;
// console.log(this.formdata.termid);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.termid = this.zzOptions[0].id;
} else {
this.formdata.termid = Number(this.$route.query.termId);
}
this.getSearchtd();
})
.catch((err) => {});
},
//
getSearchtd() {
getSearchInfo({ type: 5, id: this.formdata.termid })
.then((res) => {
this.tdOptions = [{ id: -1, name: "全部", alias: null }];
this.tdOptions = this.tdOptions.concat(res.data.list);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.channelid = this.tdOptions[0].id;
} else {
this.formdata.channelid = Number(this.$route.query.channelId);
}
//this.getPicData();
})
.catch((err) => {});
},
getSearchtdAlone() {
getSearchInfo({ type: 5, id: this.tdTermid })
.then((res) => {
this.tdOptions = [{ id: -1, name: "全部", alias: null }];
this.tdOptions = this.tdOptions.concat(res.data.list);
})
.catch((err) => {});
},
//
getPicData() {
this.loading = true;
this.$set(this.formdata, "pageindex", this.page);
this.$set(this.formdata, "pagesize", this.pageSize);
console.log(this.formdata);
getPhotoStatApi(this.formdata)
.then((res) => {
// this.picList = [];
this.picList = res.data;
// this.total = res.data.total;
// this.tdTermid = res.data.list[0].termid;
// this.getSearchtdAlone();
// console.log(this.$route.query);
this.loading = false;
})
.catch((err) => {
this.loading = false;
console.log(err);
});
},
//
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
return this.$message({
duration: 1500,
showClose: true,
message: "开始日期不能大于结束日期",
type: "warning",
});
}
this.page = 1;
this.getPicData();
},
processData() {
this.picList = this.rawData.map((device) => {
const abnormalInfo = [];
device.channels.forEach((channel) => {
channel.presets.forEach((preset) => {
preset.hours.forEach((hour) => {
if (hour.wrong) {
const time = hour.hour.split(" ")[1] + ":00";
const expected = hour.base;
const actual = hour.timeList.length;
if (actual > expected) {
abnormalInfo.push(
`通道${channel.channelId}${time}${
actual - expected
}条数据共${actual}预期${expected}`
);
} else if (actual < expected) {
abnormalInfo.push(
`通道${channel.channelId}${time}${
expected - actual
}条数据共${actual}预期${expected}`
);
}
}
});
});
});
return {
cmdid: device.cmdid,
abnormalInfo,
};
});
},
//
handleCurrentChange(val) {
this.page = val;
//this.picList = [];
this.getPicData();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getPicData();
},
},
};
</script>
<style lang="less">
.realTimeSearchTotal {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
background: #fff;
.searchMain {
border: 1px solid #dddddd;
height: calc(100% - 22px);
padding: 12px;
border-radius: 4px;
.ml10 {
margin-left: 10px;
}
}
.pictureBox {
display: flex;
// justify-content: space-around;
flex-wrap: wrap;
height: calc(100% - 138px);
max-height: calc(100% - 138px);
border: 1px solid #eee;
.picShowBox {
height: 100%;
overflow: auto;
}
.imgList {
width: calc((100% - 104px) / 4);
position: relative;
display: inline-block;
margin: 8px;
position: relative;
padding: 4px;
border-radius: 3px;
background: #fff;
height: 200px;
.el-card__body {
padding: 0px;
height: 100%;
}
.bigpic {
width: 100%;
height: 100%;
//background-size: 100% 100%;
position: relative;
.el-image {
width: 100%;
height: 100%;
.el-image__placeholder {
background: url(../../assets/img/nopicbg.png) no-repeat center;
background-size: 20% 20%;
}
img {
cursor: pointer;
width: 100%;
height: 200px;
}
}
&:hover {
.deleteBox {
display: block;
}
}
}
.caption {
position: absolute;
bottom: 0px;
background: #169e8ca1;
width: calc(100% - 8px);
padding: 4px;
color: #333;
.infoTop {
font-size: 16px;
color: #fff;
font-weight: normal;
margin-top: 2px;
padding-left: 5px;
padding-right: 5px;
}
.infoBottom {
color: #fff;
font-size: 12px;
font-weight: normal;
margin-top: 6px;
padding-left: 5px;
padding-right: 5px;
}
}
.deleteBox {
position: absolute;
right: 4px;
top: 4px;
z-index: 2;
display: none;
.el-button {
width: auto;
background: rgba(0, 0, 0, 0.5);
border: 1px solid transparent;
color: #fff;
font-size: 16px;
padding: 3px;
}
&:hover {
.el-button {
background: #f56c6c;
//color: #f56c6c;
}
}
}
}
.el-loading-mask {
background-color: rgba(255, 255, 255, 0.4);
}
.noPicBox {
display: flex;
width: 100%;
height: calc(100% - 86px);
overflow: auto;
.el-empty {
margin: auto;
}
}
}
}
</style>

@ -127,7 +127,7 @@ export default {
created() {
getdyListJoggle().then((res) => {
console.log(res);
this.dyOptions = res.data.list;
this.dyOptions = res.data;
console.log(this.dyOptions);
});
},

@ -13,11 +13,25 @@
:rules="rules"
:model="formInfo"
>
<el-form-item label="电压等级:" prop="dyId">
<el-select
v-model="formInfo.dyId"
placeholder="请选择"
@change="getSearchxl"
>
<el-option
v-for="item in dyOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="线路名称:" prop="lineId">
<el-select
v-model="formInfo.lineId"
placeholder="请选择"
@change="getTowerchange"
@change="getSearchgt"
>
<el-option
v-for="item in lineOptions"
@ -39,8 +53,18 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="装置ID" prop="cmdId">
<el-input v-model="formInfo.cmdId" autocomplete="on"></el-input>
<el-form-item label="装置ID" prop="cmdid">
<el-input v-model="formInfo.cmdid" autocomplete="on"></el-input>
</el-form-item>
<el-form-item label="装置类型:" prop="devType">
<el-select v-model="formInfo.devType" placeholder="请选择">
<el-option
v-for="item in devTypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="云台选择:" prop="hasPan">
<el-select v-model="formInfo.hasPan" placeholder="请选择">
@ -55,7 +79,7 @@
<el-form-item label="装置名称:" prop="equipName">
<el-input v-model="formInfo.equipName" auto-complete="on"></el-input>
</el-form-item>
<el-form-item label="SIM卡" prop="sim">
<!-- <el-form-item label="SIM卡" prop="sim">
<el-input v-model="formInfo.sim" auto-complete="on"></el-input>
</el-form-item>
<el-form-item label="网络类型:" prop="netType">
@ -68,6 +92,9 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="ICCID" prop="iccid">
<el-input v-model="formInfo.iccid" auto-complete="on"></el-input>
</el-form-item> -->
<el-form-item label="装置型号:" prop="model">
<el-input v-model="formInfo.model" auto-complete="on"></el-input>
@ -102,11 +129,20 @@
value-format="timestamp"
></el-date-picker>
</el-form-item>
<!-- <el-form-item label="状态:" prop="status">
<el-select v-model="formInfo.statusId" placeholder="请选择">
<el-option v-for="item in statusOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
<el-form-item
v-if="photoDialogTitle == '修改'"
label="离线预警:"
prop="isfavor"
>
<el-select v-model="formInfo.isfavor" placeholder="请选择">
<el-option
v-for="item in isfavorOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item> -->
</el-form-item>
<el-divider></el-divider>
<h4>添加通道</h4>
<div class="addchannel" ref="channelBoxref">
@ -135,6 +171,16 @@
placeholder="请输入通道昵称"
></el-input>
</el-form-item>
<el-form-item label="是否云台:">
<el-select v-model="val.type">
<el-option
v-for="item in ytTypeOption"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<div class="btngrop">
<el-button
v-if="index !== 0"
@ -179,8 +225,8 @@ import {
addTerminalJoggle,
updateTerminalJoggle,
getAllChannelListJoggle,
getLineAndGtInfo,
getProtocolList,
getSearchInfo,
} from "@/utils/api/index";
export default {
props: {
@ -195,9 +241,9 @@ export default {
data() {
let validCmid = (rule, value, callback) => {
let reg = /^[0-9A-Za-z_/\\/-]{17}$/;
let reg = /^([0-9A-Za-z_\/\\-]{17}|[0-9A-Za-z_\/\\-]{6})$/;
if (!reg.test(value)) {
callback(new Error("装置id为17位编码"));
callback(new Error("装置id为17位编码或者6位编码"));
} else {
callback();
}
@ -207,20 +253,45 @@ export default {
formInfo: {},
channelOptions: [], //
filterOption: [], //
lineOptions: [], //线
toweridOptions: [], //
dyOptions: [], //
//
devTypeOptions: [
{
id: "1",
name: "微拍",
},
{
id: "2",
name: "覆冰拉力",
},
{
id: "3",
name: "微气象",
},
{
id: "23",
name: "覆冰、微气象",
},
{
id: "123",
name: "微拍、覆冰、微气象",
},
],
networkOptions: [
{
id: 1,
name: "移动",
name: "大汉移动",
},
{
id: 2,
name: "联通",
name: "公田移动",
},
{
id: 3,
name: "电信",
id: -1,
name: "无绑定",
},
], //
statusOptions: [
@ -247,9 +318,30 @@ export default {
name: "是",
},
],
ytTypeOption: [
{
id: 0,
name: "默认",
},
{
id: 1,
name: "云台",
},
],
//线
isfavorOptions: [
{
id: 1,
name: "是",
},
{
id: 0,
name: "否",
},
],
protocolOptions: [], //
rules: {
cmdId: [
cmdid: [
{ required: true, message: "请输入装置ID", trigger: "blur" },
{ validator: validCmid, trigger: "blur" },
],
@ -275,25 +367,28 @@ export default {
},
//
getdataform(val) {
this.getLine();
this.getSearchdy();
this.getChannel();
if (val == null) {
return (this.formInfo = {
dyId: "",
lineId: "",
towerId: "",
cmdId: "",
cmdid: "",
equipName: "",
devType: this.devTypeOptions[0].id,
hasPan: this.hasPanOptions[0].id,
sim: "",
netType: this.networkOptions[0].id,
model: "",
bsManufacturer: "",
model: "MSRDT-1-WP",
bsManufacturer: "上海欣影",
protocol: this.protocolOptions[0].id,
workingDate: new Date().getTime(),
list: [
{
id: "",
alias: "",
type: 0,
},
],
});
@ -304,6 +399,7 @@ export default {
val.list.push({
id: "",
alias: "",
type: 0,
});
}
@ -314,7 +410,8 @@ export default {
"workingDate",
new Date(this.formInfo.workingDate).getTime()
);
console.log(this.formInfo.workingDate);
console.log(this.formInfo);
},
//
changeHandle() {
@ -328,6 +425,7 @@ export default {
this.formInfo.list.push({
id: "",
alias: "",
type: 0,
});
this.filterOption = this.channelOptions.filter(
(val) => !this.formInfo.list.some((item) => item.id === val.id)
@ -373,7 +471,7 @@ export default {
// displayName: this.formInfo.cmdId,
// };
this.$set(this.formInfo, "workingDate", new Date().getTime());
this.$set(this.formInfo, "displayName", this.formInfo.cmdId);
this.$set(this.formInfo, "displayName", this.formInfo.cmdid);
console.log(this.formInfo);
addTerminalJoggle(this.formInfo)
.then((res) => {
@ -395,8 +493,10 @@ export default {
});
});
} else {
console.log(this.formInfo);
if (this.formInfo.list[0].id == "") {
this.$set(this.formInfo, "list", []);
}
console.log("修改aaaaaaaaaaaaaaa", this.formInfo);
updateTerminalJoggle(this.formInfo)
.then((res) => {
this.isShow = false;
@ -413,49 +513,53 @@ export default {
});
},
//线
getLine() {
getLineAndGtInfo({ type: 1 }).then((res) => {
this.lineOptions = res.data.list;
//
getSearchdy() {
getSearchInfo({ type: 1 })
.then((res) => {
this.dyOptions = res.data.list;
if (res.data.list.length == 0) {
this.lineOptions = [];
this.formInfo.lineId = "";
this.dyOptions = [];
this.formInfo.dyId = "";
} else {
this.dyOptions = res.data.list;
if (this.photoDialogTitle == "新增") {
// this.formInfo.lineId = res.data.list[0].id;
this.$set(this.formInfo, "dyId", res.data.list[0].id);
}
}
this.getSearchxl();
})
.catch((err) => {});
},
//线
getSearchxl() {
getSearchInfo({ type: 2, id: this.formInfo.dyId })
.then((res) => {
this.lineOptions = res.data.list;
if (this.photoDialogTitle == "新增") {
// this.formInfo.lineId = res.data.list[0].id;
this.$set(this.formInfo, "lineId", res.data.list[0].id);
}
}
// this.dyOptions = res.data.list;
// this.formdata.dyid = res.data.list == [] ? "" : res.data.list[0].id;
this.getTower();
});
this.getSearchgt();
})
.catch((err) => {});
},
//
getTower() {
getLineAndGtInfo({ type: 2, id: this.formInfo.lineId })
//
getSearchgt() {
getSearchInfo({ type: 3, id: this.formInfo.lineId })
.then((res) => {
if (res.data.list.length == 0) {
this.toweridOptions = [];
this.formInfo.towerId = "";
} else {
this.toweridOptions = res.data.list;
if (this.photoDialogTitle == "新增" || this.photoDialogtype == 1) {
// this.formInfo.towerId = res.data.list[0].id;
if (this.photoDialogTitle == "新增") {
// this.formInfo.lineId = res.data.list[0].id;
this.$set(this.formInfo, "towerId", res.data.list[0].id);
this.photoDialogtype = 0;
}
}
})
.catch((err) => {});
},
getTowerchange() {
if (this.photoDialogTitle == "修改") {
this.photoDialogtype = 1;
}
this.getTower();
},
//
getChannel() {
getAllChannelListJoggle()
@ -522,7 +626,10 @@ export default {
//justify-content: space-between;
padding-right: 6px;
.el-form-item {
width: 310px;
width: 202px;
// .el-form-item__content {
// width: 100px;
// }
}
.btngrop {
margin-bottom: 16px;

@ -1,16 +1,32 @@
<template>
<el-dialog
class="baseInforDialog"
title="基本信息"
title="基本信息"
:visible.sync="isShow"
:close-on-click-modal="false"
width="1280px"
width="1360px"
>
<div class="zzinfo">
<span v-if="rowInfo.protocol == '65280'"> I1 </span>
<span v-if="rowInfo.protocol == '65296'"> 西 </span>
<span v-if="rowInfo.protocol == '65281'"> </span>
<span v-if="rowInfo.protocol == '65282'"> </span>
<span v-if="rowInfo.protocol == '65283'"> </span>
<span v-if="rowInfo.protocol == '65284'"> </span>
<span v-if="rowInfo.protocol == '65285'"> </span>
<span v-if="rowInfo.protocol == '65286'"> </span>
<span v-if="rowInfo.protocol == '65290'"> v2020 </span>
<span v-if="rowInfo.protocol == '65298'"> </span>
<span v-if="rowInfo.protocol == '2'"> </span>
<span>{{rowInfo.protocol}}</span>
</div>
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="开始日期">
<el-date-picker
@change="changestartdate"
v-model="formdata.starttime"
type="datetime"
:picker-options="pickerOptions"
placeholder="开始日期"
value-format="timestamp"
>
@ -18,9 +34,10 @@
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
@change="changeenddate"
v-model="formdata.endtime"
type="datetime"
default-time="23:59:59"
:picker-options="pickerOptions"
placeholder="结束日期"
value-format="timestamp"
class="ml10"
@ -29,7 +46,7 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary">导出</el-button>
<el-button type="primary" @click="exportFault"></el-button>
</el-form-item>
</el-form>
<el-table
@ -38,6 +55,7 @@
stripe
tooltip-effect="dark"
style="width: 100%"
height="442px"
v-loading="loading"
>
<template slot="empty">
@ -49,59 +67,49 @@
</template>
</el-table-column>
<el-table-column
prop="name"
label="采集时间"
min-width="120"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="设备名称"
min-width="80"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="设备编号"
min-width="120"
prop="cmdid"
label="装置编号"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column prop="updateTimeStr" label="采集时间" min-width="140">
</el-table-column>
<el-table-column prop="equipName" label="装置名称" min-width="140">
</el-table-column>
<el-table-column prop="model" label="装置型号" show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="name"
label="装置名称"
min-width="80"
prop="bsId"
label="出厂编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="装置型号"
min-width="80"
prop="version"
label="基本信息版本号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="装置版本号"
min-width="80"
prop="protocolVersion"
label="通信协议版本号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="生产厂家"
min-width="100"
<!-- <el-table-column
prop="protocolVersion"
label="规约版本号V1.3"
show-overflow-tooltip
></el-table-column>
></el-table-column> -->
<el-table-column prop="bsManu" label="生产厂家"> </el-table-column>
<el-table-column
prop="name"
prop="productionDate"
label="生产日期"
min-width="120"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="出厂编号"
min-width="100"
show-overflow-tooltip
></el-table-column>
>
<template slot-scope="scope">
{{ $moment(scope.row.productionDate).format("YYYY-MM-DD") }}
</template>
</el-table-column>
</el-table>
<div class="pageNation">
<el-pagination
@ -116,36 +124,97 @@
</el-pagination>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button @click="hide"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getLineListJoggle } from "@/utils/api/index";
import {
getTermBasicInfoHistoryApi,
getTermBasicInfoHistoryApiExcel,
} from "@/utils/api/index";
export default {
data() {
return {
isShow: false,
formdata: {},
listData: [
{
name: "测试",
},
{
name: "测试2",
},
],
rowInfo: "",
listData: [],
loading: false,
seltermid: "", //id
selcmdId: "", //cmdId
requestId: "",
page: 1, //
pageSize: 20, //
pageSize: 10, //
total: 0, //
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
};
},
watch: {
endtime(newVal) {
if (newVal) {
const date = new Date(newVal);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
this.formdata.endtime = date;
}
},
},
created() {},
mounted() {},
methods: {
getTime() {
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setHours(0); // 23
thirtyDaysAgo.setMinutes(0); // 59
thirtyDaysAgo.setSeconds(0); // 59
console.log(
new Date(thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30))
);
const startTimeNew = new Date(
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate())
).getTime();
this.$set(this.formdata, "starttime", startTimeNew);
console.log("开始时间", this.formdata.starttime);
const currentDate = new Date(); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.$set(this.formdata, "endtime", currentDate.getTime());
console.log("结束时间", this.formdata.endtime);
this.getfaultinfo();
},
changestartdate(val) {
console.log(val);
if (val == null) {
console.log(new Date());
const startDate = new Date();
startDate.setHours(0); // 23
startDate.setMinutes(0); // 59
startDate.setSeconds(0); // 59
this.formdata.starttime = startDate;
console.log(this.formdata.starttime);
} else {
this.formdata.starttime = val;
}
},
//
changeenddate(val) {
if (val == null) {
console.log(new Date());
const endDate = new Date();
endDate.setHours(23); // 23
endDate.setMinutes(59); // 59
endDate.setSeconds(59); // 59
this.formdata.endtime = endDate;
console.log(this.formdata.endtime);
} else {
this.formdata.endtime = val;
console.log(val);
}
},
//
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
@ -156,45 +225,60 @@ export default {
type: "warning",
});
}
this.getlistnr();
this.getfaultinfo();
},
//
exportFault() {
window.location.href =
"/api/getTermBasicInfoHistoryApiExcel?termid=" + this.rowInfo.id;
},
//
getlistnr(val) {
console.log(val);
this.seltermid = val.id;
this.selcmdId = val.cmdid;
getfaultinfo() {
this.loading = true;
getLineListJoggle({
getTermBasicInfoHistoryApi({
termid: this.rowInfo.id,
// starttime: this.formdata.starttime,
// endtime: this.formdata.endtime,
pageindex: this.page,
pagesize: this.pageSize,
}).then((res) => {
this.listData = res.data.list;
this.total = res.data.total;
this.$nextTick(() => {
this.loading = false;
});
});
},
//
handleCurrentChange(val) {
this.page = val;
this.getlistnr();
this.getfaultinfo();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getlistnr();
this.getfaultinfo();
},
display() {
display(row) {
console.log(row);
this.rowInfo = row;
this.isShow = true;
this.getTime();
},
hide() {
this.isShow = false;
this.formdata = {};
},
},
};
</script>
<<<<<<< HEAD
<style lang="less">
.baseInforDialog {
.zzinfo {
position: absolute;
top: 22px;
left: 126px;
}
.pageNation {
justify-content: flex-start;
margin-top: 16px;
@ -207,6 +291,3 @@ export default {
}
}
</style>
=======
<style lang="less" scoped></style>
>>>>>>> hn1.0

@ -0,0 +1,266 @@
<template>
<el-dialog
class="faultInfo"
title="故障信息报"
:visible.sync="isShow"
:close-on-click-modal="false"
width="1000px"
>
<div class="zzinfo">
<span v-if="rowInfo.protocol == '65280'"> I1 </span>
<span v-if="rowInfo.protocol == '65296'"> 西 </span>
<span v-if="rowInfo.protocol == '65281'"> </span>
<span v-if="rowInfo.protocol == '65282'"> </span>
<span v-if="rowInfo.protocol == '65283'"> </span>
<span v-if="rowInfo.protocol == '65284'"> </span>
<span v-if="rowInfo.protocol == '65285'"> </span>
<span v-if="rowInfo.protocol == '65286'"> </span>
<span v-if="rowInfo.protocol == '65290'"> v2020 </span>
<span v-if="rowInfo.protocol == '65298'"> </span>
<span v-if="rowInfo.protocol == '2'"> </span>
<span>{{rowInfo.protocol}}</span>
</div>
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="开始日期">
<el-date-picker
@change="changestartdate"
v-model="formdata.starttime"
type="datetime"
:picker-options="pickerOptions"
placeholder="开始日期"
value-format="timestamp"
>
</el-date-picker>
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
@change="changeenddate"
v-model="formdata.endtime"
type="datetime"
:picker-options="pickerOptions"
placeholder="结束日期"
value-format="timestamp"
class="ml10"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary" @click="exportFault"></el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
:data="listData"
stripe
tooltip-effect="dark"
style="width: 100%"
height="442px"
v-loading="loading"
>
<template slot="empty">
<el-empty :image-size="160" description="暂无数据"></el-empty>
</template>
<el-table-column min-width="45" label="序号">
<template slot-scope="scope">
<span>{{ (page - 1) * pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column
prop="cmdid"
label="装置编号"
min-width="120"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="faultTime"
label="采集时间"
min-width="120"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="msg"
label="故障信息"
min-width="120"
show-overflow-tooltip
></el-table-column>
</el-table>
<div class="pageNation">
<el-pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page="page"
:page-size="pageSize"
layout="sizes, prev, pager, next, jumper,total"
:total="total"
background
>
</el-pagination>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="hide"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getTermFaultsApi, getTermFaultsExcel } from "@/utils/api/index";
export default {
data() {
return {
isShow: false,
formdata: {},
rowInfo: "",
listData: [],
loading: false,
page: 1, //
pageSize: 10, //
total: 0, //
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
};
},
watch: {
endtime(newVal) {
if (newVal) {
const date = new Date(newVal);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
this.formdata.endtime = date;
}
},
},
created() {},
mounted() {},
methods: {
getTime() {
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setHours(0); // 23
thirtyDaysAgo.setMinutes(0); // 59
thirtyDaysAgo.setSeconds(0); // 59
console.log(
new Date(thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30))
);
const startTimeNew = new Date(
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate())
).getTime();
this.$set(this.formdata, "starttime", startTimeNew);
console.log("开始时间", this.formdata.starttime);
const currentDate = new Date(); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.$set(this.formdata, "endtime", currentDate.getTime());
console.log("结束时间", this.formdata.endtime);
this.getfaultinfo();
},
changestartdate(val) {
console.log(val);
if (val == null) {
console.log(new Date());
const startDate = new Date();
startDate.setHours(0); // 23
startDate.setMinutes(0); // 59
startDate.setSeconds(0); // 59
this.formdata.starttime = startDate;
console.log(this.formdata.starttime);
} else {
this.formdata.starttime = val;
}
},
//
changeenddate(val) {
if (val == null) {
console.log(new Date());
const endDate = new Date();
endDate.setHours(23); // 23
endDate.setMinutes(59); // 59
endDate.setSeconds(59); // 59
this.formdata.endtime = endDate;
console.log(this.formdata.endtime);
} else {
this.formdata.endtime = val;
console.log(val);
}
},
//
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
return this.$message({
duration: 1500,
showClose: true,
message: "开始日期不能大于结束日期",
type: "warning",
});
}
this.getfaultinfo();
},
//
exportFault() {
window.location.href =
"/api/getTermFaultsExcel?termid=" + this.rowInfo.id;
},
//
getfaultinfo() {
this.loading = true;
getTermFaultsApi({
termid: this.rowInfo.id,
starttime: this.formdata.starttime,
endtime: this.formdata.endtime,
pageindex: this.page,
pagesize: this.pageSize,
}).then((res) => {
this.listData = res.data.list;
this.total = res.data.total;
this.$nextTick(() => {
this.loading = false;
});
});
},
//
handleCurrentChange(val) {
this.page = val;
this.getfaultinfo();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getfaultinfo();
},
display(row) {
console.log(row);
this.rowInfo = row;
this.isShow = true;
this.getTime();
},
hide() {
this.isShow = false;
this.formdata = {};
},
},
};
</script>
<style lang="less">
.faultInfo {
.zzinfo {
position: absolute;
top: 22px;
left: 126px;
}
.pageNation {
justify-content: flex-start;
margin-top: 16px;
.el-pagination {
padding: 0px;
.el-select .el-input {
margin-left: 0px;
}
}
}
}
</style>

@ -7,17 +7,6 @@
width="662px"
@close="handleclose"
>
<!-- <div class="gpsbox" v-loading="loading">
<p>
<span>经度</span><span>{{ infornr.longitude }}</span>
</p>
<p>
<span>纬度</span><span>{{ infornr.latitude }}</span>
</p>
<p>
<span>半径</span><span>{{ infornr.radius }}</span>
</p>
</div> -->
<div class="gpsbox" v-loading="loading">
<el-descriptions :column="1" border>
<el-descriptions-item>

@ -4,13 +4,29 @@
title="GPS位置数据"
:visible.sync="isShow"
:close-on-click-modal="false"
width="1280px"
width="1000px"
>
<div class="zzinfo">
<span v-if="rowInfo.protocol == '65280'"> I1 </span>
<span v-if="rowInfo.protocol == '65296'"> 西 </span>
<span v-if="rowInfo.protocol == '65281'"> </span>
<span v-if="rowInfo.protocol == '65282'"> </span>
<span v-if="rowInfo.protocol == '65283'"> </span>
<span v-if="rowInfo.protocol == '65284'"> </span>
<span v-if="rowInfo.protocol == '65285'"> </span>
<span v-if="rowInfo.protocol == '65286'"> </span>
<span v-if="rowInfo.protocol == '65290'"> v2020 </span>
<span v-if="rowInfo.protocol == '65298'"> </span>
<span v-if="rowInfo.protocol == '2'"> </span>
<span>{{rowInfo.protocol}}</span>
</div>
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="开始日期">
<el-date-picker
@change="changestartdate"
v-model="formdata.starttime"
type="datetime"
:picker-options="pickerOptions"
placeholder="开始日期"
value-format="timestamp"
>
@ -18,9 +34,10 @@
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
@change="changeenddate"
v-model="formdata.endtime"
type="datetime"
default-time="23:59:59"
:picker-options="pickerOptions"
placeholder="结束日期"
value-format="timestamp"
class="ml10"
@ -29,7 +46,7 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary">导出</el-button>
<el-button type="primary" @click="exportFault"></el-button>
</el-form-item>
</el-form>
<el-table
@ -39,6 +56,7 @@
tooltip-effect="dark"
style="width: 100%"
v-loading="loading"
height="442px"
>
<template slot="empty">
<el-empty :image-size="160" description="暂无数据"></el-empty>
@ -49,39 +67,29 @@
</template>
</el-table-column>
<el-table-column
prop="name"
label="采集时间"
min-width="120"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="设备名称"
min-width="80"
prop="cmdid"
label="装置编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="设备编号"
min-width="120"
prop="updateTimeStr"
label="采集时间"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
prop="radius"
label="半径"
min-width="80"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="维度"
min-width="80"
prop="latitude"
label="纬度"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
prop="longitude"
label="经度"
min-width="80"
show-overflow-tooltip
></el-table-column>
</el-table>
@ -98,36 +106,99 @@
</el-pagination>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button @click="hide"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getLineListJoggle } from "@/utils/api/index";
import {
getTermGpsHistoryApi,
getTermGpsHistoryExcel,
} from "@/utils/api/index";
export default {
data() {
return {
isShow: false,
formdata: {},
listData: [
{
name: "测试",
},
{
name: "测试2",
},
],
rowInfo: "",
listData: [],
loading: false,
seltermid: "", //id
selcmdId: "", //cmdId
requestId: "",
page: 1, //
pageSize: 20, //
pageSize: 10, //
total: 0, //
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
};
},
watch: {
endtime(newVal) {
if (newVal) {
const date = new Date(newVal);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
this.formdata.endtime = date;
}
},
},
created() {},
mounted() {},
methods: {
getTime() {
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setHours(0); // 23
thirtyDaysAgo.setMinutes(0); // 59
thirtyDaysAgo.setSeconds(0); // 59
console.log(
new Date(thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30))
);
const startTimeNew = new Date(
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate())
).getTime();
this.$set(this.formdata, "starttime", startTimeNew);
console.log("开始时间", this.formdata.starttime);
const currentDate = new Date(); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.$set(this.formdata, "endtime", currentDate.getTime());
console.log("结束时间", this.formdata.endtime);
this.getfaultinfo();
},
changestartdate(val) {
console.log(val);
if (val == null) {
console.log(new Date());
const startDate = new Date();
startDate.setHours(0); // 23
startDate.setMinutes(0); // 59
startDate.setSeconds(0); // 59
this.formdata.starttime = startDate;
console.log(this.formdata.starttime);
} else {
this.formdata.starttime = val;
}
},
//
changeenddate(val) {
if (val == null) {
console.log(new Date());
const endDate = new Date();
endDate.setHours(23); // 23
endDate.setMinutes(59); // 59
endDate.setSeconds(59); // 59
this.formdata.endtime = endDate;
console.log(this.formdata.endtime);
} else {
this.formdata.endtime = val;
console.log(val);
}
},
//
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
@ -138,45 +209,60 @@ export default {
type: "warning",
});
}
this.getlistnr();
this.getfaultinfo();
},
//
exportFault() {
window.location.href =
"/api/getTermGpsHistoryExcel?termid=" + this.rowInfo.id;
},
//
getlistnr(val) {
console.log(val);
this.seltermid = val.id;
this.selcmdId = val.cmdid;
getfaultinfo() {
this.loading = true;
getLineListJoggle({
getTermGpsHistoryApi({
termid: this.rowInfo.id,
// starttime: this.formdata.starttime,
// endtime: this.formdata.endtime,
pageindex: this.page,
pagesize: this.pageSize,
}).then((res) => {
this.listData = res.data.list;
this.total = res.data.total;
this.$nextTick(() => {
this.loading = false;
});
});
},
//
handleCurrentChange(val) {
this.page = val;
this.getlistnr();
this.getfaultinfo();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getlistnr();
this.getfaultinfo();
},
display() {
display(row) {
console.log(row);
this.rowInfo = row;
this.isShow = true;
this.getTime();
},
hide() {
this.isShow = false;
this.formdata = {};
},
},
};
</script>
<<<<<<< HEAD
<style lang="less">
.gpsSiteDialog {
.zzinfo {
position: absolute;
top: 22px;
left: 126px;
}
.pageNation {
justify-content: flex-start;
margin-top: 16px;
@ -189,6 +275,3 @@ export default {
}
}
</style>
=======
<style lang="less" scoped></style>
>>>>>>> hn1.0

@ -0,0 +1,189 @@
<template>
<el-dialog
class="changeIccicDialog"
title="修改ICCID"
:visible.sync="isShow"
:close-on-click-modal="false"
width="680px"
>
<el-form
label-position="left"
label-width="92px"
ref="formLineInfo"
:model="formdata"
>
<div class="left">
<el-form-item label="网络类型:" prop="type1">
<el-select v-model="formdata.type1" placeholder="请选择">
<el-option
v-for="item in networkOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="ICCID1" prop="iccid1">
<el-input placeholder="请输入iccid1" v-model="formdata.iccid1">
</el-input>
</el-form-item>
<el-form-item label="imsi1" prop="imsi1">
<el-input placeholder="请输入imsi1" v-model="formdata.imsi1">
</el-input>
</el-form-item>
<el-form-item label="msisdn1" prop="msisdn1">
<el-input placeholder="请输入msisdn1" v-model="formdata.msisdn1">
</el-input>
</el-form-item>
<el-form-item label="sim1" prop="sim1">
<el-input placeholder="请输入sim1" v-model="formdata.sim1">
</el-input>
</el-form-item>
</div>
<div class="right">
<el-form-item label="网络类型:" prop="type2">
<el-select v-model="formdata.type2" placeholder="请选择">
<el-option
v-for="item in networkOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="ICCID2" prop="iccid2">
<el-input placeholder="请输入iccid2" v-model="formdata.iccid2">
</el-input>
</el-form-item>
<el-form-item label="imsi2" prop="imsi2">
<el-input placeholder="请输入imsi2" v-model="formdata.imsi2">
</el-input>
</el-form-item>
<el-form-item label="msisdn2" prop="msisdn2">
<el-input placeholder="请输入msisdn2" v-model="formdata.msisdn2">
</el-input>
</el-form-item>
<el-form-item label="sim2" prop="sim2">
<el-input placeholder="请输入sim2" v-model="formdata.sim2">
</el-input>
</el-form-item>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button type="primary" @click="submitForm()"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getSimcardApi, updateSimcardApi } from "@/utils/api/index";
export default {
props: {},
data() {
return {
isShow: false,
termInfo: "",
formdata: {},
networkOptions: [
{
id: -1,
name: "未绑定",
},
{
id: 1,
name: "大汉移动",
},
{
id: 2,
name: "公田移动rabchase",
},
{
id: 3,
name: "公田m2m10086",
},
{
id: 4,
name: "安徽",
},
], //
};
},
computed: {},
methods: {
getsimCard() {
getSimcardApi({
termId: this.termInfo.id,
})
.then((res) => {
console.log(res);
if (res.code == 200 && res.data !== null) {
this.formdata = res.data;
} else {
this.formdata = {};
}
})
.catch((err) => {});
},
//
submitForm() {
console.log(this.formdata);
this.$refs.formLineInfo.validate((valid) => {
if (valid) {
console.log(this.formdata);
this.formdata.termId = this.termInfo.id;
updateSimcardApi(this.formdata)
.then((res) => {
console.log(res);
if (res.code == 200) {
this.isShow = false;
this.$message({
duration: 1500,
showClose: true,
message: "修改成功",
type: "success",
});
} else {
this.$message({
duration: 1500,
showClose: true,
message: res.msg,
type: "error",
});
}
})
.catch((err) => {});
} else {
console.log("error submit!!");
return false;
}
});
},
display(val) {
console.log(val);
this.termInfo = val;
this.isShow = true;
this.getsimCard();
},
hide() {
this.isShow = false;
this.formdata = {};
},
},
};
</script>
<style lang="less">
.changeIccicDialog {
.el-form {
display: flex;
justify-content: space-between;
}
.el-select {
width: 100%;
}
}
</style>

@ -0,0 +1,135 @@
<template>
<el-dialog
class="iccidDialog"
title="导入ICCID"
:visible.sync="isShow"
:close-on-click-modal="false"
width="420px"
>
<el-form
label-position="left"
label-width="92px"
ref="formLineInfo"
:model="formdata"
>
<el-form-item label="网络类型:" prop="netType">
<el-select v-model="formdata.netType" placeholder="请选择">
<el-option
v-for="item in networkOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="ICCID" prop="iccid">
<el-input
type="textarea"
:rows="10"
placeholder="请输入iccid"
v-model="formdata.iccid"
>
</el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button type="primary" @click="submitForm()"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { importiccidApi } from "@/utils/api/index";
export default {
props: {},
data() {
return {
isShow: false,
formdata: {},
networkOptions: [
{
id: -1,
name: "未绑定",
},
{
id: 1,
name: "大汉移动",
},
{
id: 2,
name: "公田移动rabchase",
},
{
id: 3,
name: "公田m2m10086",
},
{
id: 4,
name: "安徽",
},
], //
};
},
computed: {
// cmdidArr
iccidArrList() {
// 使 split
return this.formdata.iccid.split(/\r\n|\n|\r/).filter(Boolean);
},
},
methods: {
//
submitForm() {
console.log(this.formdata);
console.log(this.iccidArrList);
this.$refs.formLineInfo.validate((valid) => {
if (valid) {
console.log(this.formdata);
importiccidApi({
iccidList: this.iccidArrList,
type: this.formdata.netType,
})
.then((res) => {
console.log(res);
if (res.code == 200) {
this.isShow = false;
this.$message({
duration: 1500,
showClose: true,
message: "导入成功",
type: "success",
});
} else {
this.$message({
duration: 1500,
showClose: true,
message: res.msg,
type: "error",
});
}
})
.catch((err) => {});
} else {
console.log("error submit!!");
return false;
}
});
},
display() {
this.isShow = true;
},
hide() {
this.isShow = false;
},
},
};
</script>
<style lang="less">
.iccidDialog {
.el-select {
width: 100%;
}
}
</style>

@ -90,6 +90,9 @@
@click="imageSearch()"
>查询</el-button
>
<p class="looktime" v-if="lookTime && showLookTime">
{{ $moment(lookTime * 1000).format("YYYY-MM-DD HH:mm:ss") }}
</p>
<!-- <el-button
class="searchImage"
:loading="searchloading"
@ -717,7 +720,90 @@ export default {
id: 20,
name: "",
},
], //
], //
nxratiolist: [
{
id: 1,
name: "320X240",
},
{
id: 2,
name: "640X480",
},
{
id: 3,
name: "704X576",
},
{
id: 4,
name: "800X600 ",
},
{
id: 5,
name: "1024X768",
},
{
id: 6,
name: "1280X1024 ",
},
{
id: 7,
name: "1280X720",
},
{
id: 8,
name: "1920X1080",
},
{
id: 9,
name: "2560X1440",
},
{
id: 10,
name: "3840X2160",
},
{
id: 11,
name: "2560X1920 ",
},
{
id: 12,
name: "3264X2448",
},
{
id: 13,
name: "4224X3136",
},
{
id: 14,
name: "",
},
{
id: 15,
name: "",
},
{
id: 16,
name: "",
},
{
id: 17,
name: "",
},
{
id: 18,
name: "",
},
{
id: 19,
name: "",
},
{
id: 20,
name: "",
},
], //
//
selaccess: "", //
capturenr: {}, //
setForm: {}, //
@ -744,6 +830,8 @@ export default {
timer: null,
i: 0,
onlinestatus: "",
lookTime: "",
showLookTime: false,
};
},
mounted() {},
@ -751,6 +839,7 @@ export default {
handleClick(tab, event) {
console.log(tab, event);
this.capturenr = {};
this.lookTime = "";
},
//
getSingleAccess(val) {
@ -796,14 +885,21 @@ export default {
case 65284:
this.ratiolist = this.zhejiangratiolist;
break;
case 65290:
this.ratiolist = this.henanratiolist;
break;
//
case 65298:
this.ratiolist = this.nxratiolist;
break;
}
if (val.protocol == 65281) {
this.$set(this.setForm, "resolution", this.ratiolist[12].id);
this.$set(this.setForm, "resolution", this.ratiolist[5].id);
this.$set(this.setForm, "luminance", 50);
this.$set(this.setForm, "contrast", 50);
this.$set(this.setForm, "saturation", 50);
} else if (val.protocol == 65285) {
} else if (val.protocol == 65285 || val.protocol == 65290) {
this.$set(this.setForm, "resolution", this.ratiolist[7].id);
this.$set(this.setForm, "luminance", 50);
this.$set(this.setForm, "contrast", 50);
@ -826,10 +922,18 @@ export default {
name: "act",
value: "imgparams",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 0,
},
{
name: "rf",
value: 255,
},
{
name: "channel",
value: this.selaccess,
@ -875,10 +979,18 @@ export default {
name: "act",
value: "imgparams",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
},
{
name: "rf",
value: 255,
},
{
name: "channel",
value: this.setForm.channelId,
@ -922,6 +1034,8 @@ export default {
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
this.showLookTime = false;
// this.lookTime = res.data.date;
//this.getinfo1();
clearInterval(this.timer);
this.timer = window.setInterval(() => {
@ -950,6 +1064,9 @@ export default {
message: "信息已更新",
type: "success",
});
this.lookTime = res.data.requestTime;
this.showLookTime = true;
} else if (this.i > 9) {
window.clearInterval(this.timer);
this.timer = null;
@ -977,6 +1094,8 @@ export default {
this.setForm = {};
this.searchloading = false;
this.setloading = false;
this.lookTime = "";
this.showLookTime = false;
},
},
};
@ -1008,6 +1127,10 @@ export default {
.searchImage {
margin-left: 110px;
}
.looktime {
margin-top: 6px;
margin-left: 110px;
}
.flexno {
display: flex;
height: 32px;

@ -46,7 +46,7 @@
<el-option
v-for="item in picoptions"
:key="item.id"
:label="item.name"
:label="item.channelName"
:value="item.id"
>
</el-option>
@ -147,8 +147,9 @@ export default {
this.isShow = true;
this.pictureData = val; //
this.picoptions = val.list; //
console.log("asdasdadadad", this.picoptions);
this.channelId = val.list[0].id;
this.picvalue = val.list[0].name; //
this.picvalue = val.list[0].channelName; //
this.termId = val.id; //id
this.getcanvansPic(val, this.channelId);
},
@ -169,7 +170,8 @@ export default {
.then((res) => {
console.log(res);
this.markId = res.data.markId;
this.color = res.data.color !== null ? res.data.color : "#f00";
this.num = res.data.boderWidth !== null ? res.data.boderWidth : 2;
if (res.data.path !== null) {
this.picsrc = res.data.path;
if (res.data.list.length !== 0) {

@ -1,16 +1,32 @@
<template>
<el-dialog
class="runStatusDialog"
title="装置运行状态"
title="运行状态"
:visible.sync="isShow"
:close-on-click-modal="false"
width="1280px"
width="1360px"
>
<div class="zzinfo">
<span v-if="rowInfo.protocol == '65280'"> I1 </span>
<span v-if="rowInfo.protocol == '65296'"> 西 </span>
<span v-if="rowInfo.protocol == '65281'"> </span>
<span v-if="rowInfo.protocol == '65282'"> </span>
<span v-if="rowInfo.protocol == '65283'"> </span>
<span v-if="rowInfo.protocol == '65284'"> </span>
<span v-if="rowInfo.protocol == '65285'"> </span>
<span v-if="rowInfo.protocol == '65286'"> </span>
<span v-if="rowInfo.protocol == '65290'"> v2020 </span>
<span v-if="rowInfo.protocol == '65298'"> </span>
<span v-if="rowInfo.protocol == '2'"> </span>
<span>{{rowInfo.protocol}}</span>
</div>
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="开始日期">
<el-date-picker
@change="changestartdate"
v-model="formdata.starttime"
type="datetime"
:picker-options="pickerOptions"
placeholder="开始日期"
value-format="timestamp"
>
@ -18,9 +34,10 @@
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
@change="changeenddate"
v-model="formdata.endtime"
type="datetime"
default-time="23:59:59"
:picker-options="pickerOptions"
placeholder="结束日期"
value-format="timestamp"
class="ml10"
@ -29,7 +46,7 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary">导出</el-button>
<el-button type="primary" @click="exportFault"></el-button>
</el-form-item>
</el-form>
<el-table
@ -38,6 +55,7 @@
stripe
tooltip-effect="dark"
style="width: 100%"
height="442px"
v-loading="loading"
>
<template slot="empty">
@ -49,45 +67,36 @@
</template>
</el-table-column>
<el-table-column
prop="name"
label="采集时间"
min-width="120"
prop="cmdid"
label="装置编号"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="设备名称"
min-width="80"
show-overflow-tooltip
></el-table-column>
prop="rsUpdateTimeStr"
label="装置上次启动时间"
min-width="140"
>
</el-table-column>
<el-table-column
prop="name"
label="设备编号"
min-width="120"
prop="signalStrength2g"
label="2G信号强度"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
prop="signalStrength4g"
label="4G信号强度"
min-width="80"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="2G信号强度"
min-width="80"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="剩余运行内存"
min-width="80"
prop="remainingRam"
label="剩余运行内存M"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="剩余存储内存"
min-width="100"
prop="remainingRom"
label="剩余存储内存M"
show-overflow-tooltip
></el-table-column>
</el-table>
@ -104,36 +113,97 @@
</el-pagination>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button @click="hide"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getLineListJoggle } from "@/utils/api/index";
import {
getTermRunningHistoryApi,
getTermRunningHistoryExcel,
} from "@/utils/api/index";
export default {
data() {
return {
isShow: false,
formdata: {},
listData: [
{
name: "测试",
},
{
name: "测试2",
},
],
rowInfo: "",
listData: [],
loading: false,
seltermid: "", //id
selcmdId: "", //cmdId
requestId: "",
page: 1, //
pageSize: 20, //
pageSize: 10, //
total: 0, //
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
};
},
watch: {
endtime(newVal) {
if (newVal) {
const date = new Date(newVal);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
this.formdata.endtime = date;
}
},
},
created() {},
mounted() {},
methods: {
getTime() {
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setHours(0); // 23
thirtyDaysAgo.setMinutes(0); // 59
thirtyDaysAgo.setSeconds(0); // 59
console.log(
new Date(thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30))
);
const startTimeNew = new Date(
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate())
).getTime();
this.$set(this.formdata, "starttime", startTimeNew);
console.log("开始时间", this.formdata.starttime);
const currentDate = new Date(); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.$set(this.formdata, "endtime", currentDate.getTime());
console.log("结束时间", this.formdata.endtime);
this.getfaultinfo();
},
changestartdate(val) {
console.log(val);
if (val == null) {
console.log(new Date());
const startDate = new Date();
startDate.setHours(0); // 23
startDate.setMinutes(0); // 59
startDate.setSeconds(0); // 59
this.formdata.starttime = startDate;
console.log(this.formdata.starttime);
} else {
this.formdata.starttime = val;
}
},
//
changeenddate(val) {
if (val == null) {
console.log(new Date());
const endDate = new Date();
endDate.setHours(23); // 23
endDate.setMinutes(59); // 59
endDate.setSeconds(59); // 59
this.formdata.endtime = endDate;
console.log(this.formdata.endtime);
} else {
this.formdata.endtime = val;
console.log(val);
}
},
//
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
@ -144,44 +214,60 @@ export default {
type: "warning",
});
}
this.getlistnr();
this.getfaultinfo();
},
//
exportFault() {
window.location.href =
"/api/getTermRunningHistoryExcel?termid=" + this.rowInfo.id;
},
//
getlistnr(val) {
console.log(val);
this.seltermid = val.id;
this.selcmdId = val.cmdid;
getfaultinfo() {
this.loading = true;
getLineListJoggle({
getTermRunningHistoryApi({
termid: this.rowInfo.id,
// starttime: this.formdata.starttime,
// endtime: this.formdata.endtime,
pageindex: this.page,
pagesize: this.pageSize,
}).then((res) => {
this.listData = res.data.list;
this.total = res.data.total;
this.$nextTick(() => {
this.loading = false;
});
});
},
//
handleCurrentChange(val) {
this.page = val;
this.getlistnr();
this.getfaultinfo();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getlistnr();
this.getfaultinfo();
},
display() {
display(row) {
console.log(row);
this.rowInfo = row;
this.isShow = true;
this.getTime();
},
hide() {
this.isShow = false;
this.formdata = {};
},
},
};
</script>
<style lang="less">
.runStatusDialog {
.zzinfo {
position: absolute;
top: 22px;
left: 126px;
}
.pageNation {
justify-content: flex-start;
margin-top: 16px;

@ -13,6 +13,20 @@
:rules="rules"
:model="formdata"
>
<el-form-item label="电压等级:" prop="dyId">
<el-select
v-model="formdata.dyId"
placeholder="请选择"
@change="getSearchxl"
>
<el-option
v-for="item in dyOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="线路名称:" prop="lineId">
<el-select v-model="formdata.lineId" placeholder="请选择">
<el-option
@ -44,15 +58,17 @@
</el-dialog>
</template>
<script>
import { getLineListApi, addTowerApi, updateTowerApi } from "@/utils/api/index";
import { updateTowerApi, getSearchInfo } from "@/utils/api/index";
export default {
data() {
return {
isShow: false,
lineOptions: [],
dyOptions: [],
formdata: {},
rules: {
dyId: [{ required: true, message: "请选择电压", trigger: "blur" }],
towerName: [
{ required: true, message: "请输入杆塔名称", trigger: "blur" },
],
@ -66,17 +82,26 @@ export default {
},
};
},
mounted() {
this.getLineListdata();
},
mounted() {},
methods: {
getLineListdata() {
getLineListApi({ pageindex: 1, pagesize: 100 })
//
getSearchdy() {
getSearchInfo({ type: 1 })
.then((res) => {
this.dyOptions = res.data.list;
this.getSearchxl();
})
.catch((err) => {});
},
//线
getSearchxl() {
getSearchInfo({ type: 2, id: this.formdata.dyId })
.then((res) => {
this.lineOptions = res.data.list;
})
.catch((err) => {});
},
//
getdataform(val) {
//this.formdata = val;
@ -123,6 +148,7 @@ export default {
},
display() {
this.isShow = true;
this.getSearchdy();
},
hide() {
this.isShow = false;

@ -81,6 +81,9 @@
@click="videoSearch()"
>查询</el-button
>
<p class="looktime" v-if="lookTime && showLookTime">
{{ $moment(lookTime * 1000).format("YYYY-MM-DD HH:mm:ss") }}
</p>
</div>
</el-tab-pane>
<el-tab-pane label="设置参数" name="2">
@ -203,6 +206,32 @@ export default {
name: "VGA",
},
], //
zzratiolist: [
{
id: 1,
name: "QVGA",
},
{
id: 2,
name: "VGA",
},
{
id: 3,
name: "480p;",
},
{
id: 4,
name: "720P",
},
{
id: 5,
name: "1080P",
},
{
id: 6,
name: "其它",
},
], //
selaccess: "", //
capturenr: {}, //
setForm: {
@ -224,6 +253,8 @@ export default {
selcmdId: "", //cmdId
requestId: "",
onlinestatus: "",
lookTime: "",
showLookTime: false,
};
},
mounted() {},
@ -231,6 +262,7 @@ export default {
handleClick(tab, event) {
console.log(tab, event);
this.capturenr = {};
this.lookTime = "";
},
//
getSingleAccess(val) {
@ -253,7 +285,8 @@ export default {
getRatio() {
getResolutionRatio({ type: 1 })
.then((res) => {
this.ratiolist = this.hnratiolist;
//this.ratiolist = this.hnratiolist;
this.ratiolist = this.zzratiolist;
this.$set(this.setForm, "videoFormat", this.ratiolist[0].id);
})
.catch((err) => {});
@ -269,6 +302,10 @@ export default {
name: "act",
value: "videoparams",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 0,
@ -309,6 +346,10 @@ export default {
name: "act",
value: "videoparams",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
@ -348,6 +389,7 @@ export default {
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
this.showLookTime = false;
//this.getinfo1();
clearInterval(this.timer);
@ -381,6 +423,8 @@ export default {
message: "信息已更新",
type: "success",
});
this.lookTime = res.data.requestTime;
this.showLookTime = true;
} else if (this.i > 9) {
window.clearInterval(this.timer);
this.timer = null;
@ -409,6 +453,8 @@ export default {
this.setForm = {};
this.searchloading = false;
this.setloading = false;
this.lookTime = "";
this.showLookTime = false;
},
},
};
@ -440,6 +486,10 @@ export default {
.searchImage {
margin-left: 110px;
}
.looktime {
margin-top: 6px;
margin-left: 110px;
}
.flexno {
display: flex;
height: 32px;

@ -1,16 +1,32 @@
<template>
<el-dialog
class="workStatus"
title="工作状态"
class="workStatusBox"
title="工作状态"
:visible.sync="isShow"
:close-on-click-modal="false"
width="1280px"
width="1360px"
>
<div class="zzinfo">
<span v-if="rowInfo.protocol == '65280'"> I1 </span>
<span v-if="rowInfo.protocol == '65296'"> 西 </span>
<span v-if="rowInfo.protocol == '65281'"> </span>
<span v-if="rowInfo.protocol == '65282'"> </span>
<span v-if="rowInfo.protocol == '65283'"> </span>
<span v-if="rowInfo.protocol == '65284'"> </span>
<span v-if="rowInfo.protocol == '65285'"> </span>
<span v-if="rowInfo.protocol == '65286'"> </span>
<span v-if="rowInfo.protocol == '65290'"> v2020 </span>
<span v-if="rowInfo.protocol == '65298'"> </span>
<span v-if="rowInfo.protocol == '2'"> </span>
<span>{{ rowInfo.protocol }}</span>
</div>
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="开始日期">
<el-date-picker
@change="changestartdate"
v-model="formdata.starttime"
type="datetime"
:picker-options="pickerOptions"
placeholder="开始日期"
value-format="timestamp"
>
@ -18,9 +34,10 @@
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
@change="changeenddate"
v-model="formdata.endtime"
type="datetime"
default-time="23:59:59"
:picker-options="pickerOptions"
placeholder="结束日期"
value-format="timestamp"
class="ml10"
@ -29,7 +46,7 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary">导出</el-button>
<el-button type="primary" @click="exportFault"></el-button>
</el-form-item>
</el-form>
<el-table
@ -38,6 +55,7 @@
stripe
tooltip-effect="dark"
style="width: 100%"
height="466px"
v-loading="loading"
>
<template slot="empty">
@ -49,73 +67,93 @@
</template>
</el-table-column>
<el-table-column
prop="name"
label="采集时间"
min-width="120"
prop="cmdid"
label="装置编号"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column prop="wsUpdateTimeStr" label="采集时间" min-width="140">
</el-table-column>
<el-table-column
prop="name"
label="设备名称"
min-width="80"
prop="batteryVoltage"
label="电池电压(V)"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="设备编号"
min-width="120"
prop="opTemperature"
label="工作温度(℃)"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="电源电压"
min-width="80"
prop="batteryCapacity"
label="电池电量(%"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="工作温度"
min-width="80"
prop="floatingChargeStr"
label="浮充状态"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="电池电量"
min-width="80"
prop="totalWorkingTime"
label="工作总时间(小时)"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="浮充状态"
min-width="100"
prop="workingTime"
label="连续工作时间(小时)"
show-overflow-tooltip
>
<template slot-scope="scope">{{
scope.row.name == 0 ? "充电" : "放电"
}}</template>
</el-table-column>
></el-table-column>
<el-table-column
prop="name"
label="工作总时间"
min-width="120"
prop="connectionStr"
label="网络连接状态"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="连续工作时间"
min-width="100"
prop="gprsStr"
label="GPRS信号强度"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="name"
label="网络连接状态"
min-width="100"
prop="recvFlowStr"
label="当月接收流量M"
show-overflow-tooltip
>
<template slot-scope="scope">{{
scope.row.name == 0 ? "已连接" : "未连接"
}}</template>
<template slot-scope="scope">
<span>{{ (scope.row.recvFlowStr / 1024).toFixed(2) }}</span>
</template>
</el-table-column>
<el-table-column
prop="sendFlowStr"
label="当月发送流量(M)"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ (scope.row.sendFlowStr / 1024).toFixed(2) }}</span>
</template></el-table-column
>
<!-- <el-table-column
prop="recvFlowStr"
label="当月发送流量(M)"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="sendFlowStr"
label="当月接收流量M"
show-overflow-tooltip
></el-table-column> -->
<el-table-column
prop="protocolVersion"
label="通信协议版本"
show-overflow-tooltip
></el-table-column>
<!-- <el-table-column
prop="protocolVersion"
label="GPRS信号强度"
show-overflow-tooltip
></el-table-column> -->
</el-table>
<div class="pageNation">
<el-pagination
@ -130,36 +168,97 @@
</el-pagination>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button @click="hide"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getLineListJoggle } from "@/utils/api/index";
import {
getWorkingStatusHistoryApi,
getWorkingStatusHistoryExcel,
} from "@/utils/api/index";
export default {
data() {
return {
isShow: false,
formdata: {},
listData: [
{
name: "测试",
},
{
name: "测试2",
},
],
rowInfo: "",
listData: [],
loading: false,
seltermid: "", //id
selcmdId: "", //cmdId
requestId: "",
page: 1, //
pageSize: 20, //
pageSize: 10, //
total: 0, //
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
};
},
watch: {
endtime(newVal) {
if (newVal) {
const date = new Date(newVal);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
this.formdata.endtime = date;
}
},
},
created() {},
mounted() {},
methods: {
getTime() {
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setHours(0); // 23
thirtyDaysAgo.setMinutes(0); // 59
thirtyDaysAgo.setSeconds(0); // 59
console.log(
new Date(thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30))
);
const startTimeNew = new Date(
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate())
).getTime();
this.$set(this.formdata, "starttime", startTimeNew);
console.log("开始时间", this.formdata.starttime);
const currentDate = new Date(); //
currentDate.setHours(23); // 23
currentDate.setMinutes(59); // 59
currentDate.setSeconds(59); // 59
this.$set(this.formdata, "endtime", currentDate.getTime());
console.log("结束时间", this.formdata.endtime);
this.getfaultinfo();
},
changestartdate(val) {
console.log(val);
if (val == null) {
console.log(new Date());
const startDate = new Date();
startDate.setHours(0); // 23
startDate.setMinutes(0); // 59
startDate.setSeconds(0); // 59
this.formdata.starttime = startDate;
console.log(this.formdata.starttime);
} else {
this.formdata.starttime = val;
}
},
//
changeenddate(val) {
if (val == null) {
console.log(new Date());
const endDate = new Date();
endDate.setHours(23); // 23
endDate.setMinutes(59); // 59
endDate.setSeconds(59); // 59
this.formdata.endtime = endDate;
console.log(this.formdata.endtime);
} else {
this.formdata.endtime = val;
console.log(val);
}
},
//
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
@ -170,45 +269,66 @@ export default {
type: "warning",
});
}
this.getlistnr();
this.getfaultinfo();
},
//
exportFault() {
window.location.href =
"/api/getWorkingStatusHistoryExcel?termid=" + this.rowInfo.id;
},
//
getlistnr(val) {
console.log(val);
this.seltermid = val.id;
this.selcmdId = val.cmdid;
getfaultinfo() {
this.loading = true;
getLineListJoggle({
getWorkingStatusHistoryApi({
termid: this.rowInfo.id,
starttime: this.formdata.starttime,
endtime: this.formdata.endtime,
pageindex: this.page,
pagesize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
this.listData = res.data.list;
this.total = res.data.total;
this.$nextTick(() => {
this.loading = false;
});
} else {
this.$nextTick(() => {
this.loading = false;
});
}
});
},
//
handleCurrentChange(val) {
this.page = val;
this.getlistnr();
this.getfaultinfo();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getlistnr();
this.getfaultinfo();
},
display() {
display(row) {
console.log(row);
this.rowInfo = row;
this.isShow = true;
this.getTime();
},
hide() {
this.isShow = false;
this.formdata = {};
},
},
};
</script>
<<<<<<< HEAD
<style lang="less">
.workStatus {
.workStatusBox {
.zzinfo {
position: absolute;
top: 22px;
left: 126px;
}
.pageNation {
justify-content: flex-start;
margin-top: 16px;
@ -221,6 +341,3 @@ export default {
}
}
</style>
=======
<style lang="less" scoped></style>
>>>>>>> hn1.0

@ -16,6 +16,13 @@
@click="handleExport()"
>导出</el-button
>
<el-button
class="iccidbtn"
type="primary"
icon="el-icon-document"
@click="handleICCID()"
>导入ICCID</el-button
>
</div>
</div>
<div class="searchBox">
@ -64,6 +71,16 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="规约" class="isonLineClass">
<el-select v-model="formdata.protocol" filterable>
<el-option
v-for="item in protocolOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input
v-model="formdata.search"
@ -91,6 +108,11 @@
highlight-current-row
:row-key="getRowKeys"
>
<el-table-column label="序号">
<template slot-scope="scope">
<span>{{ (page - 1) * pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column prop="dyName" label="电压等级" show-overflow-tooltip>
</el-table-column>
@ -121,6 +143,7 @@
}}</el-link>
</template>
</el-table-column>
<el-table-column
prop="equipName"
label="设备名称"
@ -129,13 +152,26 @@
>
</el-table-column>
<el-table-column
prop="cmdId"
prop="cmdid"
label="设备编号"
show-overflow-tooltip
min-width="150"
>
</el-table-column>
<el-table-column
prop="devType"
label="设备类型"
show-overflow-tooltip
min-width="150"
>
<template slot-scope="scope">
<span v-if="scope.row.devType == 1"></span>
<span v-if="scope.row.devType == 2"></span>
<span v-if="scope.row.devType == 3"></span>
<span v-if="scope.row.devType == 23"></span>
<span v-if="scope.row.devType == 123"></span>
</template>
</el-table-column>
<el-table-column
prop="protocolName"
label="规约名称"
@ -143,13 +179,36 @@
min-width="90"
/>
<el-table-column
prop="isonline"
prop="onlinestatus"
label="是否在线"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ scope.row.isonline ? "在线" : "离线" }}</template
<!-- {{ scope.row.onlinestatus ? "在线" : "离线" }} -->
<span style="color: #169e8c" v-if="scope.row.onlinestatus == 1"
>在线</span
>
<span
style="color: #f56c6c"
v-else-if="scope.row.onlinestatus == 0"
>离线</span
>
<!-- <span style="color: #e6a23c" v-else></span> -->
</template>
</el-table-column>
<el-table-column
prop="isfavor"
label="监测离线"
show-overflow-tooltip
>
<template slot-scope="scope">
<span style="color: #169e8c" v-if="scope.row.isfavor == 1"
></span
>
<span style="color: #f56c6c" v-else-if="scope.row.isfavor == 0"
></span
>
</template>
</el-table-column>
<el-table-column
prop="hasPan"
@ -161,20 +220,21 @@
>
</el-table-column>
<el-table-column prop="sim" label="SIM卡号" show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="netType"
label="网络类型"
show-overflow-tooltip
>
<template slot-scope="scope">
<span v-if="scope.row.netType == 1"> </span>
<span v-if="scope.row.netType == 2"> </span>
<span v-if="scope.row.netType == 3"> </span>
<span v-if="scope.row.netType == 1"> </span>
<span v-if="scope.row.netType == 2"> </span>
<span v-if="scope.row.netType == -1"> </span>
</template>
</el-table-column>
<!-- <el-table-column prop="iccid" label="iccid" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="sim" label="SIM卡号" show-overflow-tooltip>
</el-table-column> -->
<el-table-column prop="model" label="装置型号" show-overflow-tooltip>
</el-table-column>
<el-table-column
@ -196,12 +256,7 @@
}}</template
>
</el-table-column>
<el-table-column
prop="status"
label="装置状态"
show-overflow-tooltip
v-if="roleUser != 2"
>
<el-table-column prop="status" label="装置状态" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.status == 1 ? "运行中" : "已删除" }}
</template>
@ -209,8 +264,8 @@
<el-table-column
fixed="right"
label="操作"
width="340"
v-if="roleUser != 2"
width="380"
v-if="roleUser == 0"
>
<template slot-scope="scope">
<el-dropdown
@ -234,8 +289,12 @@
>运行状态</el-dropdown-item
>
<el-dropdown-item command="GPS">GPS位置</el-dropdown-item>
<el-dropdown-item command="faultInfo"
>故障信息报</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
<el-button
@click.native.stop="handleParameterSet(scope.row)"
type="text"
@ -247,23 +306,20 @@
>修改</el-button
>
<el-button
@click.native.stop="handlexgiccid(scope.row)"
type="text"
@click.native.stop="handlepicture(scope.row)"
>图片标记</el-button
>修改ICCID</el-button
>
<el-button
type="text"
class="deleteText"
@click.native.stop="handleDelete(scope.row)"
v-if="scope.row.status == 1"
>关闭</el-button
@click.native.stop="handlepicture(scope.row)"
>图片标记</el-button
>
<el-button
type="text"
class="deleteText"
@click.native.stop="handleDelete(scope.row)"
v-if="scope.row.status == 0"
>打开</el-button
>删除</el-button
>
</template>
</el-table-column>
@ -275,10 +331,17 @@
>修改</el-button
>
<el-button
v-if="notes !== '覆冰用户使用'"
type="text"
@click.native.stop="handlepicture(scope.row)"
>图片标记</el-button
>
<el-button
v-if="notes == '覆冰用户使用'"
@click.native.stop="handleParameterSet(scope.row)"
type="text"
>参数配置</el-button
>
<el-button
type="text"
class="deleteText"
@ -314,9 +377,14 @@
<workStatus ref="workStatus_ref"></workStatus>
<runStatus ref="runStatus_ref"></runStatus>
<gpsSite ref="gpsSite_ref"></gpsSite>
<faultInfomation ref="fultInfo_ref"></faultInfomation>
<!-- 新增线路 -->
<add-lineDialog ref="addlineDialogref"></add-lineDialog>
<towerDialog ref="towerDialogref"></towerDialog>
<!-- 导入iccid -->
<iccidDialog ref="iccidref"></iccidDialog>
<!-- 修改iccid -->
<iccidChangeDialog ref="xgiccidref"></iccidChangeDialog>
</div>
</template>
<script>
@ -325,6 +393,7 @@ import {
deleteTerminalJoggle,
getSearchInfo,
getTerminalListExcel,
getProtocolList,
} from "@/utils/api/index";
import moment from "moment";
import addPhotoDialog from "./components/addPhotoDialog.vue";
@ -336,9 +405,13 @@ import baseInfor from "./components/baseInfor.vue";
import workStatus from "./components/workStatus.vue";
import runStatus from "./components/runStatus.vue";
import gpsSite from "./components/gpsSite.vue";
import faultInfomation from "./components/faultInfomation.vue";
import addLineDialog from "./components/addLineDialog.vue";
import towerDialog from "./components/towerDialog.vue";
import iccidDialog from "./components/iccidDialog.vue";
import iccidChangeDialog from "./components/iccidChangeDialog.vue";
export default {
name: "photographicDevice",
components: {
addPhotoDialog,
pictureTags,
@ -350,6 +423,9 @@ export default {
gpsSite,
addLineDialog,
towerDialog,
faultInfomation,
iccidDialog,
iccidChangeDialog,
},
data() {
return {
@ -361,12 +437,14 @@ export default {
{ id: 1, name: "在线" },
{ id: 0, name: "离线" },
],
protocolOptions: [{ id: -1, name: "全部" }], //
formdata: {
dyId: -1,
lineId: -1,
towerId: -1,
search: "",
isonline: -1,
protocol: -1,
},
roleUser: "",
terminalTableData: [], //
@ -391,6 +469,7 @@ export default {
},
],
gpsvalue: "1",
notes: localStorage.getItem("notes"),
};
},
created() {
@ -409,6 +488,7 @@ export default {
},
mounted() {
this.getSearchdy();
this.getProtocol();
this.terminalList();
},
methods: {
@ -463,7 +543,17 @@ export default {
})
.catch((err) => {});
},
getProtocol() {
//
getProtocolList()
.then((res) => {
console.log(res);
this.protocolOptions = [{ id: -1, name: "全部" }];
this.protocolOptions = this.protocolOptions.concat(res.data.list);
this.formdata.protocol = this.protocolOptions[0].id;
})
.catch((err) => {});
},
//
onSubmit() {
this.page = 1;
@ -472,7 +562,12 @@ export default {
//
onReset() {
this.formdata = {
dyId: -1,
lineId: -1,
towerId: -1,
search: "",
isonline: -1,
protocol: -1,
};
this.getSearchdy();
@ -489,9 +584,11 @@ export default {
getTerminalJoggle(this.formdata)
.then((res) => {
console.log(res);
if (res.code == 200) {
this.loading = false;
this.terminalTableData = res.data.list;
this.total = res.data.total;
this.loading = false;
}
})
.catch((err) => {
console.log(err); //
@ -549,16 +646,19 @@ export default {
console.log(command, row);
switch (command) {
case "info":
this.$refs.baseInfor_ref.display();
this.$refs.baseInfor_ref.display(row);
break;
case "workStatus":
this.$refs.workStatus_ref.display();
this.$refs.workStatus_ref.display(row);
break;
case "runStatus":
this.$refs.runStatus_ref.display();
this.$refs.runStatus_ref.display(row);
break;
case "GPS":
this.$refs.gpsSite_ref.display();
this.$refs.gpsSite_ref.display(row);
break;
case "faultInfo":
this.$refs.fultInfo_ref.display(row);
break;
default:
break;
@ -584,11 +684,9 @@ export default {
//
handleDelete(data) {
console.log(data);
this.deleteArr.push({
termid: data.id,
});
this.deleteArr.push(data.id);
console.log(this.deleteArr);
this.$confirm("确定要关闭该装置?", "提示", {
this.$confirm("确定要删除该装置?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
@ -597,12 +695,13 @@ export default {
//
deleteTerminalJoggle({ list: this.deleteArr }).then((res) => {
console.log(res);
this.deleteArr = [];
this.terminalList(); //
});
this.$message({
duration: 1500,
type: "success",
message: "关闭成功!",
message: "删除成功!",
showClose: true,
});
})
@ -615,6 +714,43 @@ export default {
// });
});
},
// //
// handleOpen(data) {
// console.log(data);
// this.deleteArr.push({
// termid: data.id,
// });
// console.log(this.deleteArr);
// this.$confirm("?", "", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "success",
// })
// .then(() => {
// //
// deleteTerminalJoggle({ list: this.deleteArr, type: 1 }).then(
// (res) => {
// console.log(res);
// this.deleteArr = [];
// this.terminalList(); //
// }
// );
// this.$message({
// duration: 1500,
// type: "success",
// message: "!",
// showClose: true,
// });
// })
// .catch(() => {
// // this.$message({
// // duration: 1500,
// // type: "info",
// // message: "",
// // showClose: true,
// // });
// });
// },
//
handleCurrentChange(val) {
this.page = val;
@ -625,6 +761,14 @@ export default {
this.pageSize = val;
this.terminalList();
},
//ICCID
handleICCID() {
this.$refs.iccidref.display();
},
//iccic
handlexgiccid(val) {
this.$refs.xgiccidref.display(val);
},
},
};
</script>
@ -666,6 +810,9 @@ export default {
display: flex;
justify-content: space-between;
align-items: center;
.iccidbtn {
width: auto;
}
}
.searchBox {
margin-top: 8px;

@ -22,7 +22,7 @@
<el-button type="primary" @click="setbtn"></el-button>
</div>
</div>
<div class="imageCenter" v-loading="loading" v-cloak>
<div class="imageCenter" v-loading="loading">
<el-row
v-for="i in rowNum"
:key="'row-' + i"
@ -31,7 +31,7 @@
<el-col
:span="24 / colNum"
v-for="(item, index) in picList"
v-if="index < colNum * i && index >= colNum * (i - 1)"
v-show="index < colNum * i && index >= colNum * (i - 1)"
:key="'col-' + index"
>
<div class="imgList" @click="handleShowHistory(item)">
@ -39,7 +39,7 @@
v-if="item.path !== null && item.path.indexOf('videos') == -1"
class="bigpic"
>
<img :src="item.path + '!1366x768'" @error="setDefaultImage" />
<img :src="item.path" @error="setDefaultImage" />
</div>
<div
class="bigpic"
@ -93,15 +93,18 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="画面布局" class="layoutBox">
<!-- <el-select v-model="selLayout" placeholder="s请选择">
<el-form-item label="选择通道">
<el-select v-model="channelVal" placeholder="请选择">
<el-option
v-for="item in layoutOptions"
v-for="item in channelOption"
:key="item.value"
:label="item.label"
:label="item.name"
:value="item.value"
></el-option>
</el-select> -->
</el-select>
</el-form-item>
<el-form-item label="画面布局" class="layoutBox">
<div class="selectGroup">
<div class="rowbox">
<el-radio-group v-model="rowradio" class="radio1">
@ -134,27 +137,6 @@
</div>
</el-dialog>
<morePicPreveiw ref="morePicPreveiw_ref"></morePicPreveiw>
<!-- <el-dialog
title="历史图片"
:visible.sync="historyPicdialog"
width="1366px"
:close-on-click-modal="false"
class="showDialogHistoryPic"
>
<div class="title">
{{ picInfoData.linename }}-{{ picInfoData.towername }}-{{
picInfoData.alias !== null && picInfoData.alias !== ""
? picInfoData.alias
: picInfoData.channnelname
}} {{ $moment(picInfoData.photoTime).format("YYYY-MM-DD ") }}
</div>
<carouselChart
ref="carouselpic"
:terminalPhoto="terminalPhoto"
v-if="terminalPhoto.length > 0"
v-loading="historyPicLoading"
></carouselChart>
</el-dialog> -->
</div>
</template>
<script>
@ -163,6 +145,7 @@ import { getPictureList, getTerminalPhotoListJoggle } from "@/utils/api/index";
import morePicPreveiw from "../realTimeMonitor/components/morePicPreveiw";
import defaultImage from "../../assets/img/nodatapic2.jpg";
export default {
name: "pictureRotation",
components: {
morePicPreveiw,
},
@ -222,6 +205,12 @@ export default {
rowradio: "4",
colradio: "4",
selLayout: 1,
channelVal: -1, //
channelOption: [
{ name: "全部", value: -1 },
{ name: "通道一", value: 1 },
{ name: "通道二", value: 2 },
],
options: [
{
value: "选项1",
@ -241,6 +230,7 @@ export default {
nopicPath: require("@/assets/img/nopic.jpg"),
};
},
methods: {
setDefaultImage(e) {
e.target.src = defaultImage;
@ -304,17 +294,25 @@ export default {
this.colradio = parseInt(localStorage.getItem("col"))
? parseInt(localStorage.getItem("col"))
: 4;
this.channelVal = parseInt(localStorage.getItem("channelNum"))
? parseInt(localStorage.getItem("channelNum"))
: -1;
},
submitForm() {
localStorage.setItem("totalTime", this.selSpeed);
localStorage.setItem("row", this.rowradio);
localStorage.setItem("col", this.colradio);
localStorage.setItem("channelNum", this.channelVal);
this.rowNum = parseInt(localStorage.getItem("row"))
? parseInt(localStorage.getItem("row"))
: 4;
this.colNum = parseInt(localStorage.getItem("col"))
? parseInt(localStorage.getItem("col"))
: 4;
this.channelVal = parseInt(localStorage.getItem("channelNum"))
? parseInt(localStorage.getItem("channelNum"))
: -1;
this.page = 1;
this.pageSize = this.rowradio * this.colradio;
this.setdialog = false;
this.$message.success("设置成功");
@ -329,12 +327,17 @@ export default {
},
//
getPicData() {
this.loading = true;
this.picList = [];
getPictureList({
//this.loading = true;
console.log(this.picList);
//this.picList = [];
const params = {
pageindex: this.page,
pagesize: this.rowNum * this.colNum,
})
};
if (this.channelVal !== -1) {
params.channelid = this.channelVal;
}
getPictureList(params)
.then((res) => {
this.picList = res.data.list;
this.totalPage = res.data.totalpage;
@ -401,6 +404,11 @@ export default {
? parseInt(localStorage.getItem("col"))
: 4;
this.pageSize = this.rowradio * this.colradio;
this.channelVal = parseInt(localStorage.getItem("channelNum"))
? parseInt(localStorage.getItem("channelNum"))
: -1;
console.log("我是第一次进来", this.channelVal);
//this.toggleCountdown();
this.getPicData();
},

@ -0,0 +1,315 @@
<template>
<div class="activerealsideBar">
<div class="searchBar">
<el-input
placeholder="输入关键字进行过滤"
v-model="filterText"
prefix-icon="el-icon-search"
clearable
>
</el-input>
</div>
<!-- <div class="deviceNum">
<el-statistic title="装置在线 / 总数">
<template slot="formatter">
<span>{{ onlineNum ? onlineNum : 0 }}</span> /
<span>{{ totalNum ? totalNum : 0 }}</span
>
</template>
</el-statistic>
</div> -->
<!-- <div class="radioFilter">
<el-radio-group v-model="zzradio" @input="getRadio">
<el-radio :label="-1">全部</el-radio>
<el-radio :label="1">在线</el-radio>
<el-radio :label="0">离线</el-radio>
</el-radio-group>
<el-button
class="refresh"
@click="getLineTreeStatus"
type="text"
icon="el-icon-refresh-right"
>刷新</el-button
>
</div> -->
<el-tree
ref="tree"
:data="lineTreeData"
:props="defaultProps"
node-key="compositeKey"
:default-expanded-keys="defaultExpandIds"
highlight-current
:expand-on-click-node="true"
:filter-node-method="filterNode"
:current-node-key="currentNodekey"
@node-click="handleNodeClick"
accordion
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span
:title="
node.label + '(' + data.termCount + '/' + data.onlineNum + ')'
"
>
<span
v-if="data.title"
class="iconfont icon-dianlihangye"
style="margin-right: 6px"
>
</span>
<span v-if="!data.title && data.cmdid">
<span
class="iconfont icon-shexiangtoulixian"
v-if="data.onlinestatus == 0"
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
style="margin-right: 6px"
></span>
<span
class="iconfont icon-shexiangtou-lixian"
v-else
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
style="margin-right: 6px"
></span>
</span>
<span :class="data.onlinestatus == 0 ? 'disconnect' : ''"
>{{ node.label }}
<span class="num" v-if="data.title"
>({{ data.termCount }} / {{ data.onlineNum }})
</span>
</span>
</span>
<!-- <span>
{{ node.label }}
</span> -->
</span>
</el-tree>
</div>
</template>
<script>
import EventBus from "@/utils/event-bus";
import { getActivityApi } from "@/utils/api/reportApi";
export default {
data() {
return {
filterText: "", //
lineTreeData: [],
defaultExpandIds: [], //
defaultProps: {
//
children: "terms",
label: "name",
key: "compositeKey", // 使 uniqueKey
},
currentData: {}, //
currentNodekey: "", //,
};
},
components: {},
watch: {
filterText(newVal) {
this.handleFilter(); // filterText
},
},
mounted() {},
created() {
this.getactiveList(); //
},
methods: {
transformData(data) {
return data.map((item) => ({
...item, //
name: item.title, // title name
onlineNum: item.terms.reduce((count, term) => {
// term.online 1
return count + (term.onlinestatus === 1 ? 1 : 0);
}, 0),
}));
},
getactiveList() {
getActivityApi()
.then((res) => {
console.log(res);
console.log(res.data);
const dataValue = this.transformData(res.data);
this.lineTreeData = this.processData(dataValue);
console.log(this.lineTreeData);
this.currentData = JSON.parse(localStorage.getItem("currentData"));
this.defaultExpandIds = [this.lineTreeData[0].terms[0].compositeKey];
this.currentNodekey = this.lineTreeData[0].terms[0].compositeKey;
console.log("我是选中的id", this.currentNodekey);
this.currentNodeData = this.lineTreeData[0].terms[0];
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.currentNodekey); //
this.handleNodeClick(this.currentNodeData);
});
})
.catch((err) => {});
},
processData(data, level = 0) {
return data.map((node) => {
const compositeKey = `${level}-${node.id}`; //
node.compositeKey = compositeKey; //
if (node.terms) {
node.terms = this.processData(node.terms, level + 1); //
}
return node;
});
},
handleFilter() {
// 500
setTimeout(() => {
this.$refs.tree.filter(this.filterText);
}, 500);
},
//
filterNode(value, data, node) {
//
if (!value) return true;
this.searchName = data.name + data.cmdid;
//console.log(this.searchName);
// valuedatalabel
if (this.searchName.indexOf(value) !== -1) {
return true;
}
let nowval = data[this.defaultProps.label].toUpperCase();
return nowval.indexOf(value.toUpperCase()) !== -1;
},
//treenode
handleNodeClick(data, node) {
console.log(data, node);
console.log(this.currentNodeKey);
if (data.hasOwnProperty("terms")) {
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.currentNodeKey);
});
return;
}
// if (data.name == "") {
// return;
// }
// if (data.isfavor == 0 || data.isfavor == null) {
// this.collectFlag = false;
// } else {
// this.collectFlag = true;
// }
this.currentNodeKey = data.compositeKey;
this.currentData = data;
//this.scrollView();
this.$store.commit("currentData", this.currentData); //currentDatavuex
this.$store.commit("termId", this.currentData.id); //currentDatavuex
this.$store.commit("protocol", this.currentData.protocol); //currentDatavuex
this.$store.commit("cmdId", this.currentData.cmdid); //currentDatavuex
this.$parent.getCurrentData();
},
},
beforeRouteLeave(to, from, next) {},
deactivated() {},
beforeDestroy() {},
};
</script>
<style lang="less">
.activerealsideBar {
width: 312px;
display: flex;
flex-direction: column;
padding: 16px 0px;
height: calc(100% - 70px);
.searchBar {
width: 94%;
margin: 0 auto;
margin-bottom: 8px;
}
.deviceNum {
width: 94%;
margin: 0 auto;
margin-bottom: 8px;
height: 20px;
line-height: 20px;
font-size: 12px;
.el-statistic {
display: flex;
justify-content: center;
align-items: center;
.head {
}
.con {
color: #169e8c;
}
}
}
.radioFilter {
width: 94%;
margin: 0 auto;
margin-bottom: 8px;
font-size: 12px;
display: flex;
justify-content: space-around;
.refresh {
}
.el-radio-group {
display: flex;
align-items: center;
justify-content: center;
.el-radio {
margin-right: 16px;
}
}
}
.el-tree {
overflow-y: scroll;
overflow-x: hidden;
.el-tree-node__content {
height: 32px;
font-size: 12px;
}
.custom-tree-node {
color: #333;
overflow: hidden;
span {
display: flex;
display: inline-table;
overflow: hidden;
align-items: center;
}
.num {
color: #169e8c;
}
}
}
.el-tree--highlight-current
.el-tree-node.is-current
> .el-tree-node__content {
//
color: #fff;
background: #169e8c;
.custom-tree-node {
color: #fff;
//overflow: hidden;
span {
display: flex;
//overflow: hidden;
align-items: center;
.num {
color: #fff;
}
.iconfont {
//width: 30px;
display: inline-table;
}
}
}
}
.disconnect {
color: #d3d3d3;
}
}
</style>

@ -5,7 +5,11 @@
<el-button type="primary">
声光报警<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown" class="gpsdropStyle">
<el-dropdown-menu
slot="dropdown"
class="gpsdropStyle"
:append-to-body="false"
>
<el-dropdown-item command="open">开启</el-dropdown-item>
<el-dropdown-item command="close">关闭</el-dropdown-item>
</el-dropdown-menu>

@ -5,7 +5,11 @@
<el-button type="primary">
线缆显示<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown" class="gpsdropStyle">
<el-dropdown-menu
slot="dropdown"
class="gpsdropStyle"
:append-to-body="false"
>
<el-dropdown-item command="open">开启</el-dropdown-item>
<el-dropdown-item command="close">关闭</el-dropdown-item>
</el-dropdown-menu>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,999 @@
<template>
<div class="thumb-example">
<div class="radioBox" v-if="roleUser == 8 || roleUser == 0">
{{ radioPx }} <span v-if="fileSize">({{ fileSize }})</span>
<span v-if="protocolInfo == '65280'"> I1 </span>
<span v-if="protocolInfo == '65296'"> 西 </span>
<span v-if="protocolInfo == '65281'"> </span>
<span v-if="protocolInfo == '65282'"> </span>
<span v-if="protocolInfo == '65283'"> </span>
<span v-if="protocolInfo == '65284'"> </span>
<span v-if="protocolInfo == '65285'"> </span>
<span v-if="protocolInfo == '65286'"> </span>
<span v-if="protocolInfo == '65290'"> v2020 </span>
<span v-if="protocolInfo == '65298'"> </span>
<span v-if="protocolInfo == '2'"> </span>
<span>{{ protocolInfo }}</span>
<!-- <span>({{ terminalPhoto.length }})</span> -->
</div>
<div class="topPic">
<div
class="bigPic"
v-if="currentPicPath.indexOf('nopic') !== -1 && currentPicPath"
>
<el-image :src="currentPicPath"></el-image>
</div>
<div
class="bigPic"
v-else-if="currentPicPath && mediaType == 0"
v-loading="picLoading"
>
<!-- :preview-src-list="srcList" @click="handleBigPicbox(currentPicPath)" -->
<el-image
:src="currentPicPath + '!1366x768'"
@load="loadImage"
@error="setDefaultImage"
ref="picJpg"
id="alarmPic"
width="100%"
height="100%"
:preview-src-list="srcList"
>
<template slot="error">
<img src="../../../assets/img/nodatapic2.jpg" />
</template>
</el-image>
<canvas id="myCanvas" class="myCanvas" ref="myCanvas"></canvas>
<canvas id="alarmCanvas" class="alarmCanvas" ref="alarmCanvas"></canvas>
<!-- <img :src="currentPicPath + '!1366x768'" @load="loadImage" /> -->
</div>
<div class="bigPic" v-else-if="currentPicPath && mediaType == 1">
<video
width="100%"
height="100%"
:src="currentPicPath"
controls="controls"
autoplay
></video>
</div>
<div class="arrow leftArrow" @click="leftClick" v-if="activeSmall > 0">
<i class="el-icon-arrow-left"></i>
</div>
<el-button
v-if="mediaType !== 1"
class="downBtn"
@click.stop="downLoadPic(currentPicPath, currentPicPath)"
>下载图片</el-button
>
<div
class="arrow rightArrow"
@click="rightClick"
v-if="activeSmall !== terminalPhoto.length - 1"
>
<i class="el-icon-arrow-right"></i>
</div>
</div>
<!-- -->
<div class="bottomPic">
<div class="scrollPicContain">
<div
class="el-car-item"
ref="scrollBox"
v-on:wheel="handleScroll"
:class="terminalPhoto.length < photoNum ? 'littlePic' : ''"
>
<div
class="smallPic"
v-for="(item, index2) in terminalPhoto"
:key="index2"
@click="changeBigPic(item, index2)"
:class="`${activeSmall === index2 ? 'borderActive ' : ''}${
photoNum === 10 ? 'moreSmallPic' : ''
}`"
>
<div
class="picBox"
v-if="
item.path.indexOf('nopic') == -1 &&
item.path.indexOf('videos') == -1
"
>
<!-- <el-image v-lazy="item.path + '!260x160'"></el-image> -->
<img v-lazy="item.path + '!160x60'" />
<!-- <img :src="item.path + '!260x160'" />-->
<!-- :class="{ alarmSpan: item.isAlarm === 1 }" -->
<p class="timeInfo">
<el-tooltip
class="item"
effect="dark"
content="拍照时间"
placement="top-start"
>
<span>{{ $moment(item.photoTime).format("HH:mm:ss") }}</span>
</el-tooltip>
(
<el-tooltip
class="item"
effect="dark"
content="图片上传时间"
placement="top-start"
>
<span> {{ $moment(item.recvTime).format("HH:mm:ss") }}</span>
</el-tooltip>
)
<span
>--{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelName
}}</span
>
<span class="alarmSpan" v-if="item.isAlarm == 1">()</span>
</p>
</div>
<div class="picBox" v-else-if="item.mediaType == 1">
<!-- <el-image :src="item.thumb + '!260x160'"></el-image> -->
<img v-lazy="item.thumb + '!160x60'" />
<p class="timeInfo">
<i class="el-icon-video-camera"></i>
<el-tooltip
class="item"
effect="dark"
content="拍照时间"
placement="top-start"
>
<span>{{ $moment(item.photoTime).format("HH:mm:ss") }}</span>
</el-tooltip>
(
<el-tooltip
class="item"
effect="dark"
content="图片上传时间"
placement="top-start"
>
<span> {{ $moment(item.recvTime).format("HH:mm:ss") }}</span>
</el-tooltip>
)
<span
>--{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelName
}}</span
>
</p>
</div>
<div class="picBox" v-else>
<!-- <el-image :src="item.path"></el-image> -->
<img v-lazy="item.path" />
</div>
</div>
</div>
<div class="arrow leftArrow" @click.stop="smallLeftClick" ref="leftRef">
<i class="el-icon-arrow-left"></i>
</div>
<div class="arrow rightArrow" ref="rightRef">
<i class="el-icon-arrow-right" @click.stop="smallRightClick"></i>
</div>
</div>
</div>
<!-- 点击出现大图 -->
<!-- <div v-if="showBigpic" class="showPic" @click="closePic($event)">
<div class="picboxI">
<img
id="bigimg2"
ref="bigimgref"
class="maskPic img"
:src="bigImgPath"
width="100%"
height="100%"
/>
<canvas id="bigCanvas2" class="mybigCanvas" ref="myCanvasbig"></canvas>
</div>
<div class="viewClose" @click="closePic($event)">
<i class="el-icon-close"></i>
</div>
</div> -->
</div>
</template>
<script>
import defaultImage from "../../../assets/img/nodatapic2.jpg";
import { getCoordinate, updateMarkEnableStatus } from "@/utils/api/index";
export default {
components: {},
props: {
terminalPhoto: {
type: Array,
default: () => [],
},
photoNum: {
type: Number,
default: () => [],
},
protocolInfo: {
type: Number,
},
},
data() {
return {
items: [
"Item 1",
"Item 2",
"Item 3",
"Item 4",
"Item 5",
"Item 6",
"Item 7",
"Item 8",
"Item 9",
"Item 10",
],
picLoading: true,
currentPicPath: "", //
mediaType: "", //
activeSmall: 0, //,
currentPage: 0,
srcList: [],
radioPx: "",
fileSize: "",
roleUser: "",
localPoints: [], //线
flagLine: true, //线
canvas: null,
ctx: null,
imgpic: null,
color: "", //线
borderwidth: "", //线
markEnable: "", //
recArrs: [],
picDataAlarm: [],
labelMarkArrs: [],
//
showBigpic: false,
picShowFlag: true,
};
},
mounted() {
////console.log(this.terminalPhoto);
this.changeBigPic(this.terminalPhoto[0], 0);
// console.log(this.terminalPhoto[0].path);
},
watch: {
terminalPhoto: {
handler(newVal, oldVal) {
this.terminalPhoto = newVal;
},
immediate: true,
deep: true, //deep false
},
},
computed: {},
created() {
this.roleUser = localStorage.getItem("role");
////console.log(this.roleUser);
},
methods: {
//
async downLoadPic(path, name) {
const imgUrl = path;
const response = await fetch(imgUrl);
const blob = await response.blob();
//
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
console.log(name);
link.download = name.split("/").pop();
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// Blob URL
window.URL.revokeObjectURL(url);
},
//线
getPointList(data) {
console.log("woshi 线缆绘制", data);
getCoordinate({
channelId: data.channelId,
needPic: "1",
termId: data.termId,
})
.then((res) => {
//console.log(res);
this.localPoints = res.data.list;
this.color = res.data.color;
this.borderwidth = res.data.boderWidth;
this.markEnable = res.data.markEnable;
if (this.markEnable === 1) {
this.drawline();
}
})
.catch((err) => {});
},
//线
openLine() {
this.flagLine = true;
//1
updateMarkEnableStatus({
status: 1,
}).then((res) => {
//console.log(res);
});
this.drawline();
},
//线
closeLine() {
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
this.flagLine = false;
//0
updateMarkEnableStatus({
status: 0,
}).then((res) => {
//console.log(res);
});
},
//线
drawline() {
this.canvas = this.$refs.myCanvas;
this.imgpic = this.$refs.picJpg;
this.canvas.width = this.imgpic.imageWidth; //
this.canvas.height = this.imgpic.imageHeight; //
this.ctx = this.canvas.getContext("2d");
if (this.flagLine == true) {
this.localPoints = this.localPoints;
} else {
this.localPoints = [];
}
this.ctx.beginPath();
//线
this.ctx.strokeStyle = this.color;
// 线
this.ctx.lineWidth = this.borderwidth;
if (this.localPoints == null) {
return;
} else {
for (var i = 0; i < this.localPoints.length; i++) {
this.ctx.moveTo(
this.localPoints[i].x1 * this.imgpic.imageWidth,
this.localPoints[i].y1 * this.imgpic.imageHeight
);
this.ctx.lineTo(
this.localPoints[i].x2 * this.imgpic.imageWidth,
this.localPoints[i].y2 * this.imgpic.imageHeight
);
}
this.ctx.closePath();
this.ctx.stroke();
}
// this.ctx.beginPath(); //
// this.ctx.moveTo(100, 100); //
// this.ctx.lineTo(300, 100); //
// this.ctx.lineTo(300, 300); //
// this.ctx.closePath(); //
// this.ctx.stroke(); //
},
//
leftClick() {
console.log(this.photoNum);
this.activeSmall--;
this.$refs.scrollBox.scrollLeft -=
this.$refs.scrollBox.offsetWidth / this.photoNum;
this.changeBigPic(this.terminalPhoto[this.activeSmall], this.activeSmall);
},
rightClick() {
console.log(this.photoNum);
this.activeSmall++;
this.$refs.scrollBox.scrollLeft +=
this.$refs.scrollBox.offsetWidth / this.photoNum;
this.changeBigPic(this.terminalPhoto[this.activeSmall], this.activeSmall);
},
//
changeBigPic(data, i) {
// //console.log("222222222", this.currentPage, this.activeSmall);
this.picShowFlag = true;
if (this.currentPicPath == "static/img/nopic.0e9cfc7c.jpg") {
this.picShowFlag = false;
}
this.picDataAlarm = data;
this.srcList = [];
this.localPoints = [];
this.activeSmall = i;
this.mediaType = data.mediaType;
this.currentPicPath = data.path;
this.srcList.push(data.path);
if (data.width != undefined) {
this.radioPx = data.width + "x" + data.height;
} else {
this.radioPx = "";
}
if (data.fileSize !== undefined) {
const sizeInBytes = data.fileSize;
const sizeInMB = sizeInBytes / (1024 * 1024);
const sizeInKB = sizeInBytes / 1024;
if (sizeInMB >= 1) {
this.fileSize = `${sizeInMB.toFixed(2)}M`; // 1MBMB
} else {
this.fileSize = `${sizeInKB.toFixed(0)}K`; // 1MBKB
}
} else {
this.fileSize = ""; // data.fileSize
}
// console.log(data.channelId);
if (data.channelId) {
this.getPointList(data);
}
const items = this.$refs.scrollBox.querySelectorAll(".smallPic");
const selectedItem = items[i];
const selectedItemLeft = selectedItem.offsetLeft;
const scrollContainer = this.$refs.scrollBox;
const scrollContainerWidth = scrollContainer.offsetWidth;
const selectedItemWidth = selectedItem.offsetWidth;
//
let scrollDistance =
selectedItemLeft - (scrollContainerWidth - selectedItemWidth) / 2;
if (scrollDistance < 0) {
scrollDistance = 0;
} else if (
scrollDistance + scrollContainerWidth >
scrollContainer.scrollWidth
) {
scrollDistance = scrollContainer.scrollWidth - scrollContainerWidth;
}
// scrollLeft
scrollContainer.scrollLeft = scrollDistance;
},
loadImage() {
console.log("loading");
this.picLoading = false;
this.drawlineBig(this.picDataAlarm);
this.picShowFlag = false;
},
setDefaultImage(e) {
e.target.src = defaultImage;
this.picLoading = false;
this.picShowFlag = false;
},
//
handleScroll(e) {
let direction = e.deltaY > 0 ? "down" : "up"; //deltaY
if (direction == "down") {
this.$refs.scrollBox.scrollLeft +=
(this.$refs.scrollBox.offsetWidth / this.photoNum) * 2;
}
if (direction == "up") {
this.$refs.scrollBox.scrollLeft -=
(this.$refs.scrollBox.offsetWidth / this.photoNum) * 2;
}
},
handleSwipeLeft() {
//
this.$refs.scrollBox.scrollLeft -=
(this.$refs.scrollBox.offsetWidth / this.photoNum) * 2;
},
handleSwipeRight() {
//
this.$refs.scrollBox.scrollLeft +=
(this.$refs.scrollBox.offsetWidth / this.photoNum) * 2;
},
//
smallLeftClick() {
this.$refs.scrollBox.scrollLeft -= this.$refs.scrollBox.offsetWidth;
this.$forceUpdate(); // Vue
},
smallRightClick() {
this.$refs.scrollBox.scrollLeft += this.$refs.scrollBox.offsetWidth;
this.$forceUpdate(); // Vue
},
//
//
drawlineBig(data) {
console.log(data);
this.canvas = document.getElementById("alarmCanvas");
this.imgpic = document.getElementById("alarmPic");
console.log(document.getElementById("alarmCanvas"));
console.log(document.getElementById("alarmPic"));
console.log(this.canvas);
console.log(this.imgpic);
this.textInfo = data.enname;
this.canvas.width = this.imgpic.offsetWidth; //
this.canvas.height = this.imgpic.offsetHeight; //
console.log(this.canvas.width, this.canvas.height);
this.ctx = this.canvas.getContext("2d");
this.ctx.beginPath();
//线
this.ctx.strokeStyle = "#ff0000";
// 线
this.ctx.lineWidth = 2;
this.labelMarkArrs = data.alarmlist;
this.recArrs = [];
for (var i = 0; i < this.labelMarkArrs.length; i++) {
console.log(this.labelMarkArrs[i]);
//
this.recArrs.push({
x:
this.labelMarkArrs[i].x * this.canvas.width -
(this.labelMarkArrs[i].width * this.canvas.width) / 2,
y:
this.labelMarkArrs[i].y * this.canvas.height -
(this.labelMarkArrs[i].height * this.canvas.height) / 2,
w: this.labelMarkArrs[i].width * this.canvas.width,
h: this.labelMarkArrs[i].height * this.canvas.height,
text: this.labelMarkArrs[i].enname + this.labelMarkArrs[i].prob + "%",
type: this.labelMarkArrs[i].label,
});
}
console.log(this.recArrs);
if (!this.recArrs.length) return;
for (var i = 0; i < this.recArrs.length; i++) {
// >2
if (this.recArrs[i].w > 2 && this.recArrs[i].h > 2) {
this.ctx.beginPath();
this.ctx.lineWidth = 2; // 线
this.ctx.strokeStyle = "rgb(255, 255, 0)"; // 线
//
// this.ctx.fillStyle = "rgba(22, 158, 140, 0.4)"; //
this.ctx.strokeRect(
this.recArrs[i].x,
this.recArrs[i].y,
this.recArrs[i].w,
this.recArrs[i].h
); //
// this.ctx.fillRect(
// this.recArrs[i].x,
// this.recArrs[i].y,
// this.recArrs[i].w,
// this.recArrs[i].h
// ); //
//
if (this.recArrs[i].text) {
this.ctx.font = "100 18px 微软雅黑";
this.ctx.lineWidth = 1;
this.ctx.strokeStyle = "rgb(255,255,0)";
this.ctx.strokeText(
this.recArrs[i].text,
this.recArrs[i].x +
this.recArrs[i].w / 2 -
(this.recArrs[i].text.length / 2) * 16,
this.recArrs[i].y - 20 < 0
? this.recArrs[i].y + this.recArrs[i].h + 20
: this.recArrs[i].y - 10
);
}
}
}
this.ctx.closePath();
this.ctx.stroke();
},
//
drawlineBig2(data) {
console.log(data);
this.canvas = document.getElementById("bigCanvas2");
this.imgpic = document.getElementById("bigimg2");
console.log(document.getElementById("alarmCanvas"));
console.log(document.getElementById("bigimg2"));
console.log(this.canvas);
console.log(this.imgpic);
this.textInfo = data.enname;
this.canvas.width = this.imgpic.offsetWidth; //
this.canvas.height = this.imgpic.offsetHeight; //
console.log(this.canvas.width, this.canvas.height);
this.ctx = this.canvas.getContext("2d");
this.ctx.beginPath();
//线
this.ctx.strokeStyle = "#ff0000";
// 线
this.ctx.lineWidth = 2;
this.labelMarkArrs = data.alarmlist;
this.recArrs = [];
for (var i = 0; i < this.labelMarkArrs.length; i++) {
console.log(this.labelMarkArrs[i]);
//
this.recArrs.push({
x:
this.labelMarkArrs[i].x * this.canvas.width -
(this.labelMarkArrs[i].width * this.canvas.width) / 2,
y:
this.labelMarkArrs[i].y * this.canvas.height -
(this.labelMarkArrs[i].height * this.canvas.height) / 2,
w: this.labelMarkArrs[i].width * this.canvas.width,
h: this.labelMarkArrs[i].height * this.canvas.height,
text: this.labelMarkArrs[i].enname + this.labelMarkArrs[i].prob + "%",
type: this.labelMarkArrs[i].label,
});
}
console.log(this.recArrs);
if (!this.recArrs.length) return;
for (var i = 0; i < this.recArrs.length; i++) {
// >2
if (this.recArrs[i].w > 2 && this.recArrs[i].h > 2) {
this.ctx.beginPath();
this.ctx.lineWidth = 2; // 线
this.ctx.strokeStyle = "rgb(255, 255, 0)"; // 线
//
// this.ctx.fillStyle = "rgba(22, 158, 140, 0.4)"; //
this.ctx.strokeRect(
this.recArrs[i].x,
this.recArrs[i].y,
this.recArrs[i].w,
this.recArrs[i].h
); //
// this.ctx.fillRect(
// this.recArrs[i].x,
// this.recArrs[i].y,
// this.recArrs[i].w,
// this.recArrs[i].h
// ); //
//
if (this.recArrs[i].text) {
this.ctx.font = "100 16px 微软雅黑";
this.ctx.lineWidth = 2;
this.ctx.strokeStyle = "rgb(255,255,0)";
this.ctx.strokeText(
this.recArrs[i].text,
this.recArrs[i].x +
this.recArrs[i].w / 2 -
(this.recArrs[i].text.length / 2) * 16,
this.recArrs[i].y - 20 < 0
? this.recArrs[i].y + this.recArrs[i].h + 20
: this.recArrs[i].y - 10
);
}
}
}
this.ctx.closePath();
this.ctx.stroke();
},
//
handleBigPicbox(val) {
console.log(val);
this.showBigpic = true;
this.bigImgPath = val;
setTimeout(() => {
this.$nextTick(() => {
this.drawlineBig2(this.picDataAlarm);
});
}, 100);
},
closePic(e) {
console.log(e);
var btn = this.$refs.bigimgref;
console.log(btn);
if (btn) {
if (!btn.contains(event.target)) {
//.app-download
this.zoomD = 1;
this.showBigpic = false;
}
}
//
// this.showBigpic = false;
},
},
};
</script>
<style lang="less">
.thumb-example {
width: 100%;
// display: flex;
// flex-direction: column;
height: calc(100% - 32px);
box-sizing: border-box;
.radioBox {
position: absolute;
top: 8px;
right: 24px;
color: #fff;
font-size: 14px;
}
.skeletonBox {
width: 100%;
height: 80%;
margin-bottom: 4px;
.el-skeleton,
.elpicBox {
width: 100%;
height: 100%;
}
.el-skeleton__image svg {
width: 50%;
height: 50%;
}
}
.topPic {
width: 100%;
height: 80%;
margin-bottom: 4px;
position: relative;
.bigPic {
width: 100%;
height: 100%;
cursor: pointer;
.el-image {
width: 100%;
height: 100%;
img {
width: 100%;
height: 100%;
}
}
}
.myCanvas {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
cursor: pointer;
z-index: 3;
pointer-events: none;
}
#alarmCanvas {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
margin: 0 auto;
cursor: pointer;
pointer-events: none;
}
&:hover {
.arrow {
opacity: 1;
transition: all 0.5s ease-in;
}
.downBtn {
opacity: 1;
transition: all 0.5s ease-in;
}
}
.arrow {
opacity: 0;
position: absolute;
cursor: pointer;
font-size: 16px;
border-radius: 30px;
position: absolute;
top: 50%;
transform: translateY(-50%);
color: #4cdbc8;
font-weight: bold;
background-color: rgba(31, 45, 61, 0.8);
display: flex;
justify-content: center;
align-items: center;
text-align: center;
line-height: 60px;
width: 40px;
height: 40px;
z-index: 4;
&:hover {
background-color: rgba(31, 45, 61, 1);
}
}
.leftArrow {
left: 16px;
}
.rightArrow {
right: 16px;
}
.downBtn {
position: absolute;
background: rgba(0, 0, 0, 0.5);
border: none;
right: 24px;
bottom: 24px;
color: #fff;
z-index: 5;
opacity: 0;
&:hover {
background: rgba(0, 0, 0, 0.9);
color: #169e8c;
}
}
}
.bottomPic {
width: 100%;
height: 20%;
margin-bottom: 6px;
.scrollPicContain {
// width: 1380px;
display: flex;
height: 100%;
position: relative;
.arrow {
opacity: 0;
position: absolute;
cursor: pointer;
font-size: 14px;
border-radius: 30px;
position: absolute;
top: 50%;
transform: translateY(-50%);
color: #4cdbc8;
font-weight: bold;
background-color: rgba(31, 45, 61, 0.8);
display: flex;
justify-content: center;
align-items: center;
text-align: center;
line-height: 60px;
width: 30px;
height: 30px;
z-index: 4;
&:hover {
background-color: rgba(31, 45, 61, 1);
}
}
.leftArrow {
left: 16px;
}
.rightArrow {
right: 16px;
}
&:hover {
.arrow {
opacity: 1;
transition: all 0.5s ease-in;
}
}
}
.el-car-item {
width: 100%;
height: 100%;
display: flex;
overflow-x: auto;
overflow-y: hidden;
scroll-behavior: smooth;
scrollbar-width: none;
.smallPic {
width: 19.2%;
border: 3px solid transparent;
box-sizing: border-box;
flex-shrink: 0;
white-space: nowrap;
position: relative;
cursor: pointer;
.picBox {
width: 100%;
height: 100%;
}
img {
width: 100%;
height: 100%;
}
.timeInfo {
position: absolute;
bottom: 0px;
width: 100%;
background: #f0f0f0;
padding: 6px 0;
font-size: 12px;
text-align: center;
color: #333;
.el-icon-video-camera {
font-size: 20px;
margin-right: 8px;
align-items: center;
vertical-align: sub;
color: #169e8c;
}
}
.alarmSpan {
color: #f00;
font-weight: bold;
}
}
.moreSmallPic {
width: 9.8%;
}
.borderActive {
.timeInfo {
color: #fff;
background: linear-gradient(180deg, #4cdbc8 10%, #128071);
}
.alarmSpan {
color: #f00;
font-weight: bold;
}
}
}
.littlePic {
justify-content: center;
}
}
.showPic {
position: fixed;
background-color: rgba(0, 0, 0, 50%);
bottom: 0;
left: 0;
overflow: hidden;
right: 0;
top: 0;
z-index: 9999;
width: 100%;
height: 100%;
display: flex;
cursor: pointer;
.picboxI {
position: relative;
width: 90%;
height: 90%;
margin: auto;
animation-name: scaleDraw;
/*关键帧名称*/
animation-timing-function: ease;
/*动画的速度曲线*/
animation-iteration-count: 1;
/*动画播放的次数*/
animation-duration: 0.65s;
display: flex;
align-items: center;
justify-content: center;
img {
max-width: 100%;
max-height: 100%;
margin: auto;
position: absolute;
cursor: grab;
}
.mybigCanvas {
position: absolute;
// top: 0;
// left: 0;
max-width: 100%;
max-height: 100%;
margin: 0 auto;
cursor: pointer;
pointer-events: none;
}
}
.viewClose {
-webkit-app-region: no-drag;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 50%;
cursor: pointer;
height: 80px;
overflow: hidden;
position: absolute;
right: -40px;
top: -40px;
transition: background-color 0.15s;
width: 80px;
.el-icon-close {
bottom: 16px;
left: 16px;
position: absolute;
color: #fff;
font-size: 18px;
}
}
}
}
</style>

@ -1,22 +1,14 @@
<template>
<div class="gpsbuttonBox">
<el-button type="primary" @click="handleShowGPS">GPS </el-button>
<el-dropdown class="dropgps" trigger="click" @command="handleCommandGps">
<el-button type="primary">
GPS开关<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown" class="gpsdropStyle">
<el-dropdown-item command="open">开启GPS</el-dropdown-item>
<el-dropdown-item command="close">关闭GPS</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<gps-position ref="gpsdialog_ref"></gps-position>
</div>
</template>
<script>
// import infoDialog from "./infoDialog.vue";
import gpsPosition from "./gpsPosition.vue";
import { getTermStatus, setTermGPSJoggle } from "@/utils/api/index";
import {} from "@/utils/api/index";
export default {
components: {
gpsPosition,
@ -45,54 +37,6 @@ export default {
},
},
methods: {
//gps
handleCommandGps(command) {
switch (command) {
case "open": //
this.changeGPS(1, this.cmdId);
break;
case "close": //
this.changeGPS(0, this.cmdId);
break;
}
},
changeGPS(val, cmdid) {
console.log(val, cmdid);
getTermStatus({ termId: this.termId }).then((res) => {
console.log(res);
if (res.data.isonline) {
setTermGPSJoggle({ gpsstatus: val, cmdId: cmdid })
.then((res) => {
console.log(res);
if (val == 0) {
this.$message({
duration: 1500,
message: "GPS已关闭",
type: "warning",
showClose: true,
});
} else {
this.$message({
duration: 1500,
message: "成功开启GPS",
type: "success",
showClose: true,
});
}
})
.catch((err) => {
console.log(err); //
});
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
//GPS
handleShowGPS() {
this.$refs.gpsdialog_ref.display(this.cmdId, this.termId);
@ -103,8 +47,8 @@ export default {
</script>
<style lang="less">
.gpsbuttonBox {
width: 100%;
display: flex;
justify-content: space-between;
// width: 100%;
// display: flex;
// justify-content: space-between;
}
</style>

@ -1,5 +1,5 @@
<template>
<div class="morePicBox" v-if="isShow">
<div class="morePicBox" v-show="isShow">
<div class="headTitle">
<div class="info">
<p>
@ -20,10 +20,10 @@
</div>
<div class="picmain" v-loading="picLoading">
<carouselChart
:key="carouselKey"
ref="carouselpic"
:terminalPhoto="terminalPhoto"
:photoNum="photoNum"
v-if="terminalPhoto.length > 0"
></carouselChart>
</div>
</div>
@ -47,6 +47,7 @@ export default {
nopicPath: require("@/assets/img/nopic.jpg"),
picLoading: false,
photoNum: 10,
carouselKey: 0, // key
};
},
mounted() {},
@ -62,7 +63,7 @@ export default {
},
//
getTerminalPhotoList(channelid, date, termId) {
this.terminalPhoto = [];
//this.terminalPhoto = [];
this.picLoading = true;
getTerminalPhotoListJoggle({
channelid: channelid,
@ -83,23 +84,7 @@ export default {
} else {
this.terminalPhoto = res.data.list;
}
let newDataList = [];
let current = 0;
if (this.terminalPhoto && this.terminalPhoto.length > 0) {
for (let i = 0; i <= this.terminalPhoto.length - 1; i++) {
if (i % this.photoNum !== 0 || i === 0) {
if (!newDataList[current]) {
newDataList.push([this.terminalPhoto[i]]);
} else {
newDataList[current].push(this.terminalPhoto[i]);
}
} else {
current++;
newDataList.push([this.terminalPhoto[i]]);
}
}
}
this.terminalPhoto = [...newDataList];
this.carouselKey++; // key
})
.catch((err) => {
console.log(err); //
@ -119,6 +104,7 @@ export default {
background: #fff;
top: 0px;
left: 0px;
z-index: 2;
//z-index: 99999;
.headTitle {
height: 40px;
@ -150,6 +136,9 @@ export default {
.picmain {
width: 100%;
height: calc(100% - 10px);
.el-loading-mask {
background-color: rgba(255, 255, 255, 0.2);
}
}
}
</style>

@ -1,6 +1,16 @@
<template>
<div class="AreaBox">
<div class="areaHead">{{ areaData.cmdid }}</div>
<div class="areaHead">
<span @dblclick="handleDblClick(areaData.cmdid)">{{
areaData.cmdid
}}</span>
<el-button
type="text"
:icon="areaData.isfavor == 1 ? 'el-icon-star-on' : 'el-icon-star-off'"
@click="addCollectClick"
>{{ areaData.isfavor == 1 ? "取消收藏" : "添加收藏" }}</el-button
>
</div>
<div class="paramsDate">
<h3>日历快速查询</h3>
<el-date-picker
@ -10,26 +20,13 @@
format="yyyy 年 MM 月 dd 日"
:picker-options="pickerOptions"
@change="changedate"
@focus="handleDateFocus"
:clearable="false"
>
</el-date-picker>
</div>
<div class="paramsDate">
<h3>通道监拍点</h3>
<!-- <el-radio-group v-model="selectChannelValue" @input="changeChannelId">
<el-radio-button
v-for="item in channelListOption"
:key="item.channelid"
:value="item.channelid"
:label="item.channelid"
>
{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelname
}}</el-radio-button
>
</el-radio-group> -->
<el-select
v-model="selectChannelValue"
placeholder="请选择通道"
@ -53,51 +50,200 @@
}}
</el-option>
</el-select>
<div class="yzwBox" v-if="yzwFlag">
<h3>通道预置位</h3>
<el-input
v-model="yzwVal"
placeholder="请输入预置位"
@change="searchYzw"
></el-input>
</div>
</div>
<div class="paramsDate setTimebtn">
<h3>操作项</h3>
<div class="buttonGroup">
<takePicButton></takePicButton>
<takeVideoButton></takeVideoButton>
<takePicButton
v-if="showButton('pzShowBtn')"
ref="takepicRef"
></takePicButton>
<takeVideoButton v-if="showButton('spShowBtn')"></takeVideoButton>
<deviceInfoButton></deviceInfoButton>
<scheduleButton></scheduleButton>
<alarmButton></alarmButton>
<scheduleButton v-if="showButton('pztimeShowBtn')"></scheduleButton>
<alarmButton v-if="showButton('sgbjShowBtn')"></alarmButton>
<cableButton></cableButton>
<gpsButton></gpsButton>
<el-button type="primary" @click="handlehistoryPic">
<el-dropdown
class="dropgps"
trigger="click"
@command="handleCommandGps"
>
<el-button type="primary">
GPS开关<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu
slot="dropdown"
class="gpsdropStyle"
:append-to-body="false"
>
<el-dropdown-item command="open">开启GPS</el-dropdown-item>
<el-dropdown-item command="close">关闭GPS</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button
type="primary"
@click="handlehistoryPic"
v-if="showhisButton('/realTimeSearch')"
>
历史图片</el-button
>
<el-button type="primary" @click="handleParams"> </el-button>
<!-- <el-button type="primary" @click="handleTakePic" :loading="picLoading"
>主动拍照
</el-button> -->
<!-- <el-button type="primary">主动拍照 </el-button>
<el-button type="primary">主动拍照 </el-button>
<el-button type="primary">主动拍照 </el-button>
<el-button type="primary">主动拍照 </el-button>
<el-button type="primary">主动拍照 </el-button>
<el-button type="primary">主动拍照 </el-button>
<el-button type="primary">主动拍照 </el-button> -->
<el-button
type="primary"
@click="handleParams"
v-if="showButton('cspzShowBtn')"
>
参数配置</el-button
>
<el-button
type="primary"
@click="handleuploadPic"
v-if="showButton('sctpShowBtn')"
>
上传图片</el-button
>
<takeTimePicButton
v-if="showButton('zdTimepzShowBtn')"
></takeTimePicButton>
<setChannelButton v-if="showButton('tdszShowBtn')"></setChannelButton>
<setAppButton v-if="showButton('appShowBtn')"></setAppButton>
<el-dropdown
class="dropgps"
trigger="click"
@command="
(command) => {
handleSearchCommand(command, areaData);
}
"
>
<el-button type="primary">
数据查询<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu
slot="dropdown"
class="picdropStyle"
:append-to-body="false"
>
<el-dropdown-item command="info">基本信息</el-dropdown-item>
<el-dropdown-item command="workStatus">工作状态</el-dropdown-item>
<el-dropdown-item command="runStatus">运行状态</el-dropdown-item>
<el-dropdown-item command="GPS">GPS位置</el-dropdown-item>
<el-dropdown-item command="faultInfo">故障信息报</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<ptzDevice v-if="areaData.hasPan == 1"></ptzDevice>
<!-- 请求覆冰数据和微气象数据 -->
<el-dropdown
class="dropgps"
trigger="click"
@command="handleiceAndweather"
v-if="
areaData.hasPan == 1 &&
areaData.devType !== undefined &&
(areaData.devType.includes('2') || areaData.devType.includes('3'))
"
>
<el-button type="primary">
采集数据<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu
slot="dropdown"
class="gpsdropStyle"
:append-to-body="false"
>
<el-dropdown-item command="weather">微气象</el-dropdown-item>
<el-dropdown-item command="ice">覆冰</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div class="setfocalLength" v-if="areaData.devType == '65286'">
<h3>焦距调节</h3>
<div class="selectChannel">
<span class="labelname">选择通道</span>
<el-select
v-model="channelarrValue"
placeholder="请选择通道"
ref="multiSelect"
>
<el-option
v-for="item in channelfocalOpyion"
:key="item.channelid"
:label="
item.alias !== null && item.alias !== ''
? item.alias
: item.channelname
"
:value="item.channelid"
>
{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelname
}}
</el-option>
</el-select>
</div>
<div class="buttonGroup">
<el-button type="primary" icon="el-icon-zoom-in" @click="amplify()"
>放大</el-button
>
<el-button type="primary" icon="el-icon-zoom-out" @click="reduce()"
>缩小</el-button
>
</div>
</div>
</div>
<parameterSetDialog ref="parameterSetref"></parameterSetDialog>
<uploadpic ref="uploadpicref"></uploadpic>
<baseInfor ref="baseInfor_ref"></baseInfor>
<workStatus ref="workStatus_ref"></workStatus>
<runStatus ref="runStatus_ref"></runStatus>
<gpsSite ref="gpsSite_ref"></gpsSite>
<faultInfomation ref="fultInfo_ref"></faultInfomation>
</div>
</template>
<script>
import EventBus from "@/utils/event-bus";
import takePicButton from "./takePicButton.vue";
// import setChannelButton from "./setChannelButton.vue";
import setChannelButton from "../components/setChannel/setChannelButton";
import takeTimePicButton from "./takeTimePicButton.vue";
import takeVideoButton from "./takeVideoButton.vue";
import deviceInfoButton from "./deviceInfoButton.vue";
import scheduleButton from "./scheduleButton.vue";
import alarmButton from "./alarmButton.vue";
import cableButton from "./cableButton.vue";
import gpsButton from "./gpsButton.vue";
import uploadpic from "./uploadpic.vue";
import parameterSetDialog from "../../photographicDevice/components/parameterSetDialog.vue";
import { getChannelByTermidJoggle } from "@/utils/api/index";
import setAppButton from "./setAppButton.vue";
import ptzDevice from "./ptzDevice/index.vue";
import baseInfor from "../../photographicDevice/components/baseInfor.vue";
import workStatus from "../../photographicDevice/components/workStatus.vue";
import runStatus from "../../photographicDevice/components/runStatus.vue";
import gpsSite from "../../photographicDevice/components/gpsSite.vue";
import faultInfomation from "../../photographicDevice/components/faultInfomation.vue";
import {
getChannelByTermidJoggle,
updateTermCamera,
getTermStatus,
setTermCamera,
addFavorList,
setTermGPSJoggle,
} from "@/utils/api/index";
export default {
components: {
takePicButton,
takeTimePicButton,
takeVideoButton,
deviceInfoButton,
scheduleButton,
@ -105,11 +251,23 @@ export default {
cableButton,
gpsButton,
parameterSetDialog,
uploadpic,
setChannelButton,
ptzDevice,
setAppButton,
baseInfor,
workStatus,
runStatus,
gpsSite,
faultInfomation,
},
data() {
return {
roleUser: "",
selectChannelValue: null, //
channelListOption: [], //
channelarrValue: null,
channelfocalOpyion: [], //
dateValue: "", //
pickerOptions: {
disabledDate(date) {
@ -120,6 +278,12 @@ export default {
selectDyId: "", //线
selectLineId: "",
selectTowerId: "",
collectFlag: false, //
btnShowList: [],
hisShowbtn: true,
menuShowList: [],
yzwVal: "", //
yzwFlag: false,
};
},
@ -134,20 +298,125 @@ export default {
areaData() {
return this.$store.state.currentData;
},
showButtonMap() {
if (this.roleUser !== "0") {
return this.btnShowList.reduce((map, button) => {
map[button.key] = true; // key
return map;
}, {});
}
},
showhisButtonMap() {
if (this.roleUser !== "0") {
return this.menuShowList.reduce((map, button) => {
map[button.key] = true; // key
return map;
}, {});
}
},
},
created() {
this.roleUser = localStorage.getItem("role");
console.log("asdsaddddddddddddddddddddddddd", this.roleUser);
this.btnShowList = JSON.parse(localStorage.getItem("btnPermission"));
this.menuShowList = JSON.parse(localStorage.getItem("menuPermission"));
console.log("aaaaaaaaa,", this.areaData.devType);
console.log(this.btnShowList, this.menuShowList);
},
mounted() {
this.getDateTime();
},
methods: {
takepicFun() {
console.log("点击了我自己,准备取消轮巡");
this.$refs.takepicRef.clearFn();
},
//
showButton(key) {
if (this.roleUser !== "0") {
return this.showButtonMap[key] || false;
} else {
return true;
}
},
showhisButton(key) {
if (this.roleUser !== "0") {
return this.showhisButtonMap[key] || false;
} else {
return true;
}
},
//
handleDblClick(val) {
// alert(val);
var input = document.createElement("input"); // input
input.value = val; //
document.body.appendChild(input); //
input.select(); //
document.execCommand("Copy"); //
document.body.removeChild(input); //
//this.$message.success("");
this.$message({
duration: 800,
showClose: true,
message: "复制成功!",
type: "success",
});
},
//
getDateTime() {
console.log(new Date());
this.dateValue = new Date().getTime();
console.log(this.dateValue);
},
//
addCollectClick() {
if (this.areaData.isfavor !== 1) {
this.areaData.isfavor = 1;
addFavorList({ list: [this.areaData.id], type: 1 }).then((res) => {
EventBus.$emit("treelist");
});
this.$message({
type: "success",
message: "添加成功!",
});
// this.$confirm(", ?", "", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning",
// }).then(() => {
// });
} else {
this.$confirm("此操作将取消收藏, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.areaData.isfavor = 0;
addFavorList({ list: [this.areaData.id], type: 0 }).then((res) => {
EventBus.$emit("treelist");
});
this.$message({
type: "success",
message: "取消收藏!",
});
});
}
},
//focus
handleDateFocus() {
// pickerOptionsdisabledDate
this.pickerOptions.disabledDate = (date) => {
//console.log(date);
const currentDate = new Date();
return date.getTime() > currentDate.getTime(); //
};
},
//
changedate() {
console.log(this.dateValue.getTime());
this.dateValue = this.dateValue.getTime();
this.$parent.getPhotoList(
this.selectChannelValue,
this.dateValue,
@ -157,6 +426,7 @@ export default {
//
getChannelList() {
console.log(this.areaData);
console.log("我是选择的通道号", localStorage.getItem("channelId"));
getChannelByTermidJoggle({ termid: this.areaData.id })
.then((res) => {
console.log(res);
@ -165,10 +435,29 @@ export default {
];
this.channelListOption = this.channelListOption.concat(res.data.list);
console.log(this.channelListOption);
this.channelfocalOpyion = res.data.list; //
console.log(
"我是获取通道接口之后的通道",
this.channelListOption[0].channelid
);
this.selectChannelValue = this.channelListOption[0].channelid; //;
this.selectChannelValue =
Number(localStorage.getItem("channelId")) == 0
? -1
: Number(localStorage.getItem("channelId")); //;
this.$store.commit("channelId", this.selectChannelValue); //vuex
this.$store.commit("channelIdList", res.data.list); //vuex
if (this.selectChannelValue != -1) {
console.log(this.channelListOption[this.selectChannelValue].type);
if (this.channelListOption[this.selectChannelValue].type == 1) {
this.yzwFlag = true;
} else {
this.yzwFlag = false;
}
} else {
console.log("我选的是全部");
this.yzwFlag = false;
}
this.$parent.getPhotoList(
this.selectChannelValue,
this.dateValue,
@ -176,7 +465,13 @@ export default {
);
this.selectDyId = res.data.dyId;
this.selectLineId = res.data.lineId;
this.selectTowerId = res.data.towerId;
//this.selectTowerId = res.data.towerId;
if (res.data.list.length == 0) {
this.channelarrValue = null;
return;
} else {
this.channelarrValue = this.channelfocalOpyion[0].channelid;
}
})
.catch((err) => {
console.log(err); //
@ -185,12 +480,145 @@ export default {
//
changeChannelId(val) {
console.log(val);
// const a = this.channelListOption.find((channel) => channel.type === 1);
// console.log(a);
this.yzwVal = "";
if (val != -1) {
console.log(this.channelListOption[val].type);
if (this.channelListOption[val].type == 1) {
this.yzwFlag = true;
} else {
this.yzwFlag = false;
}
} else {
console.log("我选的是全部");
this.yzwFlag = false;
}
this.$store.commit("channelId", val); //currentDatavuex
this.$parent.getPhotoList(val, this.dateValue, this.areaData.id);
},
searchYzw() {
this.$parent.getPhotoList(
this.selectChannelValue,
this.dateValue,
this.areaData.id,
this.yzwVal
);
},
//gps
handleCommandGps(command) {
switch (command) {
case "open": //
this.changeGPS(1, this.areaData.id);
break;
case "close": //
this.changeGPS(0, this.areaData.id);
break;
}
},
changeGPS(val, cmdid) {
console.log(val, cmdid);
getTermStatus({ termId: cmdid }).then((res) => {
console.log(res);
if (res.data.isonline) {
setTermGPSJoggle({ gpsstatus: val, cmdId: cmdid })
.then((res) => {
console.log(res);
if (val == 0) {
this.$message({
duration: 1500,
message: "GPS已关闭",
type: "warning",
showClose: true,
});
} else {
this.$message({
duration: 1500,
message: "成功开启GPS",
type: "success",
showClose: true,
});
}
})
.catch((err) => {
console.log(err); //
});
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
//
handleiceAndweather(command) {
switch (command) {
case "weather": //
this.changeweathIce("1", this.areaData.id);
break;
case "ice": //
this.changeweathIce("34", this.areaData.id);
break;
}
},
changeweathIce(val, cmdid) {
console.log(val, cmdid);
getTermStatus({ termId: cmdid }).then((res) => {
console.log(res);
if (res.data.isonline) {
let params = [
{
name: "act",
value: "reqdata",
},
{
name: "reqType",
value: val,
},
{
name: "startTime",
value: 0,
},
{
name: "endTime",
value: 0,
},
];
this.setTermFn(params);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
setTermFn(val) {
setTermCamera({
termId: this.areaData.id,
list: val,
})
.then((res) => {
console.log(res);
this.$message({
duration: 1500,
showClose: true,
message: "命令已下发",
type: "success",
});
})
.catch((err) => {});
},
//
handlehistoryPic() {
console.log(this.areaData);
console.log(this.selectDyId, this.selectLineId, this.selectTowerId);
// console.log(this.zzCmdid, this.selectChannelValue);
if (typeof this.dateValue == "number") {
@ -203,7 +631,7 @@ export default {
query: {
dyId: this.selectDyId,
lineId: this.selectLineId,
towerId: this.selectTowerId,
towerId: this.areaData.towerid,
termId: this.areaData.id,
cmdId: this.areaData.cmdid,
channelId: this.selectChannelValue,
@ -216,6 +644,80 @@ export default {
console.log(this.areaData);
this.$refs.parameterSetref.display(this.areaData);
},
//
//
handleSearchCommand(command, row) {
console.log(command, row);
switch (command) {
case "info":
this.$refs.baseInfor_ref.display(row);
break;
case "workStatus":
this.$refs.workStatus_ref.display(row);
break;
case "runStatus":
this.$refs.runStatus_ref.display(row);
break;
case "GPS":
this.$refs.gpsSite_ref.display(row);
break;
case "faultInfo":
this.$refs.fultInfo_ref.display(row);
break;
default:
break;
}
},
//
amplify() {
getTermStatus({ termId: this.areaData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
updateTermCamera({
termId: this.areaData.id,
channelId: this.channelarrValue,
type: 6,
})
.then((res) => {})
.catch();
//this.$refs.infodialog_ref.getListData(this.channelId, this.cmdid);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
console.log(this.channelarrValue, this.areaData.id);
},
//
reduce() {
getTermStatus({ termId: this.areaData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
updateTermCamera({
termId: this.areaData.id,
channelId: this.channelarrValue,
type: 7,
})
.then((res) => {})
.catch();
//this.$refs.infodialog_ref.getListData(this.channelId, this.cmdid);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
handleuploadPic() {
this.$refs.uploadpicref.display(this.areaData);
},
},
};
</script>
@ -227,6 +729,14 @@ export default {
color: #169e8c;
font-size: 14px;
font-weight: normal;
display: flex;
justify-content: space-between;
span {
font-size: 12px;
}
.el-button--text {
color: #f08200;
}
}
.paramsDate {
margin-bottom: 16px;
@ -238,7 +748,7 @@ export default {
margin-bottom: 8px;
}
.el-radio-group {
display: flex;
// display: flex;
flex-wrap: wrap;
.el-radio-button {
margin-right: 6px;
@ -254,6 +764,9 @@ export default {
}
}
}
.yzwBox {
margin-top: 2px;
}
}
.setTimebtn {
.buttonGroup {
@ -269,5 +782,38 @@ export default {
}
}
}
.setfocalLength {
margin-bottom: 16px;
position: relative;
h3 {
font-size: 14px;
font-weight: normal;
color: #303133;
margin-bottom: 8px;
}
.selectChannel {
display: flex;
align-items: center;
margin-bottom: 12px;
.labelname {
font-size: 14px;
margin-right: 4px;
width: 80px;
color: #666;
}
}
.buttonGroup {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-button {
margin-bottom: 8px;
width: 104px;
}
.el-button + .el-button {
margin-left: 0px;
}
}
}
}
</style>

@ -0,0 +1,884 @@
<template>
<div class="setTime">
<el-dialog
title="选择拍照时间表"
:visible.sync="dialogVisible"
width="1100px"
>
<div class="setBox">
<div class="head">
<div class="left">
<h3>通道</h3>
<el-select
v-model="channelVal"
placeholder="请选择通道"
ref="multiSelect"
class="channelDiv"
>
<el-option
v-for="item in channelListOption"
:key="item.channelid"
:label="
item.alias !== null && item.alias !== ''
? item.alias
: item.channelname
"
:value="item.channelid"
>
{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelname
}}
</el-option>
</el-select>
</div>
<div class="left">
<el-button type="primary" class="serachBtn" @click="deviceTimeClick"
>查询</el-button
><span class="timeTotal">({{ deviceTimeList.length }})</span>
</div>
</div>
<div class="contain">
<div class="xfTime">
<div class="timelist">
<ul>
<li
v-for="(item, index) in timeList"
:key="index"
@click="deleteTime(index)"
>
<el-tag :type="selectedIndex === index ? 'danger' : ''"
>时间点:{{ item.time }} + 预置位:{{ item.preset }}</el-tag
>
</li>
</ul>
</div>
<div class="timeBtnGrop">
<el-button type="primary" @click="addTimeList"></el-button>
<el-button type="primary" @click="timeFrameVisible = true"
>批量增加</el-button
>
<el-button type="primary" @click="deleteSelectedTime"
>删除</el-button
>
<el-button type="primary" @click="clearAllTime"
>清除全部</el-button
>
<el-button
type="primary"
class="xfsjbBtn"
@click="handleSetTimeClick"
:loading="sureloading"
>下发时间表</el-button
>
</div>
</div>
<div
class="tagsBox"
v-loading="timeloading"
v-if="deviceTimeList.length !== 0"
>
<el-tag v-for="(item, index) in deviceTimeList" :key="index"
>时间点:{{ $moment(item).format("HH:mm") }} + 预置位:
{{ item.preset || 255 }}</el-tag
>
</div>
<div class="tagsBox" v-loading="timeloading" v-else>
<el-empty description="暂无时间表"></el-empty>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="closeTimeFun"> </el-button>
</span>
<el-dialog
width="340px"
title="拍照时间"
:visible.sync="timeInnerVisible"
append-to-body
class="timeinnerClass"
>
<div class="timePoint">
<div class="timeinput">
<h3>时间</h3>
<el-time-picker
v-model="timePointVal"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59',
}"
placeholder="任意时间点"
default-time="00:00:00"
>
</el-time-picker>
</div>
<div class="timeprt">
<h3>预置位</h3>
<el-input v-model="presetVal" placeholder="请输入"></el-input>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="timeInnerVisible = false"> </el-button>
<el-button type="primary" @click="sureTime"> </el-button>
</span>
</el-dialog>
<el-dialog
width="340px"
title="拍照时间范围"
:visible.sync="timeFrameVisible"
append-to-body
class="timeinnerClass"
>
<div class="timePoint">
<div class="timeinput timepick">
<h3>时间</h3>
<el-time-picker
is-range
v-model="timeValue"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
>
</el-time-picker>
</div>
<div class="timeSpan">
<h3>间隔</h3>
<el-input-number v-model="timeNum"></el-input-number>
</div>
<div class="timeprt">
<h3>预置位</h3>
<el-input v-model="presetspanVal" placeholder="请输入"></el-input>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="timeFrameVisible = false"> </el-button>
<el-button type="primary" @click="surepickTime"> </el-button>
</span>
</el-dialog>
</el-dialog>
</div>
</template>
<script>
import {
getChannelByTermidJoggle,
getTermStatus,
setTermCamera,
getTermCameraRequest,
} from "@/utils/api/index";
export default {
data() {
return {
timeloading: false,
deviceData: "", //
dialogVisible: false,
timeList: [], //
channelVal: 1,
channelListOption: [], //
timeInnerVisible: false, //
presetVal: 255, //
timePointVal: "", //
deviceTimeList: [], //
timeparams: [], //
deviceTimer: null, //
deviceNum: 1, //
attemptCount: 0, //
maxAttempts: 9, //
timeFrameVisible: false, //
timeValue: [], //
timeNum: 30, //
presetspanVal: 255, //
selectedIndex: null, //
sureloading: false,
};
},
mounted() {
//
let today = new Date();
//
let startOfDay = new Date(today);
startOfDay.setHours(0, 0, 0, 0); // 0
this.timePointVal = startOfDay;
//
let todayspan = new Date();
//
let startOfDayspan = new Date(todayspan);
startOfDayspan.setHours(0, 0, 0, 0); // 0
// 235959
let endOfDayspan = new Date(todayspan);
endOfDayspan.setHours(23, 59, 59, 999); // 235959999
// value1
this.timeValue = [startOfDayspan, endOfDayspan];
},
methods: {
display(val) {
this.dialogVisible = true;
this.deviceData = val;
console.log(this.deviceData);
this.getChannelList();
this.deviceTimeClick();
},
//
getChannelList() {
console.log(this.deviceData);
getChannelByTermidJoggle({ termid: this.deviceData.id })
.then((res) => {
console.log(res);
this.channelListOption = res.data.list;
})
.catch((err) => {
console.log(err); //
});
},
//
deleteTime(index) {
this.selectedIndex = index;
},
//
deleteSelectedTime() {
if (this.selectedIndex !== null) {
this.timeList.splice(this.selectedIndex, 1);
this.selectedIndex = null; //
}
},
//
addTimeList() {
this.timeInnerVisible = true;
},
//
formatTime(date) {
// "HH:mm"
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
return `${hours}:${minutes}`;
},
//
sureTime() {
console.log(this.timePointVal, this.presetVal);
//
const newTime = this.formatTime(this.timePointVal);
const newPreset = this.presetVal;
//
const isDuplicate = this.timeList.some(
(item) => item.time === newTime && item.preset === newPreset
);
// timeList
if (!isDuplicate) {
this.timeList.push({
time: newTime,
preset: newPreset,
});
} else {
this.$message({
duration: 1500,
showClose: true,
message: "重复的时间点和预置位,未添加到列表中",
type: "warning",
});
}
// console.log(this.timePointVal, this.presetVal);
// this.timeList.push({
// time: this.formatTime(this.timePointVal),
// preset: this.presetVal,
// });
this.timeInnerVisible = false;
},
//
surepickTime() {
//
const intervalMs = this.timeNum * 60 * 1000;
// timeValuestartOfDay
let currentTime = new Date(this.timeValue[0]);
// let currentTime = this.timeValue[0];
//
console.log(currentTime);
console.log(this.timeValue[0]);
console.log(this.timeValue[1]);
console.log(this.timeValue);
while (currentTime <= this.timeValue[1]) {
//
this.timeList.push({
time: this.formatTime(currentTime),
preset: this.presetspanVal,
});
//
currentTime.setTime(currentTime.getTime() + intervalMs);
}
//
console.log(this.timeList);
this.timeFrameVisible = false;
},
handleSetTimeClick() {
this.sureloading = true;
this.timeparams = [];
this.timeList.forEach((time) => {
//
this.timeparams.push({
time: time.time,
preset: time.preset,
});
});
this.timeparams = this.timeparams.reduce((acc, current) => {
const key = `${current.time}-${current.preset}`; //
if (!acc.some((item) => `${item.time}-${item.preset}` === key)) {
acc.push(current); //
}
return acc;
}, []);
console.log(this.timeparams);
this.getsetTimeFun();
},
getsetTimeFun() {
getTermStatus({ termId: this.deviceData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
console.log(this.channelVal, this.setNum, this.deviceData.protocol);
let params = [
{
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
},
{
name: "channel",
value: this.channelVal,
},
];
if (
this.deviceData.protocol == "65283" ||
this.deviceData.protocol == "65285" ||
this.deviceData.protocol == "65290" ||
this.deviceData.protocol == "65298"
) {
//
let timeArr = [];
console.log("我是其它,时间间隔");
console.log(this.timeValue);
console.log(this.timeNum);
var Stime = this.$moment(this.timeValue[0], "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
//
var Etime = this.$moment(this.timeValue[1], "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
var spanTime = this.timeNum;
let fistSpan = this.$moment(new Date())
.startOf("day")
.minutes(spanTime)
.format("YYYY-MM-DD HH:mm:ss");
timeArr.push(fistSpan, Stime, Etime);
console.log(timeArr);
let group = timeArr.length;
params.push({
name: "group",
value: group,
});
let timeArrList = [];
for (var k = 0; k < timeArr.length; k++) {
//console.log(moment(dayArr[k]).hour());
timeArrList.push({
hour: this.$moment(timeArr[k]).hour(),
minute: this.$moment(timeArr[k]).minute(),
preset: 255,
});
}
console.log(timeArrList);
for (let m = 0; m < timeArrList.length; m++) {
console.log(timeArrList[m]);
params.push(
{
name: "hour" + (m + 1),
value: timeArrList[m].hour,
},
{
name: "min" + (m + 1),
value: timeArrList[m].minute,
},
{
name: "preset" + (m + 1),
value: timeArrList[m].preset,
}
);
}
} else {
let group = this.timeparams.length;
params.push({
name: "group",
value: group,
});
//
for (let m = 0; m < this.timeparams.length; m++) {
console.log(this.timeparams[m].time);
let time = this.$moment(this.timeparams[m].time, "HH:mm"); // 使 moment
console.log(time);
params.push(
{
name: "hour" + (m + 1),
value: time.hour(),
},
{
name: "min" + (m + 1),
value: time.minute(),
},
{
name: "preset" + (m + 1),
value: this.timeparams[m].preset,
}
);
}
console.log(params);
let timeArrList = [];
for (var k = 0; k < this.timeparams.length; k++) {
//console.log(moment(dayArr[k]).hour());
console.log(this.timeparams[k].time);
let time = this.$moment(this.timeparams[k].time, "HH:mm"); // 使 moment
console.log(time);
timeArrList.push({
hour: time.hour(),
minute: time.minute(),
preset: this.timeparams[k].preset,
});
}
console.log(timeArrList);
var parmsobj = {
termid: this.deviceData.id,
channelid: this.channelVal,
list: timeArrList,
};
}
console.log(params);
this.setTermFnRule(params);
} else {
this.sureloading = false;
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
//
setTermFnRule(dataParams) {
setTermCamera({
termId: this.deviceData.id,
list: dataParams,
})
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
clearInterval(this.timer);
this.deviceTimer = window.setInterval(() => {
this.getinfoRules();
this.deviceNum++;
console.log(this.deviceNum, this.deviceNum * 1000);
}, 1000 * this.deviceNum);
})
.catch((err) => {});
},
getinfoRules() {
getTermCameraRequest({ requestid: this.requestid })
.then((res) => {
if (res.data.success == 1) {
this.sureloading = false;
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
console.log(JSON.parse(res.data.data));
this.$message({
duration: 1500,
showClose: true,
message: "时间表下发成功",
type: "success",
});
this.dialogVisible = false;
this.closeTimeFun();
} else if (this.deviceNum > 9) {
this.sureloading = false;
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
this.$message({
duration: 1500,
showClose: true,
message: "时间表下发失败",
type: "error",
});
this.dialogVisible = false;
this.closeTimeFun();
}
})
.catch((err) => {});
},
//
//
deviceTimeClick() {
console.log("点击了获取装置时间表");
this.timeloading = true;
if (this.deviceData.onlinestatus === 1) {
this.deviceTimeLoading = true;
let params = [
{
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 0,
},
{
name: "channel",
value: this.channelVal,
},
];
this.setTermFn(params);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
},
//
setTermFn(dataParams) {
console.log("点击了统一的接口", dataParams);
setTermCamera({
termId: this.deviceData.id,
list: dataParams,
})
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
//
if (this.deviceTimer) {
clearInterval(this.deviceTimer);
}
// getinfo
this.deviceTimer = window.setInterval(() => {
this.getinfo();
}, 1000);
})
.catch((err) => {
if (this.deviceTimer) {
clearInterval(this.deviceTimer);
this.deviceTimer = null;
}
});
},
//
getinfo() {
getTermCameraRequest({ requestid: this.requestid })
.then((res) => {
if (res.data.success == 1) {
this.deviceTimeLoading = false;
this.timeloading = false;
clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.attemptCount = 0; //
console.log(JSON.parse(res.data.data));
//this.deviceTimeList = JSON.parse(res.data.data).groupData;
this.processingData(JSON.parse(res.data.data).groupData); //
this.$message({
duration: 1500,
showClose: true,
message: "装置时间表已更新",
type: "success",
});
} else {
this.attemptCount++; // 1
if (this.attemptCount >= this.maxAttempts) {
//
clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceTimeLoading = false;
this.timeloading = false;
this.$message({
duration: 1500,
showClose: true,
message: "查询失败",
type: "error",
});
this.deviceTimeList = [];
}
}
})
.catch((err) => {});
},
//
processingData(val) {
console.log(this.deviceData.protocol);
if (
this.deviceData.protocol == "65283" ||
this.deviceData.protocol == "65285" ||
this.deviceData.protocol == "65290" ||
this.deviceData.protocol == "65298"
) {
//
console.log("湖南");
console.log(val);
var hnarr = [];
for (var i = 0; i < val.length; i++) {
if (i % 3 == 0) {
var hnobj = {};
hnobj.span = val[i].hour * 60 + val[i].minute;
console.log("时间间隔");
} else if (i % 3 == 1) {
console.log("开始时间");
console.log("a");
hnobj.startTime = this.$moment(val[i]).format("HH:mm");
} else if (i % 3 == 2) {
console.log("结束时间");
hnobj.endTime = this.$moment(val[i]).format("HH:mm");
hnarr.push(hnobj);
}
}
console.log("222222222222222222");
console.log(hnarr);
console.log("22222222222222222222222");
let dayArr = [];
//
for (let k = 0; k < hnarr.length; k++) {
console.log(hnarr[k].startTime);
console.log(hnarr[k].endTime);
console.log(hnarr[k].span);
let Stime = this.$moment(hnarr[k].startTime, "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
let Etime = this.$moment(hnarr[k].endTime, "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
let spanTime = hnarr[k].span;
if (this.$moment(Etime).isBefore(this.$moment(Stime))) {
let zeroEnd = this.$moment("23:59", "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
let zeroStart = this.$moment("00:00", "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
while (
this.$moment(Stime).isBefore(this.$moment(zeroEnd)) ||
this.$moment(Stime).isSame(this.$moment(zeroEnd))
) {
dayArr.push(Stime);
Stime = this.$moment(Stime)
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
while (
this.$moment(zeroStart).isBefore(this.$moment(Etime)) ||
this.$moment(zeroStart).isSame(this.$moment(Etime))
) {
dayArr.push(zeroStart);
zeroStart = this.$moment(zeroStart)
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
} else {
while (
this.$moment(Stime).isBefore(this.$moment(Etime)) ||
this.$moment(Stime).isSame(this.$moment(Etime))
) {
dayArr.push(Stime);
Stime = this.$moment(Stime)
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
}
// //
console.log(dayArr);
}
this.deviceTimeList = [...new Set(dayArr)];
} else {
//
this.deviceTimeList = val;
}
},
clearAllTime() {
this.timeList = [];
this.timeparams = [];
this.deviceTimeList = [];
this.selectedIndex = null;
},
closeTimeFun() {
this.dialogVisible = false;
this.timeList = [];
this.deviceTimeList = [];
this.timeparams = [];
this.selectedIndex = null;
},
},
};
</script>
<style lang="less">
.setTime {
.setBox {
.head {
display: flex;
align-items: center;
justify-content: space-between;
.left,
.right {
display: flex;
align-items: center;
}
h3 {
margin-bottom: 0px;
}
.channelDiv {
width: 120px;
margin-right: 12px;
}
.el-date-editor {
width: 220px;
}
.timespan {
margin-left: 12px;
}
.showList {
margin-left: 12px;
width: 90px !important;
margin-bottom: 0px !important;
}
.serachBtn {
margin-left: 8px !important;
width: 60px !important;
margin-bottom: 0px !important;
}
.timeTotal {
margin-left: 12px;
}
}
.contain {
height: 410px;
margin-top: 20px;
display: flex;
width: 100%;
.xfTime {
width: 670px;
display: flex;
border: 1px solid #e0e0e0;
border-radius: 4px;
box-sizing: border-box;
.timelist {
width: 530px;
border-right: 1px solid #e0e0e0;
padding: 12px;
padding-right: 0px;
ul {
display: flex;
flex-wrap: wrap;
align-content: flex-start; //
overflow: auto;
height: 390px;
//width: 60%;
li {
width: 174px;
list-style: none;
height: 40px;
line-height: 40px;
.el-input {
width: 80px;
margin-left: 12px;
}
}
}
}
.timeBtnGrop {
display: flex;
flex-direction: column;
margin-top: 12px;
.el-button {
width: 94px;
margin-left: 6px;
}
.xfsjbBtn {
justify-items: end;
margin-top: auto;
}
}
}
.tagsBox {
width: 390px;
margin-left: 20px;
overflow: auto;
height: 410px;
border: 1px solid #e0e0e0;
.el-tag {
margin-bottom: 12px;
margin-right: 12px;
}
}
}
}
}
.timeinnerClass {
.timePoint {
.timeinput {
display: flex;
align-items: center;
margin-bottom: 12px;
h3 {
font-weight: normal;
width: 80px;
}
}
.timepick {
.el-date-editor {
width: 220px;
}
}
.timeSpan {
display: flex;
align-items: center;
margin-bottom: 12px;
h3 {
font-weight: normal;
width: 80px;
}
}
.timeprt {
display: flex;
align-items: center;
h3 {
font-weight: normal;
width: 80px;
}
.el-input {
width: 220px;
}
}
}
}
</style>

@ -0,0 +1,676 @@
<template>
<div class="setTime">
<el-dialog
title="选择拍照时间表"
:visible.sync="dialogVisible"
width="1100px"
>
<div class="setBox">
<div class="head">
<h3>通道</h3>
<el-select
v-model="channelVal"
placeholder="请选择通道"
ref="multiSelect"
class="channelDiv"
>
<el-option
v-for="item in channelListOption"
:key="item.channelid"
:label="
item.alias !== null && item.alias !== ''
? item.alias
: item.channelname
"
:value="item.channelid"
>
{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelname
}}
</el-option>
</el-select>
<!-- <el-select
v-model="channelVal"
placeholder="请选择"
class="channelDiv"
>
<el-option
v-for="item in channelOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select> -->
<h3>预置位</h3>
<el-select
v-model="presetVal"
placeholder="请选择"
class="channelDiv"
filterable
>
<el-option
v-for="n in 255"
:key="n"
:label="n"
:value="n"
></el-option>
</el-select>
<h3>选择时间段</h3>
<el-time-picker
is-range
v-model="timeValue"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
>
</el-time-picker>
<h3 class="timespan">时间间隔</h3>
<el-input-number v-model="timeNum"></el-input-number>
<el-button type="primary" class="showList" @click="showTimeList"
>时间列表</el-button
>
<el-button type="primary" class="serachBtn" @click="deviceTimeClick"
>查询</el-button
>
</div>
<div class="contain">
<ul>
<li v-for="(time, index) in timeList" :key="index">
{{ formatTime(time) }}
<el-input
v-if="
deviceData.protocol != '65283' &&
deviceData.protocol != '65285' &&
deviceData.protocol != '65290' &&
deviceData.protocol != '65298'
"
v-model="selectedValues[index]"
placeholder="请输入"
></el-input>
</li>
</ul>
<div class="tagsBox" v-if="deviceTimeList.length !== 0">
<el-tag v-for="(item, index) in deviceTimeList" :key="index"
>时间点{{ $moment(item).format("HH:mm") }} + 预置位:
{{ item.preset || 255 }}</el-tag
>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="closeTimeFun"> </el-button>
<el-button type="primary" @click="handleSetTimeClick"
>下发时间表</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import {
getChannelByTermidJoggle,
getTermStatus,
setTermCamera,
getTermCameraRequest,
} from "@/utils/api/index";
export default {
data() {
return {
deviceData: "", //
dialogVisible: false,
timeValue: [], //
timeNum: 30, //
timeList: [], //
channelVal: 1,
channelListOption: [], //
// channelOptions: [
// {
// value: 1,
// label: "1",
// },
// {
// value: 2,
// label: "2",
// },
// ],
selectedValues: [], //
presetVal: 1, //
timeparams: [], //
deviceTimer: null, //
deviceNum: 1, //
deviceTimeList: [],
attemptCount: 0, //
maxAttempts: 9, //
};
},
mounted() {
//
let today = new Date();
//
let startOfDay = new Date(today);
startOfDay.setHours(0, 0, 0, 0); // 0
// 235959
let endOfDay = new Date(today);
endOfDay.setHours(23, 59, 59, 999); // 235959999
// value1
this.timeValue = [startOfDay, endOfDay];
},
methods: {
display(val) {
this.dialogVisible = true;
this.deviceData = val;
console.log(this.deviceData);
this.getChannelList();
},
//
getChannelList() {
console.log(this.deviceData);
getChannelByTermidJoggle({ termid: this.deviceData.id })
.then((res) => {
console.log(res);
this.channelListOption = res.data.list;
})
.catch((err) => {
console.log(err); //
});
},
showTimeList() {
//
this.timeList = [];
//
const intervalMs = this.timeNum * 60 * 1000;
// timeValuestartOfDay
let currentTime = new Date(this.timeValue[0]);
//
while (currentTime <= this.timeValue[1]) {
//
this.timeList.push(new Date(currentTime));
//
currentTime.setTime(currentTime.getTime() + intervalMs);
}
//
console.log(this.timeList.map(this.formatTime));
console.log(this.presetVal);
this.selectedValues = this.timeList.map(() => this.presetVal);
},
formatTime(date) {
// "HH:mm"
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
return `${hours}:${minutes}`;
},
handleSetTimeClick() {
this.timeparams = [];
this.timeList.forEach((time, index) => {
if (this.selectedValues[index] !== undefined) {
//
this.timeparams.push({
time: this.formatTime(time),
preset: this.selectedValues[index],
});
}
});
console.log(this.timeparams);
this.getsetTimeFun();
},
getsetTimeFun() {
getTermStatus({ termId: this.deviceData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
console.log(this.channelVal, this.setNum, this.deviceData.protocol);
let params = [
{
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
},
{
name: "channel",
value: this.channelVal,
},
];
if (
this.deviceData.protocol == "65283" ||
this.deviceData.protocol == "65285" ||
this.deviceData.protocol == "65290" ||
this.deviceData.protocol == "65298"
) {
//
let timeArr = [];
console.log("我是其它,时间间隔");
console.log(this.timeValue);
console.log(this.timeNum);
var Stime = this.$moment(this.timeValue[0], "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
//
var Etime = this.$moment(this.timeValue[1], "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
var spanTime = this.timeNum;
let fistSpan = this.$moment(new Date())
.startOf("day")
.minutes(spanTime)
.format("YYYY-MM-DD HH:mm:ss");
timeArr.push(fistSpan, Stime, Etime);
console.log(timeArr);
let group = timeArr.length;
params.push({
name: "group",
value: group,
});
let timeArrList = [];
for (var k = 0; k < timeArr.length; k++) {
//console.log(moment(dayArr[k]).hour());
timeArrList.push({
hour: this.$moment(timeArr[k]).hour(),
minute: this.$moment(timeArr[k]).minute(),
preset: 255,
});
}
console.log(timeArrList);
for (let m = 0; m < timeArrList.length; m++) {
console.log(timeArrList[m]);
params.push(
{
name: "hour" + (m + 1),
value: timeArrList[m].hour,
},
{
name: "min" + (m + 1),
value: timeArrList[m].minute,
},
{
name: "preset" + (m + 1),
value: timeArrList[m].preset,
}
);
}
} else {
let group = this.timeparams.length;
params.push({
name: "group",
value: group,
});
//
for (let m = 0; m < this.timeparams.length; m++) {
console.log(this.timeparams[m].time);
let time = this.$moment(this.timeparams[m].time, "HH:mm"); // 使 moment
console.log(time);
params.push(
{
name: "hour" + (m + 1),
value: time.hour(),
},
{
name: "min" + (m + 1),
value: time.minute(),
},
{
name: "preset" + (m + 1),
value: this.timeparams[m].preset,
}
);
}
console.log(params);
let timeArrList = [];
for (var k = 0; k < this.timeparams.length; k++) {
//console.log(moment(dayArr[k]).hour());
console.log(this.timeparams[k].time);
let time = this.$moment(this.timeparams[k].time, "HH:mm"); // 使 moment
console.log(time);
timeArrList.push({
hour: time.hour(),
minute: time.minute(),
preset: this.timeparams[k].preset,
});
}
console.log(timeArrList);
var parmsobj = {
termid: this.deviceData.id,
channelid: this.channelVal,
list: timeArrList,
};
}
console.log(params);
this.setTermFnRule(params);
} else {
this.sureloading = false;
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
//
setTermFnRule(dataParams) {
setTermCamera({
termId: this.deviceData.id,
list: dataParams,
})
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
clearInterval(this.timer);
this.deviceTimer = window.setInterval(() => {
this.getinfoRules();
this.deviceNum++;
console.log(this.deviceNum, this.deviceNum * 1000);
}, 1000 * this.deviceNum);
})
.catch((err) => {});
},
getinfoRules() {
getTermCameraRequest({ requestid: this.requestid })
.then((res) => {
if (res.data.success == 1) {
this.sureloading = false;
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
console.log(JSON.parse(res.data.data));
this.isShowset = false;
this.$message({
duration: 1500,
showClose: true,
message: "时间表下发成功",
type: "success",
});
this.dialogVisible = false;
} else if (this.deviceNum > 9) {
this.sureloading = false;
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
this.failedFlag = true;
this.$message({
duration: 1500,
showClose: true,
message: "时间表下发失败",
type: "error",
});
this.dialogVisible = false;
}
})
.catch((err) => {});
},
//
deviceTimeClick() {
console.log("点击了获取装置时间表");
if (this.deviceData.onlinestatus === 1) {
this.deviceTimeLoading = true;
let params = [
{
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 0,
},
{
name: "channel",
value: this.channelVal,
},
];
this.setTermFn(params);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
},
//
setTermFn(dataParams) {
console.log("点击了统一的接口", dataParams);
setTermCamera({
termId: this.deviceData.id,
list: dataParams,
})
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
//
if (this.deviceTimer) {
clearInterval(this.deviceTimer);
}
// getinfo
this.deviceTimer = window.setInterval(() => {
this.getinfo();
}, 1000);
})
.catch((err) => {
if (this.deviceTimer) {
clearInterval(this.deviceTimer);
this.deviceTimer = null;
}
});
},
//
getinfo() {
getTermCameraRequest({ requestid: this.requestid })
.then((res) => {
if (res.data.success == 1) {
this.deviceTimeLoading = false;
clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.attemptCount = 0; //
console.log(JSON.parse(res.data.data));
//this.deviceTimeList = JSON.parse(res.data.data).groupData;
this.processingData(JSON.parse(res.data.data).groupData); //
this.$message({
duration: 1500,
showClose: true,
message: "装置时间表已更新",
type: "success",
});
} else {
this.attemptCount++; // 1
if (this.attemptCount >= this.maxAttempts) {
//
clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceTimeLoading = false;
this.$message({
duration: 1500,
showClose: true,
message: "查询失败",
type: "error",
});
}
}
})
.catch((err) => {});
},
//
processingData(val) {
console.log(this.deviceData.protocol);
if (
this.deviceData.protocol == "65283" ||
this.deviceData.protocol == "65285" ||
this.deviceData.protocol == "65290" ||
this.deviceData.protocol == "65298"
) {
//
console.log("湖南");
console.log(val);
var hnarr = [];
for (var i = 0; i < val.length; i++) {
if (i % 3 == 0) {
var hnobj = {};
hnobj.span = val[i].hour * 60 + val[i].minute;
console.log("时间间隔");
} else if (i % 3 == 1) {
console.log("开始时间");
console.log("a");
hnobj.startTime = this.$moment(val[i]).format("HH:mm");
} else if (i % 3 == 2) {
console.log("结束时间");
hnobj.endTime = this.$moment(val[i]).format("HH:mm");
hnarr.push(hnobj);
}
}
console.log("222222222222222222");
console.log(hnarr);
console.log("22222222222222222222222");
let dayArr = [];
//
for (let k = 0; k < hnarr.length; k++) {
console.log(hnarr[k].startTime);
console.log(hnarr[k].endTime);
console.log(hnarr[k].span);
let Stime = this.$moment(hnarr[k].startTime, "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
let Etime = this.$moment(hnarr[k].endTime, "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
let spanTime = hnarr[k].span;
if (this.$moment(Etime).isBefore(this.$moment(Stime))) {
let zeroEnd = this.$moment("23:59", "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
let zeroStart = this.$moment("00:00", "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
while (
this.$moment(Stime).isBefore(this.$moment(zeroEnd)) ||
this.$moment(Stime).isSame(this.$moment(zeroEnd))
) {
dayArr.push(Stime);
Stime = this.$moment(Stime)
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
while (
this.$moment(zeroStart).isBefore(this.$moment(Etime)) ||
this.$moment(zeroStart).isSame(this.$moment(Etime))
) {
dayArr.push(zeroStart);
zeroStart = this.$moment(zeroStart)
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
} else {
while (
this.$moment(Stime).isBefore(this.$moment(Etime)) ||
this.$moment(Stime).isSame(this.$moment(Etime))
) {
dayArr.push(Stime);
Stime = this.$moment(Stime)
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
}
// //
console.log(dayArr);
}
this.deviceTimeList = [...new Set(dayArr)];
} else {
//
this.deviceTimeList = val;
}
},
closeTimeFun() {
this.dialogVisible = false;
this.timeList = [];
this.deviceTimeList = [];
},
},
};
</script>
<style lang="less">
.setTime {
.setBox {
.head {
display: flex;
align-items: center;
//justify-content: space-around;
h3 {
margin-bottom: 0px;
}
.channelDiv {
width: 120px;
margin-right: 12px;
}
.el-date-editor {
width: 220px;
}
.timespan {
margin-left: 12px;
}
.showList {
margin-left: 12px;
width: 90px !important;
margin-bottom: 0px !important;
}
.serachBtn {
margin-left: 8px !important;
width: 60px !important;
margin-bottom: 0px !important;
}
}
.contain {
height: 410px;
margin-top: 20px;
display: flex;
ul {
display: flex;
flex-wrap: wrap;
align-content: flex-start; //
overflow: auto;
height: 410px;
width: 60%;
li {
width: 200px;
list-style: none;
height: 40px;
line-height: 40px;
.el-input {
width: 80px;
margin-left: 12px;
}
}
}
.tagsBox {
width: 40%;
overflow: auto;
height: 410px;
.el-tag {
margin-bottom: 12px;
margin-right: 12px;
}
}
}
}
}
</style>

@ -0,0 +1,22 @@
<template>
<div class="yuntaiBox">
<el-button type="primary" @click="handleSetptz"> </el-button>
<ptzDraw ref="ptzDrawer_ref"></ptzDraw>
</div>
</template>
<script>
import ptzDraw from "./ptzDraw.vue";
export default {
components: { ptzDraw },
data() {
return {};
},
methods: {
handleSetptz() {
console.log("设置云台");
this.$refs.ptzDrawer_ref.display();
},
},
};
</script>
<style lang="less"></style>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,34 @@
<template>
<div class="buttonBox">
<el-button type="primary" @click="handleSetChannel">APP </el-button>
<setAppDialog ref="setChannelDialog_ref"></setAppDialog>
</div>
</template>
<script>
import {} from "@/utils/api/index";
import setAppDialog from "./setAppDialog.vue";
export default {
components: { setAppDialog },
data() {
return {};
},
watch: {},
mounted() {},
computed: {
termId() {
return this.$store.state.termId;
},
channelIdList() {
return this.$store.state.channelIdList;
},
},
methods: {
handleSetChannel() {
this.$refs.setChannelDialog_ref.display();
},
},
destroyed() {},
beforeRouteLeave(to, from, next) {},
};
</script>

@ -0,0 +1,711 @@
<template>
<el-dialog
class="setAppDialog"
title="App设置"
:visible.sync="isShow"
:close-on-click-modal="false"
width="880px"
@close="handleclose"
>
<div class="zzinfo">
装置编号{{ areaData.name }}
<el-button type="text" icon="el-icon-refresh" @click="searchBtn"
>刷新</el-button
>
</div>
<div class="channelsetBox" v-loading="appsetLoading">
<el-form ref="form" :model="appForm" label-width="160px">
<el-form-item label="装置编号">
<el-input v-model="appForm.CMDID"></el-input>
</el-form-item>
<el-form-item label="装置通道数">
<el-input v-model="appForm.channels"></el-input>
</el-form-item>
<el-form-item label="装置型号 ">
<el-input v-model="appForm.model"></el-input>
</el-form-item>
<el-form-item label="装置名称">
<el-input v-model="appForm.equipName"></el-input>
</el-form-item>
<el-form-item label="生产厂家">
<el-input v-model="appForm.bsManufacturer"></el-input>
</el-form-item>
<el-form-item label="生产日期">
<el-date-picker
v-model="appForm.productionDate"
value-format="timestamp"
type="date"
placeholder="选择日期"
@focus="handleFocus"
>
</el-date-picker>
</el-form-item>
<el-form-item label="图像质量">
<el-input v-model="appForm.imgQuality"></el-input>
<!-- <span class="infoSpan">(0-100的整数)</span> -->
</el-form-item>
<el-form-item label="心跳周期" class="heartClass">
<el-input v-model="appForm.heartbeat"></el-input>
<span class="infoSpan">()</span>
</el-form-item>
<el-form-item label="工作状态报周期" class="workClass">
<el-input-number
:min="1"
:max="1024"
v-model="appForm.workStatusTimes"
></el-input-number>
<span class="infoSpan">()[1,1024]</span>
</el-form-item>
<!-- <el-form-item label="参数设置">
<el-checkbox
label="报文子包起始号"
v-model="appForm.usbchecked"
></el-checkbox>
</el-form-item> -->
<el-form-item label="报文子包起始号">
<el-select v-model="appForm.upgradePacketBase" placeholder="请选择">
<el-option
v-for="item in PacketBaseOptions"
:key="item.id"
:label="item.value"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="规约">
<el-select v-model="appForm.protocol" placeholder="请选择">
<el-option
v-for="item in protocolOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="网络协议">
<el-radio-group
v-model="appForm.networkProtocol"
@input="changenetwork"
>
<el-radio
v-for="item in netWorkList"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="CMA服务器ip">
<el-input v-model="appForm.server"></el-input>
</el-form-item>
<el-form-item>
<el-checkbox
label="故障上报"
v-model="appForm.reportFault"
></el-checkbox>
<el-checkbox
label="输出调试信息"
v-model="appForm.outputDbgInfo"
></el-checkbox>
</el-form-item>
<el-form-item label="CMA服务器端口" class="cmaClass">
<el-input v-model="appForm.port"></el-input>
<span class="infoSpan">(1025-65535)</span>
</el-form-item>
<el-form-item label="图像数据分包大小" class="packetClass">
<el-input v-model="appForm.packetSize"></el-input>
</el-form-item>
<el-form-item label="日志保留时间" class="packetClass">
<el-input v-model="appForm.timeForKeepingLogs"></el-input>
<span class="infoSpan">()</span>
</el-form-item>
<el-form-item label="未上传图像的保留时间" class="packetClass">
<el-input v-model="appForm.timeForKeepingPhotos"></el-input>
<span class="infoSpan">()</span>
</el-form-item>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="handleclose" :disabled="appsetLoading"
> </el-button
>
<el-button
type="primary"
:disabled="appsetLoading"
@click="handleConfim"
:loading="appLoading"
> </el-button
>
</div>
</el-dialog>
</template>
<script>
import {
getChannelListJoggle,
getTermStatus,
setTermCamera,
getTermCameraRequest,
} from "@/utils/api/index";
export default {
props: {},
data() {
return {
appsetLoading: true,
isShow: false,
appLoading: false,
netWorkList: [
{
value: 0,
label: "tcp",
},
{
value: 1,
label: "udp",
},
], //
appForm: {
channels: 4, //,4
packetSize: 2048, //
timeForKeepingLogs: 15, //1*86400-45*86400 15*86400
timeForKeepingPhotos: 15, //1*86400-45*86400 15*86400
imgQuality: "", //
heartbeat: 10, //
upgradePacketBase: 0, // 01
protocol: "", // ...
networkProtocol: 1, // 0: tcp 1 udp
//network: "", // 使
CMDID: "", //
server: "", // CMA ip
port: "", // CMA 1025-65535
model: "", //
equipName: "", //
bsManufacturer: "", //
productionDate: "", //
workStatusTimes: 3,
reportFault: "", //
outputDbgInfo: "", //
},
protocolOptions: [
{
id: 65280,
name: "国网I1",
},
{
id: 65296,
name: "陕西",
},
{
id: 65281,
name: "安徽",
},
{
id: 65282,
name: "江苏",
},
{
id: 65283,
name: "湖南",
},
{
id: 65284,
name: "浙江",
},
{
id: 65285,
name: "河南全景",
},
{
id: 65286,
name: "河南郑州",
},
{
id: 65298,
name: "宁夏",
},
{
id: 2,
name: "南网",
},
{
id: 65290,
name: "河南统一视频v2020",
},
],
PacketBaseOptions: [
{
id: 0,
value: 0,
},
{
id: 1,
value: 1,
},
],
requestid: "",
searchNum: 0,
searchTimer: null,
setNum: 0,
setTimer: null,
};
},
computed: {
areaData() {
return this.$store.state.currentData;
},
},
mounted() {
// this.appForm.zzbh = this.areaData.cmdid;
this.appForm.timeForKeepingPhotos =
this.appForm.timeForKeepingPhotos * 86400;
this.appForm.timeForKeepingLogs = this.appForm.timeForKeepingLogs * 86400;
// this.appForm.aival = this.aiOptions[0].value;
},
methods: {
handleFocus() {
if (this.appForm.productionDate == "") {
this.appForm.productionDate = new Date();
}
},
changenetwork() {
console.log(this.appForm.networkProtocol);
},
handleConfim() {
console.log("点击了确定");
console.log(this.appForm);
this.appLoading = true;
//--act=cfg --udp=1 --cmdid=XY-ANDROIDSIM-002 --pathType=1 --updateType=0 --path=data/channels/1.json --configs=3 --name1=osd.leftTop --type1=1 --value1="OSD for LeftTop %%CH%%" --name2=osd.rightTop --type2=255 --value2="OSD for rIGHTTop %%CH%%" --name3=usbCamera --type3=0 --value3=1 --clientid=5 --reqid=TS
getTermStatus({ termId: this.areaData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
let params = [
{
name: "act",
value: "cfg",
},
{
name: "udp",
value: 1,
},
{
name: "reboot",
value: 1,
},
{
name: "pathType",
value: 1,
},
{
name: "updateType",
value: 1,
},
{
name: "path",
value: "data/App.json",
},
{
name: "configs",
value: 19,
},
//
{ name: "name1", value: "channels" },
{ name: "value1", value: this.appForm.channels },
{ name: "type1", value: 0 },
//
{ name: "name2", value: "packetSize" },
{ name: "value2", value: this.appForm.packetSize },
{ name: "type2", value: 0 },
// 15
{ name: "name3", value: "timeForKeepingLogs" },
{ name: "value3", value: this.appForm.timeForKeepingLogs * 86400 },
{ name: "type3", value: 0 },
//
{ name: "name4", value: "timeForKeepingPhotos" },
{
name: "value4",
value: this.appForm.timeForKeepingPhotos * 86400,
},
{ name: "type4", value: 0 },
//
{ name: "name5", value: "imgQuality" },
{ name: "value5", value: this.appForm.imgQuality },
{ name: "type5", value: 0 },
// ...
{ name: "name6", value: "protocol" },
{ name: "value6", value: this.appForm.protocol },
{ name: "type6", value: 0 },
// 0: tcp 1 udp
{ name: "name7", value: "networkProtocol" },
{ name: "value7", value: this.appForm.networkProtocol },
{ name: "type7", value: 0 },
//
{ name: "name8", value: "CMDID" },
{ name: "value8", value: this.appForm.CMDID },
{ name: "type8", value: 1 },
//CMA ip
{ name: "name9", value: "server" },
{ name: "value9", value: this.appForm.server },
{ name: "type9", value: 1 },
//CMA 1025-65535
{ name: "name10", value: "port" },
{ name: "value10", value: this.appForm.port },
{ name: "type10", value: 0 },
//
{ name: "name11", value: "model" },
{ name: "value11", value: this.appForm.model },
{ name: "type11", value: 1 },
//EquipName
{ name: "name12", value: "equipName" },
{ name: "value12", value: this.appForm.equipName },
{ name: "type12", value: 1 },
//BsManufacturer
{ name: "name13", value: "bsManufacturer" },
{ name: "value13", value: this.appForm.bsManufacturer },
{ name: "type13", value: 1 },
//productionDate
{ name: "name14", value: "productionDate" },
{
name: "value14",
value: Math.round(this.appForm.productionDate / 1000),
},
{ name: "type14", value: 0 },
//
{ name: "name15", value: "heartbeat" },
{ name: "value15", value: this.appForm.heartbeat },
{ name: "type15", value: 0 },
//
{ name: "name16", value: "upgradePacketBase" },
{ name: "value16", value: this.appForm.upgradePacketBase },
{ name: "type16", value: 0 },
//
{ name: "name17", value: "workStatusTimes" },
{ name: "value17", value: this.appForm.workStatusTimes },
{ name: "type17", value: 0 },
//
{ name: "name18", value: "reportFault" },
{ name: "value18", value: this.appForm.reportFault ? 1 : 0 },
{ name: "type18", value: 0 },
{ name: "name19", value: "outputDbgInfo" },
{ name: "value19", value: this.appForm.outputDbgInfo ? 1 : 0 },
{ name: "type19", value: 0 },
];
this.setTermFn(params);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
setTermFn(val) {
setTermCamera({
termId: this.areaData.id,
list: val,
})
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
this.getTakechannelStatus();
clearInterval(this.setTimer);
this.setTimer = window.setInterval(() => {
this.getTakechannelStatus();
this.setNum++;
}, 1000);
})
.catch((err) => {});
},
getTakechannelStatus() {
getTermCameraRequest({ requestid: this.requestid })
.then((res) => {
console.log(res);
if (res.data.success == 1) {
window.clearInterval(this.setTimer);
this.setTimer = null;
this.setNum = 0;
this.isShow = false;
this.appLoading = false;
this.$message({
duration: 1500,
showClose: true,
message: "设置成功",
type: "success",
});
} else if (this.setNum > 3) {
// this.isShow = false;
window.clearInterval(this.setTimer);
this.setTimer = null;
this.setNum = 0;
this.appLoading = false;
this.$message({
duration: 1500,
showClose: true,
message: "设置失败",
type: "error",
});
}
})
.catch((err) => {});
},
searchBtn() {
this.appsetLoading = true;
//--act=cfg --udp=1 --cmdid=XY-ANDROIDSIM-002 --pathType=1 --updateType=0 --path=data/channels/1.json --configs=3 --name1=osd.leftTop --type1=1 --value1="OSD for LeftTop %%CH%%" --name2=osd.rightTop --type2=255 --value2="OSD for rIGHTTop %%CH%%" --name3=usbCamera --type3=0 --value3=1 --clientid=5 --reqid=TS
getTermStatus({ termId: this.areaData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
let params = [
{
name: "act",
value: "cfg",
},
{
name: "udp",
value: 1,
},
{
name: "pathType",
value: 1,
},
{
name: "updateType",
value: 0,
},
{
name: "path",
value: "data/App.json",
},
];
console.log(params);
this.searchTermFn(params);
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
searchTermFn(val) {
setTermCamera({
termId: this.areaData.id,
list: val,
})
.then((res) => {
console.log(res);
this.requestid = res.data.requestId;
this.getsearchchannelStatus();
clearInterval(this.searchTimer);
this.searchTimer = window.setInterval(() => {
this.getsearchchannelStatus();
this.searchNum++;
}, 1000);
})
.catch((err) => {});
},
getsearchchannelStatus() {
getTermCameraRequest({ requestid: this.requestid })
.then((res) => {
console.log(res);
if (res.data.success == 1) {
window.clearInterval(this.searchTimer);
this.searchTimer = null;
this.searchNum = 0;
this.appsetLoading = false;
console.log(res.data);
console.log(JSON.parse(res.data.data));
const resultData = JSON.parse(res.data.data);
if (resultData.hasOwnProperty("content")) {
const resultContent = JSON.parse(
decodeURIComponent(escape(window.atob(resultData.content)))
);
console.log(resultContent);
this.appForm.channels = resultContent.channels; //,4
this.appForm.packetSize = resultContent.packetSize; //
this.appForm.timeForKeepingLogs =
resultContent.timeForKeepingLogs !== undefined
? resultContent.timeForKeepingLogs / 86400
: ""; //1*86400-45*86400 15*86400
this.appForm.timeForKeepingPhotos =
resultContent.timeForKeepingPhotos !== undefined
? resultContent.timeForKeepingPhotos / 86400
: ""; //1*86400-45*86400 15*86400
this.appForm.imgQuality = resultContent.imgQuality; //
this.appForm.heartbeat = resultContent.heartbeat; //
this.appForm.upgradePacketBase = resultContent.upgradePacketBase; // 01
this.appForm.protocol = resultContent.protocol; // ...
this.appForm.networkProtocol = resultContent.networkProtocol; // 0: tcp 1 udp
// this.appForm.network = resultContent.network; // 使
this.appForm.CMDID = resultContent.CMDID; //
this.appForm.server = resultContent.server; // CMA ip
this.appForm.port = resultContent.port; // CMA 1025-65535
this.appForm.model = resultContent.model; //
this.appForm.equipName = resultContent.equipName; //
this.appForm.bsManufacturer = resultContent.bsManufacturer; //
this.appForm.productionDate = resultContent.productionDate * 1000; //
this.appForm.workStatusTimes = resultContent.workStatusTimes; //
this.appForm.reportFault =
resultContent.reportFault == 1 ? true : false; //
this.appForm.outputDbgInfo =
resultContent.outputDbgInfo == 1 ? true : false; //
console.log(this.appForm.outputDbgInfo);
console.log(resultContent.outputDbgInfo);
} else {
this.appForm.channels = 4; //,4
this.appForm.packetSize = 2048; //
this.appForm.timeForKeepingLogs = 15; //1*86400-45*86400 15*86400
this.appForm.timeForKeepingPhotos = 15; //1*86400-45*86400 15*86400
this.appForm.imgQuality = ""; //
this.appForm.heartbeat = 10; //
this.appForm.upgradePacketBase = 0; // 01
this.appForm.protocol = this.areaData.protocol; // ...
this.appForm.networkProtocol = 0; // 0: tcp 1 udp
// this.appForm.network = resultContent.network; // 使
this.appForm.CMDID = this.areaData.cmdid; //
this.appForm.server = ""; // CMA ip
this.appForm.port = ""; // CMA 1025-65535
this.appForm.model = ""; //
this.appForm.equipName = ""; //
this.appForm.bsManufacturer = ""; //
this.appForm.productionDate = ""; //
this.appForm.productionDate = 3; //
this.appForm.reportFault = ""; //
this.appForm.outputDbgInfo = ""; //
}
this.$message({
duration: 1500,
showClose: true,
message: "查询成功",
type: "success",
});
} else if (this.searchNum > 3) {
// this.isShow = false;
// this.channelLoading = false;
window.clearInterval(this.searchTimer);
this.searchTimer = null;
this.searchNum = 0;
this.appsetLoading = false;
this.$message({
duration: 1500,
showClose: true,
message: "查询失败",
type: "error",
});
}
})
.catch((err) => {});
},
display() {
this.isShow = true;
this.appForm.CMDID = this.areaData.cmdid;
this.searchBtn();
console.log(this.areaData);
},
handleclose() {
this.isShow = false;
this.bgflag = false;
this.appLoading = false;
this.appForm.channels = 4; //,4
this.appForm.packetSize = 2048; //
this.appForm.timeForKeepingLogs = 15; //1*86400-45*86400 15*86400
this.appForm.timeForKeepingPhotos = 15; //1*86400-45*86400 15*86400
this.appForm.imgQuality = ""; //
this.appForm.heartbeat = 10; //
this.appForm.upgradePacketBase = 0; // 01
this.appForm.protocol = this.areaData.protocol; // ...
this.appForm.networkProtocol = 0; // 0: tcp 1 udp
// this.appForm.network = resultContent.network; // 使
this.appForm.CMDID = this.areaData.cmdid; //
this.appForm.server = ""; // CMA ip
this.appForm.port = ""; // CMA 1025-65535
this.appForm.model = ""; //
this.appForm.equipName = ""; //
this.appForm.bsManufacturer = ""; //
this.appForm.productionDate = ""; //
this.appForm.productionDate = 3; //
this.appForm.reportFault = ""; //
this.appForm.outputDbgInfo = ""; //
window.clearInterval(this.searchTimer);
this.searchTimer = null;
this.searchNum = 0;
},
},
};
</script>
<style lang="less">
.setAppDialog {
.zzinfo {
position: absolute;
top: 22px;
left: 120px;
}
.el-form {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.el-dialog__body {
padding-bottom: 0px;
.el-form-item--small.el-form-item {
margin-bottom: 12px;
}
.channelsetBox {
width: 100%;
.el-input {
width: 250px;
}
}
.infoSpan {
margin-left: 8px;
}
.heartClass {
.el-input {
width: 190px;
}
}
.workClass {
.el-input {
width: 100%;
}
span {
}
}
.cmaClass {
.el-input {
width: 180px;
}
}
.packetClass {
.el-input {
width: 200px;
}
}
}
.dialog-footer {
.el-button--default,
.el-button--primary {
width: 80px !important;
margin-bottom: 0px !important;
}
.el-button + .el-button {
margin-left: 10px !important;
}
}
}
</style>

@ -0,0 +1,34 @@
<template>
<div class="buttonBox">
<el-button type="primary" @click="handleSetChannel"> </el-button>
<setChannelDialog ref="setChannelDialog_ref"></setChannelDialog>
</div>
</template>
<script>
import {} from "@/utils/api/index";
import setChannelDialog from "./setChannelDialog.vue";
export default {
components: { setChannelDialog },
data() {
return {};
},
watch: {},
mounted() {},
computed: {
termId() {
return this.$store.state.termId;
},
channelIdList() {
return this.$store.state.channelIdList;
},
},
methods: {
handleSetChannel() {
this.$refs.setChannelDialog_ref.display();
},
},
destroyed() {},
beforeRouteLeave(to, from, next) {},
};
</script>

@ -7,7 +7,7 @@
width="1000px"
@close="handleclose"
>
<div class="zzinfo">装置编号{{ areaData.cmdid }}</div>
<div class="zzinfo">装置编号{{ areaData.name }}</div>
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
<el-tab-pane label="拍照时间表查询" name="1">
<div class="searchTime">
@ -35,10 +35,19 @@
}}
</el-option>
</el-select>
<el-button class="clearButton" type="primary" @click="clearTimeGrop"
>清除拍照时间表</el-button
>
</div>
<div class="timeContain">
<div class="timeLeft" v-loading="baseTimeLoading">
<h3>时间表({{ baseTimeList.length }})</h3>
<h3>
时间表({{ baseTimeList.length }})
<span v-if="baseTimeList.length !== 0 && offsetNumTime !== null"
>偏移量{{ offsetNumTime }}分钟</span
>
</h3>
<div class="tagsBox" v-if="baseTimeList.length !== 0">
<el-tag v-for="(item, index) in baseTimeList" :key="index"
>{{ $moment(item).format("HH:mm") }}
@ -51,22 +60,22 @@
<div class="timeRight" v-loading="deviceTimeLoading">
<h3>
装置时间表({{ deviceTimeList.length }})
<span
v-if="deviceTimeList.length !== 0 && offsetNumTime !== null"
>偏移量{{ offsetNumTime }}分钟</span
<span v-if="deviceTimeList.length !== 0"
><el-button type="text" size="mini" @click="deviceTimeClick"
><i class="el-icon-refresh"></i>刷新装置时间表</el-button
></span
>
<el-button v-else type="primary" @click="deviceTimeClick"
>装置时间表</el-button
>
</h3>
<div class="tagsBox" v-if="deviceTimeList.length !== 0">
<el-tag v-for="(item, index) in deviceTimeList" :key="index">{{
$moment(item).format("HH:mm")
}}</el-tag>
<el-tag v-for="(item, index) in deviceTimeList" :key="index"
>{{ $moment(item).format("HH:mm") }}+{{ item.preset }}</el-tag
>
</div>
<div class="nodata" v-else>
<el-empty description="暂无数据">
<el-button type="primary" @click="deviceTimeClick"
>装置时间表</el-button
>
</el-empty>
<el-empty description="暂无数据"> </el-empty>
</div>
</div>
</div>
@ -189,8 +198,9 @@
<el-input-number
v-model="setNum"
:min="0"
:max="9"
:max="minTimeSpan"
></el-input-number>
{{ minTimeSpan }}
</div>
</div>
<div class="ruleinfo">
@ -211,6 +221,7 @@
</el-radio-group>
</div>
</div>
<p class="fail" v-show="failedFlag">,</p>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closebtn"> </el-button>
@ -232,6 +243,7 @@ import {
setTermCamera,
getTermCameraRequest,
getTermStatus,
setScheduleRulel,
} from "@/utils/api/index";
export default {
props: {
@ -251,6 +263,7 @@ export default {
deviceTimer: null, //
deviceNum: 1, //
offsetTime: 0, //
minTimeSpan: "",
page: 1, //
pageSize: 20, //
total: 0, //
@ -265,6 +278,7 @@ export default {
sureloading: false, //loading
offsetNumTime: null,
failedFlag: false,
};
},
computed: {
@ -276,20 +290,40 @@ export default {
methods: {
handleClick(tab, event) {
console.log(tab, event);
if (tab.name == 1) {
this.selectChannel = 1;
this.getDataBaseTime(this.areaData.id, this.selectChannel);
}
//
if (tab.name == 2) {
this.deviceTimeList = [];
this.getruleList();
}
this.deviceTimeLoading = false;
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
},
//
getChannelSelect() {
getChannelListJoggle({ termid: this.areaData.id })
.then((res) => {
console.log("wwww", Number(localStorage.getItem("channelId")));
this.channelList = res.data.list;
this.timeChannelList = res.data.list;
if (
Number(localStorage.getItem("channelId")) == 1 ||
Number(localStorage.getItem("channelId")) == -1 ||
Number(localStorage.getItem("channelId")) == 0
) {
this.timeChannel = this.channelList[0].channelid;
this.selectChannel = this.channelList[0].channelid;
} else {
this.timeChannel = Number(localStorage.getItem("channelId"));
this.selectChannel = Number(localStorage.getItem("channelId"));
}
// this.timeChannel = this.channelList[0].channelid;
// this.selectChannel = this.channelList[0].channelid;
console.log(this.channelList);
this.changeChannel();
})
@ -314,7 +348,9 @@ export default {
this.offsetNumTime = res.data.offset;
if (
this.areaData.protocol == "65283" ||
this.areaData.protocol == "65285"
this.areaData.protocol == "65285" ||
this.areaData.protocol == "65290" ||
this.areaData.protocol == "65298"
) {
//
console.log("湖南");
@ -344,6 +380,7 @@ export default {
console.log(hnarr[k].startTime);
console.log(hnarr[k].endTime);
console.log(hnarr[k].span);
if (hnarr[k].span !== 0) {
let Stime = this.$moment(hnarr[k].startTime, "HH:mm").format(
"YYYY-MM-DD HH:mm:ss"
);
@ -362,6 +399,8 @@ export default {
.add(spanTime, "minute")
.format("YYYY-MM-DD HH:mm:ss");
}
}
// //
console.log(dayArr);
}
@ -384,6 +423,10 @@ export default {
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 0,
@ -514,7 +557,9 @@ export default {
console.log(this.areaData.protocol);
if (
this.areaData.protocol == "65283" ||
this.areaData.protocol == "65285"
this.areaData.protocol == "65285" ||
this.areaData.protocol == "65290" ||
this.areaData.protocol == "65298"
) {
//
console.log("湖南");
@ -601,6 +646,9 @@ export default {
//
handleSet(val) {
console.log(val);
this.minTimeSpan = Math.min(...val.listTime.map((item) => item.timeSpan));
console.log(this.minTimeSpan);
this.minTimeSpan = this.minTimeSpan > 10 ? 10 : this.minTimeSpan - 1;
this.isShowset = true;
this.currentTimeRule = val;
getScheduleRulelAccessList({ termid: this.areaData.id })
@ -624,6 +672,8 @@ export default {
//xympadmn --act=schedule [0xCA] --flag=[Request Set Flag, default is set=1, 0: request] --channel=[Channel No] --group=[Group] --hour1=[Hour 1] --min1=[Minute 1] --preset1=[Preset 1]
submitForm() {
console.log(this.currentTimeRule);
this.failedFlag = false;
let timeArrList = [];
if (
this.areaData.protocol == "65285" &&
this.currentTimeRule.listTime.length > 1
@ -646,6 +696,10 @@ export default {
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
@ -665,14 +719,21 @@ export default {
.add(this.setNum, "minute")
.format("YYYY-MM-DD HH:mm:ss");
var Etime = this.$moment(scheduleTimeList[i].endTime, "HH:mm")
.add(this.setNum, "minute")
.format("YYYY-MM-DD HH:mm:ss");
// var Etime = this.$moment(scheduleTimeList[i].endTime, "HH:mm")
// .add(this.setNum, "minute")
// .format("YYYY-MM-DD HH:mm:ss");
//
var Etime = this.$moment(
scheduleTimeList[i].endTime,
"HH:mm"
).format("YYYY-MM-DD HH:mm:ss");
var spanTime = scheduleTimeList[i].timeSpan;
console.log(Stime, Etime, spanTime);
if (
this.areaData.protocol == "65283" ||
this.areaData.protocol == "65285"
this.areaData.protocol == "65285" ||
this.areaData.protocol == "65290" ||
this.areaData.protocol == "65298"
) {
//
console.log("湖南", scheduleTimeList.length);
@ -685,8 +746,6 @@ export default {
timeArr.push(fistSpan, Stime, Etime);
console.log(timeArr);
} else {
//
while (
this.$moment(Stime).isBefore(this.$moment(Etime)) ||
this.$moment(Stime).isSame(this.$moment(Etime))
@ -721,6 +780,23 @@ export default {
);
}
console.log(params);
for (var k = 0; k < timeArr.length; k++) {
//console.log(moment(dayArr[k]).hour());
timeArrList.push({
hour: this.$moment(timeArr[k]).hour(),
minute: this.$moment(timeArr[k]).minute(),
preset: 255,
});
}
console.log(timeArrList);
var parmsobj = {
termid: this.areaData.id,
channelid: this.timeChannel,
offset: this.setNum,
list: timeArrList,
};
console.log(parmsobj);
//this.setTimeRuleJava(parmsobj); //使java
this.setTermFnRule(params);
} else {
this.sureloading = false;
@ -733,6 +809,37 @@ export default {
}
});
},
//使
setTimeRuleJava(parmsobj) {
console.log(parmsobj);
setScheduleRulel({
scheduleid: this.currentTimeRule.id,
list: [parmsobj],
})
.then((res) => {
console.log(res);
if (res.data.list.length !== 0) {
this.requestid = res.data.list[0].requestid;
console.log(this.requestid);
clearInterval(this.timer);
this.deviceTimer = window.setInterval(() => {
this.getinfoRules();
this.deviceNum++;
console.log(this.deviceNum, this.deviceNum * 1000);
}, 1000 * this.deviceNum);
} else {
console.log("未获取到requestid");
}
})
.catch((err) => {
// this.$message({
// duration: 1500,
// showClose: true,
// message: "",
// type: "error",
// });
});
},
//
setTermFnRule(dataParams) {
setTermCamera({
@ -772,6 +879,7 @@ export default {
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
this.failedFlag = true;
this.$message({
duration: 1500,
showClose: true,
@ -782,6 +890,54 @@ export default {
})
.catch((err) => {});
},
//
clearTimeGrop() {
console.log("通道", this.selectChannel);
getTermStatus({ termId: this.areaData.id }).then((res) => {
console.log(res);
if (res.data.isonline) {
let params = [
{
name: "act",
value: "schedule",
},
{
name: "udp",
value: 1,
},
{
name: "flag",
value: 1,
},
{
name: "channel",
value: this.selectChannel,
},
{
name: "group",
value: 0,
},
];
console.log(params);
this.$confirm("确定要删除拍照时间表吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.setTermFnRule(params);
})
.catch(() => {});
} else {
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
//
closebtn() {
this.isShowset = false;
@ -796,6 +952,7 @@ export default {
handleclose() {
this.isShow = false;
this.sureloading = false;
this.deviceTimeLoading = false;
this.activeName = "1"; //
this.selectChannel = ""; //
this.channelList = []; //
@ -804,14 +961,17 @@ export default {
window.clearInterval(this.deviceTimer);
this.deviceTimer = null;
this.deviceNum = 1;
this.failedFlag = false;
},
//
handleCurrentChange(val) {
this.page = val;
this.getruleList();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getruleList();
},
},
};
@ -830,6 +990,11 @@ export default {
.searchTime {
.channelBox {
margin-bottom: 12px;
display: flex;
align-items: center;
.clearButton {
margin-left: auto;
}
}
.timeContain {
display: flex;
@ -847,6 +1012,18 @@ export default {
border-radius: 4px;
border: 1px solid #eee;
padding: 12px;
h3 {
.el-button {
margin-left: 14px;
}
}
}
.timeLeft,
.timeRight {
h3 {
line-height: 24px;
height: 24px;
}
}
.tagsBox {
height: 308px;
@ -907,6 +1084,11 @@ export default {
}
}
}
.fail {
color: red;
line-height: 28px;
font-size: 12px;
}
}
}
</style>

@ -5,6 +5,7 @@
placeholder="输入关键字进行过滤"
v-model="filterText"
prefix-icon="el-icon-search"
clearable
>
</el-input>
</div>
@ -36,24 +37,40 @@
:data="lineTreeData"
:props="defaultProps"
node-key="id"
default-expand-all
:default-expanded-keys="defaultExpandIds"
highlight-current
:expand-on-click-node="false"
:filter-node-method="filterNode"
:current-node-key="currentNodekey"
@node-click="handleNodeClick"
@node-expand="handleNodeExpand"
@node-collapse="handleNodeCollapse"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span v-if="node.level === 1">
<span class="iconfont icon-dianli" style="margin-right: 6px"></span>
<span>{{ node.label }} </span>
</span>
<span v-else-if="node.level === 2">
<span class="iconfont icon-dianlihangye" style="margin-right: 6px">
</span>
<span>{{ node.label }} </span>
<!-- v-if="node.name === '收藏夹'" -->
<span>
<span>
<span
v-if="node.label === '收藏夹'"
class="el-icon-collection"
style="margin-right: 6px"
></span>
<span
v-if="node.level === 1 && node.label !== '收藏夹'"
class="iconfont icon-dianli"
style="margin-right: 6px"
></span>
<span
v-if="node.level === 2 && data.bsManufacturer"
class="iconfont icon-dianlihangye"
style="margin-right: 6px"
>
</span>
<span v-else>
<span
v-if="
node.label !== '收藏夹' && !data.bsManufacturer && !data.dyValue
"
>
<span
class="iconfont icon-shexiangtoulixian"
v-if="data.onlinestatus == 0"
@ -66,17 +83,29 @@
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
style="margin-right: 6px"
></span>
</span>
<span :class="data.onlinestatus == 0 ? 'disconnect' : ''"
>{{ node.label }}
<span
:id="data.id"
:class="data.onlinestatus == 0 ? 'disconnect' : ''"
>{{ node.label }}</span
>
class="num"
v-if="node.level === 2 && data.bsManufacturer && zzradio == -1"
>({{ data.onlinenum }} / {{ data.totalnum }})
</span>
<span
class="num"
v-else-if="node.level === 2 && data.bsManufacturer"
>({{ data.list.length }})
</span>
</span>
</span>
</span>
</span>
</el-tree>
</div>
</template>
<script>
import EventBus from "@/utils/event-bus";
import { getdyTreeListJoggle } from "@/utils/api/index";
export default {
data() {
@ -86,6 +115,8 @@ export default {
totalNum: "", //
zzradio: -1, //线
lineTreeData: [],
defaultExpandIds: [], //
defaultProps: {
//
children: "list",
@ -93,14 +124,20 @@ export default {
},
currentData: {}, //
currentNodekey: "", //,
role: "",
treeStatustimer: null,
isfavorList: [],
};
},
components: {},
watch: {
filterText(val) {
console.log(val);
this.$refs.tree.filter(val);
console.log(this.$refs.tree);
// filterText(val) {
// console.log(val);
// this.$refs.tree.filter(val);
// console.log(this.$refs.tree);
// },
filterText(newVal) {
this.handleFilter(); // filterText
},
},
mounted() {},
@ -109,29 +146,67 @@ export default {
JSON.parse(localStorage.getItem("radio")) !== null
? JSON.parse(localStorage.getItem("radio"))
: -1; //radio
this.role = localStorage.getItem("role");
console.log("用户管理");
console.log(this.role);
this.getRadio(); //线线
this.getLineTreeList(); //
this.treeStatustimer = setInterval(this.getLineTreeStatus, 60000); // 60
this.$route.meta.intervalId = this.treeStatustimer;
console.log(this.$route.meta.intervalId, "aaaaaaaaaaaaaaaaa");
EventBus.$on("treelist", this.getLineTreeStatus);
},
methods: {
//radio
getRadio() {
console.log(this.zzradio);
this.filterText = "";
//this.filterText = "";
localStorage.setItem("radio", JSON.stringify(this.zzradio));
this.getLineTreeStatus();
},
//tree
getLineTreeStatus() {
console.log("点击了刷新");
if (this.filterText !== "") {
getdyTreeListJoggle({ type: this.zzradio })
.then((res) => {
console.log(res);
this.lineTreeData = res.data.list;
this.isfavorList = res.data.favorlist;
this.lineTreeData.unshift({
id: 0,
name: "收藏夹",
bsManufacturer: "收藏夹",
list: this.isfavorList,
});
this.onlineNum = res.data.onlineNum;
this.totalNum = res.data.totalNum;
this.currentData = JSON.parse(localStorage.getItem("currentData"));
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.currentData.id); //
this.$refs.tree.filter(this.filterText);
});
})
.catch((err) => {
console.log(err); //
});
} else {
getdyTreeListJoggle({ type: this.zzradio })
.then((res) => {
console.log(res);
this.lineTreeData = res.data.list;
this.isfavorList = res.data.favorlist;
this.lineTreeData.unshift({
id: 0,
name: "收藏夹",
bsManufacturer: "收藏夹",
list: this.isfavorList,
});
this.onlineNum = res.data.onlineNum;
this.totalNum = res.data.totalNum;
this.currentData = JSON.parse(localStorage.getItem("currentData"));
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.currentData.id); //
@ -142,46 +217,60 @@ export default {
});
}
},
handleFilter() {
// 500
setTimeout(() => {
this.$refs.tree.filter(this.filterText);
}, 500);
},
//
filterNode(value, data, node) {
//console.log(value, data, node);
this.filterText = value;
console.log(this.filterText);
//
if (!value) return true;
this.searchName = data.name + data.cmdid;
//console.log(this.searchName);
// valuedatalabel
if (this.searchName.indexOf(value) !== -1) {
return true;
}
let nowval = data[this.defaultProps.label].toUpperCase();
return nowval.indexOf(value.toUpperCase()) !== -1;
},
//
getLineTreeList() {
console.log(this.zzradio);
getdyTreeListJoggle({ type: this.zzradio })
.then((res) => {
console.log(res);
this.lineTreeData = res.data.list;
console.log(this.lineTreeData);
this.isfavorList = res.data.favorlist;
this.lineTreeData.unshift({
id: 0,
name: "收藏夹",
bsManufacturer: "收藏夹",
list: this.isfavorList,
});
this.onlineNum = res.data.onlineNum;
this.totalNum = res.data.totalNum;
this.currentData = JSON.parse(localStorage.getItem("currentData"));
if (this.lineTreeData[0].list[0].list.length > 0) {
}
// if (this.lineTreeData[0].list[0].list.length > 0) {
// }
if (
this.currentData !== null &&
Object.keys(this.currentData).length !== 0
) {
console.log("aaaa");
this.currentNodekey = this.currentData.id;
this.handleNodeClick(this.currentData);
} else {
console.log("aaaa");
this.currentData = this.lineTreeData[0]; //
this.currentNodekey = this.lineTreeData[0].id; //
this.currentData = this.lineTreeData[1]; //
this.currentNodekey = this.lineTreeData[1].id; //
this.handleNodeClick(this.currentData);
}
this.defaultExpandIds =
JSON.parse(localStorage.getItem("defultkeys")) !== null
? JSON.parse(localStorage.getItem("defultkeys"))
: []; //defaultKey ;
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.currentNodekey); //
this.scrollView();
@ -191,12 +280,74 @@ export default {
console.log(err); //
});
},
//
handleNodeExpand(data) {
//
let flag = false;
this.defaultExpandIds.some((item) => {
if (item === data.id) {
//
flag = true;
return true;
}
});
if (!flag) {
//
this.defaultExpandIds.push(data.id);
localStorage.setItem(
"defultkeys",
JSON.stringify(this.defaultExpandIds)
);
}
},
//
handleNodeCollapse(data) {
//
this.defaultExpandIds.some((item, i) => {
if (item === data.id) {
this.defaultExpandIds.splice(i, 1);
localStorage.setItem(
"defultkeys",
JSON.stringify(this.defaultExpandIds)
);
}
});
this.removeChildrenIds(data); //
},
//
removeChildrenIds(data) {
console.log("我还有子节点");
const ts = this;
console.log(data);
if (data.list) {
console.log(data.list);
data.list.forEach(function (item) {
const index = ts.defaultExpandIds.indexOf(item.id);
if (index > 0) {
ts.defaultExpandIds.splice(index, 1);
}
ts.removeChildrenIds(item);
console.log(ts.defaultExpandIds);
});
localStorage.setItem(
"defultkeys",
JSON.stringify(this.defaultExpandIds)
);
}
},
//treenode
handleNodeClick(data) {
console.log(data);
if (data.name == "收藏夹") {
return;
}
if (data.isfavor == 0 || data.isfavor == null) {
this.collectFlag = false;
} else {
this.collectFlag = true;
}
this.currentData = data;
this.scrollView();
//this.scrollView();
this.$store.commit("currentData", this.currentData); //currentDatavuex
this.$store.commit("termId", this.currentData.id); //currentDatavuex
this.$store.commit("protocol", this.currentData.protocol); //currentDatavuex
@ -206,6 +357,7 @@ export default {
//this.$refs.tree.scrollTo(data);
// localStorage.setItem("currentData", JSON.stringify(this.currentData));
},
scrollView() {
if (this.currentData) {
this.$nextTick(() => {
@ -219,14 +371,39 @@ export default {
}
},
},
beforeRouteLeave(to, from, next) {
if (to.name !== "realTimeMonitor") {
//
console.log("清除轮巡saaaaaaaaaaaaaaaaaaaaa");
clearInterval(this.treeStatustimer);
this.treeStatustimer = null;
}
next();
},
deactivated() {
console.log("清除轮巡");
console.log("deactivated", this.treeStatustimer);
//
clearInterval(this.treeStatustimer);
this.treeStatustimer = null;
},
beforeDestroy() {
console.log("清除轮巡");
console.log(this.treeStatustimer);
//
clearInterval(this.treeStatustimer);
this.treeStatustimer = null;
},
};
</script>
<style lang="less">
.realsideBar {
width: 300px;
width: 312px;
display: flex;
flex-direction: column;
padding: 16px 0px;
height: calc(100% - 70px);
.searchBar {
width: 94%;
margin: 0 auto;
@ -282,6 +459,10 @@ export default {
display: flex;
display: inline-table;
overflow: hidden;
align-items: center;
}
.num {
color: #169e8c;
}
}
}
@ -298,6 +479,10 @@ export default {
span {
display: flex;
//overflow: hidden;
align-items: center;
.num {
color: #fff;
}
.iconfont {
//width: 30px;
display: inline-table;

@ -6,7 +6,11 @@
<el-button type="primary" :loading="picLoading">
主动拍照<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown" class="picdropStyle">
<el-dropdown-menu
slot="dropdown"
class="picdropStyle"
:append-to-body="false"
>
<el-dropdown-item
:command="item.channelid"
v-for="(item, index) in channelIdList"
@ -40,13 +44,23 @@ export default {
},
watch: {
termId: {
handler(newVal, oldVal) {},
handler(newVal, oldVal) {
console.log("我改变了");
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
this.picLoading = false;
},
deep: true,
immediate: true,
},
},
mounted() {
console.log(this.channelIdList);
console.log("我是主动拍照");
},
computed: {
termId() {
@ -71,6 +85,10 @@ export default {
name: "act",
value: "capture",
},
{
name: "udp",
value: 1,
},
{
name: "channel",
value: command,
@ -101,6 +119,7 @@ export default {
setTermFn(val) {
setTermCamera({
termId: this.termId,
channelId: this.pzchannelId,
list: val,
})
.then((res) => {
@ -111,7 +130,7 @@ export default {
this.statusTimer = window.setInterval(() => {
this.getTakePicStatus(res.data);
this.statusNum++;
}, 3000);
}, 5000);
})
.catch((err) => {});
},
@ -126,7 +145,55 @@ export default {
.then((res) => {
console.log(res);
//res.data 0 1 2
if (res.data.cmaStatus != 1 && this.statusNum >= 5) {
// if (
// res.data.cmaStatus == 0 &&
// res.data.picStatus == false &&
// this.statusNum >= 5
// ) {
// //
// this.clearFn();
// this.$message({
// duration: 1500,
// showClose: true,
// message: "true",
// type: "warning",
// });
// } else if (res.data.cmaStatus == 1) {
// this.clearFn();
// this.$message({
// duration: 1500,
// showClose: true,
// message: "cmaStatus1",
// type: "success",
// });
// clearInterval(this.picPimer);
// this.picPimer = null;
// this.picPimer = window.setInterval(() => {
// this.newPicApi(val);
// this.picNum++;
// }, 8000);
// return;
// } else if (res.data.picStatus == true) {
// this.clearFn();
// this.$message({
// duration: 1500,
// showClose: true,
// message: "",
// type: "success",
// });
// clearInterval(this.picPimer);
// this.picPimer = null;
// this.picPimer = window.setInterval(() => {
// this.newPicApi(val);
// this.picNum++;
// }, 2000);
// return;
// }
if (
res.data.cmaStatus != 1 &&
res.data.picStatus == false &&
this.statusNum >= 5
) {
this.clearFn();
this.$message({
duration: 1500,
@ -134,7 +201,11 @@ export default {
message: "下发指令超时,请重试!",
type: "warning",
});
} else if (res.data.cmaStatus == 1 || res.data.picStatus == true) {
} else if (
res.data.cmaStatus == 1 &&
res.data.picStatus == false &&
this.statusNum < 5
) {
this.clearFn();
this.$message({
duration: 1500,
@ -142,6 +213,20 @@ export default {
message: "下发指令成功!",
type: "success",
});
this.newPicApi(val);
clearInterval(this.picPimer);
this.picPimer = null;
this.picPimer = window.setInterval(() => {
this.newPicApi(val);
this.picNum++;
}, 8000);
} else if (
res.data.cmaStatus != 1 &&
res.data.picStatus == true &&
this.statusNum < 5
) {
this.clearFn();
this.newPicApi(val);
clearInterval(this.picPimer);
this.picPimer = null;
this.picPimer = window.setInterval(() => {
@ -163,13 +248,15 @@ export default {
}).then((res) => {
console.log(res.data);
console.log(this.picNum);
console.log(this.pzchannelId);
if (res.data == true && this.picNum < 10) {
// console.log(this.$parent.$parent);
this.$parent.$parent.getPhotoList(
-1,
this.pzchannelId,
new Date(val.date).getTime(),
this.termId
); // id termid
this.$message({
duration: 1500,
showClose: true,
@ -188,11 +275,27 @@ export default {
});
},
clearFn() {
console.log("我要取消了轮巡");
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
this.picLoading = false;
console.log("我要取消了轮巡1111111111111111111111111111111");
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
},
},
destroyed() {
console.log("离开了");
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
},
beforeRouteLeave(to, from, next) {
//
next();
console.log("7777777777777777777777777");
},
};
</script>

@ -0,0 +1,332 @@
<template>
<!-- <el-button type="primary" @click="handleTakePic" :loading="picLoading"
>主动拍照
</el-button> -->
<div>
<el-dropdown trigger="click" @command="handleCommandpic">
<el-button type="primary" :loading="picLoading">
指定时间拍照<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu
slot="dropdown"
class="picdropStyle"
:append-to-body="false"
>
<el-dropdown-item
:command="item.channelid"
v-for="(item, index) in channelIdList"
:key="index"
>{{
item.alias !== null && item.alias !== ""
? item.alias
: item.channelname
}}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
<el-dialog
class="timeDialog"
title="拍照时间"
:visible.sync="dialogFormVisible"
width="380px"
>
<el-form :model="form">
<el-form-item label="拍照时间:">
<el-date-picker
v-model="form.startTime"
type="datetime"
placeholder="选择日期时间"
>
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="confirmClick"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
getTermStatus,
setTermCamera,
getTakePicStatusJoggle,
getTakePicPhotoStatusJoggle,
} from "@/utils/api/index";
export default {
data() {
return {
picLoading: false,
statusTimer: null,
statusNum: 0,
picPimer: null,
picNum: 0,
pzchannelId: "",
dialogFormVisible: false,
form: {
startTime: "",
},
timestamp: "",
};
},
watch: {
termId: {
handler(newVal, oldVal) {
console.log("我改变了");
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
this.picLoading = false;
},
deep: true,
immediate: true,
},
},
mounted() {
console.log(this.channelIdList);
console.log("我是主动拍照");
},
computed: {
termId() {
return this.$store.state.termId;
},
channelIdList() {
return this.$store.state.channelIdList;
},
},
methods: {
handleCommandpic(command) {
// --act=capture --cmdid=XY-SIMULATOR-0016 --channel=1 --preset=255 --scheduleTime=1704110700 --clientid=5 --reqid=TS
console.log(command);
this.dialogFormVisible = true;
this.pzchannelId = command;
},
confirmClick() {
console.log(this.pzchannelId);
console.log(this.form.startTime.getTime() / 1000);
this.timestamp = this.form.startTime.getTime() / 1000;
this.dialogFormVisible = false;
this.picLoading = true;
getTermStatus({ termId: this.termId }).then((res) => {
console.log(res);
if (res.data.isonline) {
let params = [
{
name: "act",
value: "capture",
},
{
name: "udp",
value: 1,
},
{
name: "channel",
value: this.pzchannelId,
},
{
name: "preset",
value: 255,
},
{
name: "scheduleTime",
value: this.timestamp,
},
{
name: "type",
value: 0,
},
];
this.setTermFn(params);
} else {
this.picLoading = false;
this.$message({
duration: 1500,
showClose: true,
message: "装置下线,发送指令失败",
type: "error",
});
}
});
},
handleTakePic() {},
//
setTermFn(val) {
setTermCamera({
termId: this.termId,
list: val,
})
.then((res) => {
console.log(res);
this.getTakePicStatus(res.data);
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusTimer = window.setInterval(() => {
this.getTakePicStatus(res.data);
this.statusNum++;
}, 5000);
})
.catch((err) => {});
},
//
getTakePicStatus(val) {
console.log(val);
getTakePicStatusJoggle({
requestid: val.requestId,
termId: this.termId,
photoTime: new Date(val.date).getTime(),
})
.then((res) => {
console.log(res);
//res.data 0 1 2
// if (
// res.data.cmaStatus == 0 &&
// res.data.picStatus == false &&
// this.statusNum >= 5
// ) {
// //
// this.clearFn();
// this.$message({
// duration: 1500,
// showClose: true,
// message: "true",
// type: "warning",
// });
// } else if (res.data.cmaStatus == 1) {
// this.clearFn();
// this.$message({
// duration: 1500,
// showClose: true,
// message: "cmaStatus1",
// type: "success",
// });
// clearInterval(this.picPimer);
// this.picPimer = null;
// this.picPimer = window.setInterval(() => {
// this.newPicApi(val);
// this.picNum++;
// }, 8000);
// return;
// } else if (res.data.picStatus == true) {
// this.clearFn();
// this.$message({
// duration: 1500,
// showClose: true,
// message: "",
// type: "success",
// });
// clearInterval(this.picPimer);
// this.picPimer = null;
// this.picPimer = window.setInterval(() => {
// this.newPicApi(val);
// this.picNum++;
// }, 2000);
// return;
// }
if (res.data.cmaStatus != 1 && this.statusNum >= 5) {
this.clearFn();
this.$message({
duration: 1500,
showClose: true,
message: "下发指令超时,请重试!",
type: "warning",
});
} else if (res.data.cmaStatus == 1 || res.data.picStatus == true) {
this.clearFn();
this.$message({
duration: 1500,
showClose: true,
message: "下发指令成功!",
type: "success",
});
this.newPicApi(val);
clearInterval(this.picPimer);
this.picPimer = null;
this.picPimer = window.setInterval(() => {
this.newPicApi(val);
this.picNum++;
}, 8000);
}
})
.catch((err) => {
console.log(err); //
});
},
//
newPicApi(val) {
getTakePicPhotoStatusJoggle({
requestid: val.requestId,
termId: this.termId,
photoTime: new Date(val.date).getTime(),
}).then((res) => {
console.log(res.data);
console.log(this.picNum);
if (res.data == true && this.picNum < 10) {
// console.log(this.$parent.$parent);
this.$parent.$parent.getPhotoList(
-1,
new Date(val.date).getTime(),
this.termId
); // id termid
this.$message({
duration: 1500,
showClose: true,
message: "已返回最新图片!",
type: "success",
});
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
console.log("返回最新图片");
} else if (res.data == false && this.picNum > 10) {
clearInterval(this.picPimer);
this.picPimer = null;
this.picNum = 0;
}
});
},
clearFn() {
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
this.picLoading = false;
},
},
destroyed() {
console.log("离开了");
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
},
beforeRouteLeave(to, from, next) {
//
next();
console.log("7777777777777777777777777");
},
};
</script>
<style lang="less">
.timeDialog {
.el-date-editor.el-input,
.el-date-editor.el-input__inner {
width: 256px;
}
.el-dialog__footer {
.dialog-footer {
.el-button {
width: 80px !important;
margin-bottom: 0px !important;
}
.el-button + .el-button {
margin-left: 10px !important;
}
}
}
}
</style>

@ -7,7 +7,11 @@
<el-button type="primary" :loading="picLoading">
主动录像<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown" class="picdropStyle">
<el-dropdown-menu
slot="dropdown"
class="picdropStyle"
:append-to-body="false"
>
<el-dropdown-item
:command="item.channelid"
v-for="(item, index) in channelIdList"
@ -85,11 +89,16 @@ export default {
// deep: true,
// immediate: true,
// },
// termId: {
// handler(newVal, oldVal) {},
// deep: true,
// immediate: true,
// },
termId: {
handler(newVal, oldVal) {
clearInterval(this.statusTimer);
this.statusTimer = null;
this.statusNum = 0;
this.picLoading = false;
},
deep: true,
immediate: true,
},
// channelId: {
// handler(newVal, oldVal) {},
// deep: true,
@ -125,6 +134,10 @@ export default {
name: "act",
value: "capture",
},
{
name: "udp",
value: 1,
},
{
name: "channel",
value: command,
@ -162,6 +175,10 @@ export default {
name: "act",
value: "capture",
},
{
name: "udp",
value: 1,
},
{
name: "channel",
value: this.pzchannelId,

@ -0,0 +1,145 @@
<template>
<el-dialog
class="uploadPic"
title="上传图片"
:visible.sync="isShow"
:close-on-click-modal="false"
width="600px"
@close="handleclose"
>
<div class="uploadBox">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="装置编号">
<el-input v-model="form.cmdid"></el-input>
</el-form-item>
<el-form-item label="装置Id">
<el-input v-model="form.termid"></el-input>
</el-form-item>
<el-form-item label="通道选择">
<el-select v-model="form.channel" placeholder="选择通道">
<el-option label="通道一" :value="1"></el-option>
<el-option label="通道二" :value="2"></el-option>
<el-option label="通道三" :value="3"></el-option>
<el-option label="通道四" :value="4"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选择时间">
<el-date-picker
v-model="form.phototime"
value-format="timestamp"
type="datetime"
placeholder="选择日期时间"
>
</el-date-picker>
</el-form-item>
<el-form-item label="">
<el-upload
class="upload-demo"
ref="upload"
action="#"
:http-request="httpRequest"
>
<el-button slot="trigger" size="small" type="primary"
>选取图片</el-button
>
</el-upload>
</el-form-item>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button type="primary" @click="handlesure"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { uploadPicApi } from "@/utils/api/index";
export default {
props: {},
data() {
return {
isShow: false,
form: {},
fileList: [], //
};
},
mounted() {},
methods: {
httpRequest(raw) {
this.fileList.push(raw);
},
//
display(data) {
console.log(data);
this.$set(this.form, "cmdid", data.cmdid);
this.$set(this.form, "termid", data.id);
this.isShow = true;
},
handleclose() {
this.isShow = false;
this.fileList = [];
},
handlesure() {
this.isShow = false;
//console.log(this.fileList[0].file);
this.$set(this.form, "file", this.fileList[0].file);
console.log(this.form);
uploadPicApi(this.form)
.then((res) => {
console.log(res);
this.$message({
duration: 1500,
showClose: true,
message: "上传成功",
type: "success",
});
this.fileList = [];
})
.catch((err) => {});
},
},
destroyed() {
this.isShow = false;
},
};
</script>
<style lang="less">
.uploadPic {
.uploadBox {
}
.upload-demo {
position: relative;
display: flex;
align-items: center;
flex-direction: row-reverse;
margin-right: 16px;
.el-upload-list {
width: 370px;
height: 32px;
line-height: 32px;
border: 1px solid #dcdfe6;
background: #fff;
margin-right: 12px;
border-radius: 4px;
.el-upload-list__item-name {
margin-right: 0px;
}
.el-upload-list__item {
transition: none;
font-size: 14px;
color: #606266;
position: relative;
box-sizing: border-box;
border-radius: 4px;
width: 100%;
height: 32px;
line-height: 32px;
margin-top: 0px !important;
.el-icon-close {
top: 10px;
}
}
}
}
}
</style>

@ -0,0 +1,298 @@
<template>
<div class="realTimeMonitor" v-loading="mainLoading">
<div class="monitor-container">
<div class="allSide">
<div class="typeList">
<el-radio-group v-model="typeRadio" size="mini" @input="getTypeRadio">
<el-radio-button :label="-1">全部</el-radio-button>
<el-radio-button
:label="1"
v-if="roleName === 'superadmin' || roleName === 'Matthew'"
>活动</el-radio-button
>
</el-radio-group>
</div>
<sideBar ref="sideTree" v-if="allTreeFlag"></sideBar>
<activeSiderBar ref="activesideTree" v-else></activeSiderBar>
</div>
<div class="picListBox">
<div class="previewBox" v-if="LineFlag">
<!-- 预览图页面 -->
<previewContain ref="previewRef"></previewContain>
</div>
<div class="previewBox" v-if="towerFlag">
<div class="swiperBox" v-loading="swiperLoading">
<div class="title">
<el-breadcrumb separator="/">
<el-breadcrumb-item> {{ towertitle }}</el-breadcrumb-item>
</el-breadcrumb>
</div>
<carouselChart
ref="carouselpic"
:terminalPhoto="terminalPhoto"
:photoNum="photoNum"
:protocolInfo="protocolInfo"
v-if="terminalPhoto.length !== 0"
></carouselChart>
</div>
<div class="parameterArea">
<parameterArea ref="areaRef"></parameterArea>
</div>
</div>
</div>
</div>
<morePicPreveiw ref="morePicPreveiw_ref"></morePicPreveiw>
</div>
</template>
<script>
import { getTerminalPhotoListJoggle } from "@/utils/api/index";
import sideBar from "./components/siderBar";
import activeSiderBar from "./components/activeSiderBar";
import previewContain from "./components/previewContain";
import carouselChart from "./components/carouselChart";
import parameterArea from "./components/parameterArea";
import morePicPreveiw from "./components/morePicPreveiw";
import { mapGetters, mapState } from "vuex";
import ActiveSiderBar from "./components/activeSiderBar.vue";
export default {
name: "realTimeMonitor",
data() {
return {
LineFlag: false, //线
towerFlag: false, //
mainLoading: false, //loading
page: 1, //
towertitle: "", //
lineLoading: false, //loading
swiperLoading: false,
terminalPhoto: [], //
photoNum: 5,
dateValue: "", //
protocolInfo: "",
nopicPath: require("@/assets/img/nopic.jpg"),
typeRadio: -1, //
allTreeFlag: true,
roleName: "",
};
},
watch: {
treeSelectData: {
handler(newVal, oldVal) {},
deep: true,
immediate: true,
},
},
components: {
sideBar,
activeSiderBar,
previewContain,
carouselChart,
parameterArea,
morePicPreveiw,
},
computed: {
treeSelectData() {
return this.$store.state.currentData;
},
},
created() {
this.roleName = localStorage.getItem("userName");
//this.treeSelectData = currentData;
//
},
mounted() {
this.mainLoading = true;
setTimeout(() => {
this.mainLoading = false;
}, 1000);
},
methods: {
getTypeRadio() {
console.log(this.typeRadio);
if (this.typeRadio == -1) {
this.allTreeFlag = true;
} else {
this.allTreeFlag = false;
}
},
getCurrentData(data) {
console.log("执行父组件", this.treeSelectData);
if (this.treeSelectData.dyValue) {
console.log("电压");
this.LineFlag = true;
this.towerFlag = false;
this.lineLoading = true;
this.type = 1;
this.$nextTick(() => {
this.$refs.previewRef.getPicList(
this.treeSelectData.id,
this.type,
this.page
);
});
} else if (this.treeSelectData.dyLevelId) {
console.log("线路");
this.LineFlag = true;
this.towerFlag = false;
this.type = 2;
console.log(this.treeSelectData);
this.$nextTick(() => {
this.$refs.previewRef.getPicList(
this.treeSelectData.id,
this.type,
this.page
);
});
} else {
console.log("杆塔");
this.LineFlag = false;
this.towerFlag = true;
this.terminalPhoto = [];
this.protocolInfo = this.treeSelectData.protocol;
console.log("asddddddddddddddddddddd", this.treeSelectData);
this.towertitle = this.treeSelectData.name;
this.$nextTick(() => {
this.$refs.areaRef.getChannelList();
this.$refs.areaRef.takepicFun();
});
}
},
getPhotoList(channelId, date, termId) {
console.log(channelId, date, termId);
this.swiperLoading = true;
console.log("zhanshi asdadadadadadsddadadadadad", this.terminalPhoto);
this.terminalPhoto = [];
getTerminalPhotoListJoggle({
channelid: channelId,
time: date,
terminalid: termId,
})
.then((res) => {
console.log(res);
if (res.data.list.length == 0) {
this.terminalPhoto = [
{
path: this.nopicPath,
termId: termId,
mediatype: 0,
},
];
} else {
this.terminalPhoto = res.data.list;
}
// let newDataList = [];
// let current = 0;
// if (this.terminalPhoto && this.terminalPhoto.length > 0) {
// for (let i = 0; i <= this.terminalPhoto.length - 1; i++) {
// if (i % this.photoNum !== 0 || i === 0) {
// if (!newDataList[current]) {
// newDataList.push([this.terminalPhoto[i]]);
// } else {
// newDataList[current].push(this.terminalPhoto[i]);
// }
// } else {
// current++;
// newDataList.push([this.terminalPhoto[i]]);
// }
// }
// }
// this.terminalPhoto = [...newDataList];
// this.$nextTick(() => {
// this.$refs.carouselpic.changeBigPic(this.terminalPhoto[0][0], 0);
// });
this.$nextTick(() => {
this.$refs.carouselpic.changeBigPic(this.terminalPhoto[0], 0);
});
this.swiperLoading = false;
})
.catch((err) => {
console.log(err); //
});
},
//
jumpTowerPic(data) {
console.log("我是从子组件过来的数据");
console.log(data);
this.$refs.morePicPreveiw_ref.display(data);
},
},
};
</script>
<style lang="less">
.realTimeMonitor {
width: calc(100% - 0px);
height: calc(100% - 12px);
padding: 12px 0px 0px 0px;
background: #ffffff;
.monitor-container {
display: flex;
height: 100%;
box-sizing: border-box;
background: #ffffff;
border: 1px solid #dddddd;
border-radius: 4px;
.allSide {
height: 100%;
.typeList {
width: 94%;
margin: 0 auto;
margin-top: 8px;
}
}
.picListBox {
display: flex;
width: 100%;
height: 100%;
flex: 1;
overflow: hidden;
border-left: 1px solid #dddddd;
.previewBox {
display: flex;
width: 100%;
height: 100%;
flex: 1;
}
.swiperBox {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
width: auto;
overflow: hidden;
display: flex;
flex-direction: column;
position: relative;
.title {
height: 32px;
padding-left: 12px;
line-height: 32px;
color: #fff;
font-size: 12px;
//background-color: #169e8cb0;
background: linear-gradient(180deg, #4cdbc8 10%, #128071 100%);
.el-breadcrumb {
line-height: 32px;
color: #fff !important;
font-size: 14px;
height: 32px;
.el-breadcrumb__inner,
.el-breadcrumb__separator {
color: #fff !important;
}
}
}
}
.parameterArea {
width: 220px;
padding: 0px 8px;
border-left: 1px solid #dddddd;
position: relative;
overflow-y: auto;
}
}
}
}
</style>

@ -1,24 +1,48 @@
<template>
<div class="realTimeMonitor" v-loading="mainLoading">
<div class="monitor-container">
<sideBar ref="sideTree"></sideBar>
<div class="allSide">
<div class="typeList">
<el-radio-group v-model="typeRadio" size="mini" @input="getTypeRadio">
<el-radio-button :label="-1">全部</el-radio-button>
<el-radio-button
:label="1"
v-if="roleName === 'superadmin' || roleName === 'Matthew'"
>活动</el-radio-button
>
</el-radio-group>
</div>
<sideBar ref="sideTree" v-if="allTreeFlag"></sideBar>
<activeSiderBar ref="activesideTree" v-else></activeSiderBar>
</div>
<div class="picListBox">
<div class="previewBox" v-if="LineFlag">
<!-- 预览图页面 -->
<previewContain ref="previewRef"></previewContain>
</div>
<div class="previewBox" v-if="towerFlag">
<div class="previewBox" v-show="towerFlag">
<div class="swiperBox" v-loading="swiperLoading">
<div class="title">
<el-breadcrumb separator="/">
<el-breadcrumb-item> {{ towertitle }}</el-breadcrumb-item>
<el-breadcrumb-item v-if="totalCount !== 0" class="picnum">
<span
v-for="(count, channel) in sortedChannelCounts"
:key="channel"
>
{{ channel }}:{{ count }} ,
</span>
{{ totalCount }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<carouselChart
ref="carouselpic"
:key="carouselKey"
:terminalPhoto="terminalPhoto"
:photoNum="photoNum"
v-if="terminalPhoto.length !== 0"
:protocolInfo="protocolInfo"
></carouselChart>
</div>
<div class="parameterArea">
@ -33,13 +57,16 @@
<script>
import { getTerminalPhotoListJoggle } from "@/utils/api/index";
import sideBar from "./components/siderBar";
import activeSiderBar from "./components/activeSiderBar";
import previewContain from "./components/previewContain";
import carouselChart from "./components/carouselChart";
import parameterArea from "./components/parameterArea";
import morePicPreveiw from "./components/morePicPreveiw";
import { mapGetters, mapState } from "vuex";
import ActiveSiderBar from "./components/activeSiderBar.vue";
export default {
name: "realTimeMonitor",
data() {
return {
LineFlag: false, //线
@ -48,11 +75,18 @@ export default {
page: 1, //
towertitle: "", //
lineLoading: false, //loading
swiperLoading: false,
swiperLoading: true,
terminalPhoto: [], //
photoNum: 5,
dateValue: "", //
protocolInfo: 0,
nopicPath: require("@/assets/img/nopic.jpg"),
typeRadio: -1, //
allTreeFlag: true,
roleName: "",
carouselKey: 0, // key
channelCounts: {}, //
totalCount: 0, //
};
},
watch: {
@ -64,6 +98,7 @@ export default {
},
components: {
sideBar,
activeSiderBar,
previewContain,
carouselChart,
parameterArea,
@ -73,8 +108,18 @@ export default {
treeSelectData() {
return this.$store.state.currentData;
},
//
sortedChannelCounts() {
return Object.keys(this.channelCounts)
.sort((a, b) => a.localeCompare(b, "zh-Hans-CN", { numeric: true })) //
.reduce((acc, key) => {
acc[key] = this.channelCounts[key];
return acc;
}, {});
},
},
created() {
this.roleName = localStorage.getItem("userName");
//this.treeSelectData = currentData;
//
},
@ -85,6 +130,14 @@ export default {
}, 1000);
},
methods: {
getTypeRadio() {
console.log(this.typeRadio);
if (this.typeRadio == -1) {
this.allTreeFlag = true;
} else {
this.allTreeFlag = false;
}
},
getCurrentData(data) {
console.log("执行父组件", this.treeSelectData);
if (this.treeSelectData.dyValue) {
@ -100,7 +153,7 @@ export default {
this.page
);
});
} else if (this.treeSelectData.bsManufacturer) {
} else if (this.treeSelectData.dyLevelId) {
console.log("线路");
this.LineFlag = true;
this.towerFlag = false;
@ -117,24 +170,37 @@ export default {
console.log("杆塔");
this.LineFlag = false;
this.towerFlag = true;
this.terminalPhoto = [];
//this.terminalPhoto = [];
this.protocolInfo = this.treeSelectData.protocol;
console.log("asddddddddddddddddddddd", this.treeSelectData);
this.towertitle = this.treeSelectData.name;
this.$nextTick(() => {
this.$refs.areaRef.getChannelList();
this.$refs.areaRef.takepicFun();
});
}
},
getPhotoList(channelId, date, termId) {
getPhotoList(channelId, date, termId, yzwValue) {
console.log(channelId, date, termId);
this.swiperLoading = true;
console.log("zhanshi asdadadadadadsddadadadadad", this.terminalPhoto);
this.terminalPhoto = [];
getTerminalPhotoListJoggle({
//this.terminalPhoto = [];
let params = {};
if (yzwValue == "") {
params = {
channelid: channelId,
time: date,
terminalid: termId,
})
};
} else {
params = {
channelid: channelId,
time: date,
terminalid: termId,
presetId: yzwValue,
};
}
getTerminalPhotoListJoggle(params)
.then((res) => {
console.log(res);
if (res.data.list.length == 0) {
@ -142,31 +208,50 @@ export default {
{
path: this.nopicPath,
termId: termId,
mediatype: 0,
mediaType: 0,
},
];
this.channelCounts = {};
this.totalCount = 0;
} else {
this.terminalPhoto = res.data.list;
const list = this.terminalPhoto;
const counts = {};
//
list.forEach((item) => {
const channel = `C${item.channelId}`; // ID "1""2"
if (!counts[channel]) {
counts[channel] = 0;
}
let newDataList = [];
let current = 0;
if (this.terminalPhoto && this.terminalPhoto.length > 0) {
for (let i = 0; i <= this.terminalPhoto.length - 1; i++) {
if (i % this.photoNum !== 0 || i === 0) {
if (!newDataList[current]) {
newDataList.push([this.terminalPhoto[i]]);
} else {
newDataList[current].push(this.terminalPhoto[i]);
}
} else {
current++;
newDataList.push([this.terminalPhoto[i]]);
}
}
counts[channel]++;
});
this.channelCounts = counts;
this.totalCount = list.length; //
}
this.terminalPhoto = [...newDataList];
this.carouselKey++; // key
// let newDataList = [];
// let current = 0;
// if (this.terminalPhoto && this.terminalPhoto.length > 0) {
// for (let i = 0; i <= this.terminalPhoto.length - 1; i++) {
// if (i % this.photoNum !== 0 || i === 0) {
// if (!newDataList[current]) {
// newDataList.push([this.terminalPhoto[i]]);
// } else {
// newDataList[current].push(this.terminalPhoto[i]);
// }
// } else {
// current++;
// newDataList.push([this.terminalPhoto[i]]);
// }
// }
// }
// this.terminalPhoto = [...newDataList];
// this.$nextTick(() => {
// this.$refs.carouselpic.changeBigPic(this.terminalPhoto[0][0], 0);
// });
this.$nextTick(() => {
this.$refs.carouselpic.changeBigPic(this.terminalPhoto[0][0], 0);
this.$refs.carouselpic.changeBigPic(this.terminalPhoto[0], 0);
});
this.swiperLoading = false;
@ -197,6 +282,14 @@ export default {
background: #ffffff;
border: 1px solid #dddddd;
border-radius: 4px;
.allSide {
height: 100%;
.typeList {
width: 94%;
margin: 0 auto;
margin-top: 8px;
}
}
.picListBox {
display: flex;
width: 100%;
@ -238,6 +331,12 @@ export default {
color: #fff !important;
}
}
.picnum {
font-size: 12px;
}
}
.el-loading-mask {
background-color: rgba(0, 0, 0, 0.3);
}
}
.parameterArea {

@ -105,25 +105,20 @@
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="exportData"></el-button>
</el-form-item>
</el-form>
</div>
<div class="pictureBox" v-loading="loading">
<div
v-if="picList.length !== 0"
style="width: 100%"
v-loading="loading"
>
<div class="picShowBox" v-if="picList.length !== 0" style="width: 100%">
<el-card
class="box-card imgList"
v-for="(item, index) in picList"
:key="index"
>
<div class="bigpic" v-if="item.path.indexOf('videos') == -1">
<el-image
lazy
:src="item.path + '!1366x768'"
:preview-src-list="[item.path]"
>
<el-image lazy :src="item.path" :preview-src-list="[item.path]">
<template slot="error">
<img src="../../assets/img/nodatapic2.jpg" />
</template>
@ -147,6 +142,14 @@
}}
</p>
</div>
<div class="deleteBox">
<el-button
title="删除照片"
type="primary"
icon="el-icon-delete"
@click.stop="deletePic(item)"
></el-button>
</div>
</div>
<div class="bigpic" v-else>
<!-- <el-image :src="item.path" lazy></el-image> -->
@ -178,6 +181,14 @@
}} -->
</p>
</div>
<div class="deleteBox">
<el-button
title="删除照片"
type="primary"
icon="el-icon-delete"
@click.stop="deletePic(item)"
></el-button>
</div>
</div>
</el-card>
</div>
@ -192,6 +203,7 @@
@size-change="handleSizeChange"
:current-page="page"
:page-size="pageSize"
:page-sizes="[20, 50, 100, 200]"
layout="sizes, prev, pager, next, jumper,total"
:total="total"
background
@ -203,9 +215,14 @@
</template>
<script>
import { getSearchInfo, getRealtimePhoto } from "@/utils/api/index";
import {
getSearchInfo,
getRealtimePhoto,
deletePicList,
} from "@/utils/api/index";
import defaultImage from "../../assets/img/nodatapic2.jpg";
export default {
name: "realTimeSearch",
data() {
return {
pickerOptions: {
@ -228,7 +245,7 @@ export default {
termid: -1,
search: "",
},
tdTermid: "",
page: 1, //
pageSize: 20, //
total: 0, //
@ -253,6 +270,7 @@ export default {
"starttime",
new Date(new Date().toLocaleDateString()).getTime()
);
this.getSearchdy();
} else {
this.getSearchdy();
@ -261,7 +279,8 @@ export default {
this.formdata.towerid = this.$route.query.towerId;
this.formdata.channelid = this.$route.query.channelId;
this.formdata.termid = this.$route.query.termId;
this.$set(this.formdata, "starttime", this.$route.query.date);
this.$set(this.formdata, "starttime", Number(this.$route.query.date));
this.getPicData();
}
},
methods: {
@ -274,7 +293,6 @@ export default {
.then((res) => {
this.dyOptions = this.dyOptions.concat(res.data.list);
console.log(this.dyOptions);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.dyid = this.dyOptions[0].id;
} else {
@ -296,7 +314,6 @@ export default {
} else {
this.formdata.lineid = Number(this.$route.query.lineId);
}
this.getSearchgt();
})
.catch((err) => {});
@ -324,7 +341,12 @@ export default {
.then((res) => {
this.zzOptions = [{ id: -1, name: "全部" }];
this.zzOptions = this.zzOptions.concat(res.data.list);
// this.formdata.termid = this.zzOptions[0].id;
console.log("切换了杆塔");
// console.log(this.formdata.termid);
// console.log(this.zzOptions[0].id);
// this.formdata.termid = this.zzOptions[0].id;
// console.log(this.formdata.termid);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.termid = this.zzOptions[0].id;
} else {
@ -348,7 +370,15 @@ export default {
this.formdata.channelid = Number(this.$route.query.channelId);
}
this.getPicData();
//this.getPicData();
})
.catch((err) => {});
},
getSearchtdAlone() {
getSearchInfo({ type: 5, id: this.tdTermid })
.then((res) => {
this.tdOptions = [{ id: -1, name: "全部", alias: null }];
this.tdOptions = this.tdOptions.concat(res.data.list);
})
.catch((err) => {});
},
@ -357,13 +387,15 @@ export default {
this.loading = true;
this.$set(this.formdata, "pageindex", this.page);
this.$set(this.formdata, "pagesize", this.pageSize);
console.log(this.formdata);
getRealtimePhoto(this.formdata)
.then((res) => {
this.picList = [];
// this.picList = [];
this.picList = res.data.list;
this.total = res.data.total;
this.tdTermid = res.data.list[0].termid;
this.getSearchtdAlone();
console.log(this.$route.query);
this.loading = false;
})
.catch((err) => {
@ -384,11 +416,25 @@ export default {
this.page = 1;
this.getPicData();
},
exportData() {
console.log(this.formdata);
exportPhotoJoggle(this.formdata)
.then((res) => {
console.log(res);
const now = this.$moment(new Date());
const formattedTime = now.format("YYYY年MM月DD日HH时mm分"); // "2023-04-01_15_30_00"
const blob = new Blob([res]);
const link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = `运维数据报表_${formattedTime}.xls`;
link.click();
})
.catch((err) => {});
},
//
handleCurrentChange(val) {
this.page = val;
this.picList = [];
//this.picList = [];
this.getPicData();
},
//
@ -396,6 +442,37 @@ export default {
this.pageSize = val;
this.getPicData();
},
deletePic(val) {
console.log(val);
let deleteArr = [];
deleteArr.push(val.picid);
console.log(deleteArr);
deletePicList({ list: deleteArr })
.then((res) => {
console.log(res);
this.$confirm("此操作将永久删除该图片, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$message({
type: "success",
showClose: true,
message: "删除成功!",
});
this.getPicData();
})
.catch(() => {
this.$message({
type: "info",
showClose: true,
message: "已取消删除",
});
});
})
.catch((err) => {});
},
},
};
</script>
@ -420,8 +497,12 @@ export default {
flex-wrap: wrap;
height: calc(100% - 135px);
max-height: calc(100% - 135px);
overflow: auto;
border: 1px solid #eee;
.picShowBox {
height: 100%;
overflow: auto;
}
.imgList {
width: calc((100% - 104px) / 4);
@ -441,17 +522,28 @@ export default {
.bigpic {
width: 100%;
height: 100%;
background-size: 100% 100%;
//background-size: 100% 100%;
position: relative;
.el-image {
width: 100%;
height: 100%;
.el-image__placeholder {
background: url(../../assets/img/nopicbg.png) no-repeat center;
background-size: 20% 20%;
}
img {
cursor: pointer;
width: 100%;
height: 200px;
}
}
&:hover {
.deleteBox {
display: block;
}
}
}
.caption {
position: absolute;
@ -477,6 +569,30 @@ export default {
padding-right: 5px;
}
}
.deleteBox {
position: absolute;
right: 4px;
top: 4px;
z-index: 2;
display: none;
.el-button {
width: auto;
background: rgba(0, 0, 0, 0.5);
border: 1px solid transparent;
color: #fff;
font-size: 16px;
padding: 3px;
}
&:hover {
.el-button {
background: #f56c6c;
//color: #f56c6c;
}
}
}
}
.el-loading-mask {
background-color: rgba(255, 255, 255, 0.4);
}
.noPicBox {
display: flex;

@ -0,0 +1,624 @@
<template>
<div class="equipmentStatusBox" ref="statisRef">
<div class="searchBox" ref="searchref" v-if="drawerSearch">
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="电压等级" class="dyclass">
<el-select v-model="formdata.dyid" @change="getSearchxl">
<el-option
v-for="item in dyOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
{{ item.name }}
</el-option>
</el-select>
</el-form-item>
<el-form-item label="线路名称" class="xlclass">
<el-select v-model="formdata.lineid" @change="getSearchgt" filterable>
<el-option
v-for="item in xlOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="杆塔名称" class="gtclass">
<el-select v-model="formdata.towerid" filterable>
<el-option
v-for="item in gtOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否在线" class="isonLineClass">
<el-select v-model="formdata.isonline" filterable>
<el-option
v-for="item in onlineOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="规约" class="isonLineClass">
<el-select v-model="formdata.protocol" filterable>
<el-option
v-for="item in protocolOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label="活动"
class="activitybox"
v-if="roleName === 'superadmin' || roleName === 'Matthew'"
>
<el-select
@keyup.enter.native="onSubmit()"
v-model="formdata.activityId"
filterable
@change="changeActive"
>
<el-option
v-for="item in activityOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="开始日期" class="dateclass">
<el-date-picker
v-model="formdata.starttime"
type="datetime"
placeholder="开始日期"
value-format="timestamp"
:picker-options="pickerOptions"
>
</el-date-picker>
</el-form-item>
<el-form-item label="结束日期" class="dateclass">
<el-date-picker
v-model="formdata.endtime"
type="datetime"
placeholder="结束日期"
value-format="timestamp"
:picker-options="pickerOptions"
>
</el-date-picker>
</el-form-item>
<el-form-item label="装置查询" class="schclass">
<el-input
v-model="formdata.search"
placeholder="请输入设备名称"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
<el-button type="primary">导出</el-button>
</el-form-item>
</el-form>
</div>
<div class="deviceTable">
<el-table
v-loading="termLoading"
ref="multipleTable"
:data="termAllList"
tooltip-effect="dark"
stripe
style="width: 100%"
:height="tableheight"
>
<template slot="empty">
<el-empty :image-size="160" description="暂无数据"></el-empty>
</template>
<el-table-column label="序号" width="50px" fixed>
<template slot-scope="scope">
{{ (page - 1) * pageSize + scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column
prop="dyName"
label="电压等级"
fixed
show-overflow-tooltip
>
</el-table-column>
<el-table-column prop="lineName" label="线路名称" min-width="180" fixed>
</el-table-column>
<el-table-column
prop="towerName"
label="杆塔名称"
min-width="180"
show-overflow-tooltip
fixed
>
</el-table-column>
<!-- <el-table-column prop="displayName" label="设备名称" min-width="180" fixed> </el-table-column> -->
<el-table-column prop="cmdid" label="装置id" min-width="180" fixed>
<template slot-scope="scope">
{{ scope.row.cmdid }}
</template>
</el-table-column>
<el-table-column prop="sim" label="SIM卡号" min-width="180">
</el-table-column>
<el-table-column prop="netType" label="网络类型">
<template slot-scope="scope">
<span v-if="scope.row.netType == 1"></span>
<span v-else-if="scope.row.netType == 2">联通</span>
<span v-else-if="scope.row.netType == 3">电信</span>
</template>
</el-table-column>
<el-table-column prop="onlinestatus" label="状态">
<template slot-scope="scope">
<span style="color: #169e8c" v-if="scope.row.onlinestatus == 1"
>在线</span
>
<span style="color: #f56c6c" v-else-if="scope.row.onlinestatus == 0"
>离线</span
>
</template>
</el-table-column>
<el-table-column prop="model" label="装置型号" min-width="120">
</el-table-column>
<el-table-column prop="bsManufacturer" label="装置厂家">
</el-table-column>
<el-table-column prop="protocolName" label="规约版本" min-width="180">
</el-table-column>
<el-table-column prop="workingDate" label="投运日期" min-width="140">
</el-table-column>
<el-table-column prop="onlinestatus" label="最新运行状态">
</el-table-column>
<el-table-column prop="photoInfo.totalDays" label="在线天数">
</el-table-column>
<el-table-column prop="photoInfo.photoCount" label="图片数量">
</el-table-column>
<el-table-column
prop="photoInfo.lastRecvTime"
label="最后数据上送时间"
min-width="140"
>
</el-table-column>
<el-table-column
prop="photoInfo.lastPhotoTime"
label="最后图片上送时间"
min-width="140"
>
</el-table-column>
<el-table-column
prop="lastInfo.updateTimeStr"
label="最新基本信息采集时间"
min-width="140"
>
</el-table-column>
<el-table-column
prop="lastInfo.equipName"
label="装置名称"
min-width="150"
>
</el-table-column>
<el-table-column prop="lastInfo.model" label="装置型号" min-width="120">
</el-table-column>
<el-table-column prop="lastInfo.version" label="装置版本号">
</el-table-column>
<el-table-column
prop="lastInfo.bsManu"
label="生产厂家"
min-width="120"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="lastInfo.productionDate"
label="生产日期"
min-width="140"
>
</el-table-column>
<el-table-column prop="lastInfo.bsId" label="出厂编号" min-width="150">
</el-table-column>
<el-table-column
prop="workingStatus.wsUpdateTime"
label="最新工作状态采集时间"
min-width="140"
>
<template slot-scope="scope">
{{
scope.row.workingStatus.wsUpdateTime == 0 ||
scope.row.workingStatus.wsUpdateTime == null
? ""
: $moment(scope.row.workingStatus.wsUpdateTime * 1000).format(
"YYYY-MM-DD HH:mm:ss"
)
}}</template
>
</el-table-column>
<el-table-column prop="workingStatus.batteryVoltage" label="电源电压">
</el-table-column>
<el-table-column prop="workingStatus.opTemperature" label="工作温度">
</el-table-column>
<el-table-column prop="workingStatus.batteryCapacity" label="电池电量">
</el-table-column>
<el-table-column prop="workingStatus.floatingCharge" label="浮充状态">
</el-table-column>
<el-table-column
prop="workingStatus.totalWorkingTime"
label="工作总时间"
>
</el-table-column>
<el-table-column prop="workingStatus.workingTime" label="连续工作时间">
</el-table-column>
<el-table-column
prop="workingStatus.connectionState"
label="网络连接状态"
>
</el-table-column>
<el-table-column
prop="workingStatus.wsUpdateTime"
label="最新运行状态采集时间"
min-width="140"
>
<template slot-scope="scope">
{{
scope.row.workingStatus.wsUpdateTime == 0 ||
scope.row.workingStatus.wsUpdateTime == null
? ""
: $moment(scope.row.workingStatus.wsUpdateTime * 1000).format(
"YYYY-MM-DD HH:mm:ss"
)
}}</template
>
</el-table-column>
<el-table-column
prop="workingStatus.signalStrength4g"
label="4G信号强度"
>
</el-table-column>
<el-table-column
prop="workingStatus.signalStrength2g"
label="2G信号强度"
>
</el-table-column>
<el-table-column prop="workingStatus.remainingRam" label="剩余运行内存">
</el-table-column>
<el-table-column prop="workingStatus.remainingRom" label="剩余存储内">
</el-table-column>
<el-table-column
prop="positions.updateTime"
label="最新GPS位置采集时间"
min-width="140"
>
</el-table-column>
<el-table-column prop="positions.radius" label="半径">
</el-table-column>
<el-table-column prop="positions.latitude" label="维度">
</el-table-column>
<el-table-column prop="positions.longitude" label="经度">
</el-table-column>
</el-table>
<div class="pageNation">
<el-pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page="page"
:page-size="pageSize"
layout="sizes, prev, pager, next, jumper,total"
:total="total"
background
>
</el-pagination>
</div>
</div>
<!-- <ipDialog ref="ipDialogref"></ipDialog>
<photoDialog ref="photoDialogref"></photoDialog> -->
</div>
</template>
<script>
import {
gettermAllList,
getSearchInfo,
getProtocolList,
getActivityApi,
} from "@/utils/api/reportApi";
// import ipDialog from "./components/ipDialog";
// import photoDialog from "./components/termAllList";
export default {
name: "photoStatisBox",
components: {
// ipDialog,
// photoDialog,
},
props: ["statusFlag"],
data() {
return {
roleName: "",
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); //
},
},
termAllList: [],
dyOptions: [{ id: -1, name: "全部" }], //
xlOptions: [{ id: -1, name: "全部" }], //线
gtOptions: [{ id: -1, name: "全部" }], //
activityOptions: [{ id: -1, name: "全部" }], //
onlineOptions: [
{ id: -1, name: "全部" },
{ id: 1, name: "在线" },
{ id: 0, name: "离线" },
],
protocolOptions: [{ id: -1, name: "全部" }], //
formdata: {
dyid: -1,
lineid: -1,
towerid: -1,
isonline: -1,
protocol: -1,
activityId: -1,
starttime: new Date(new Date().setHours(0, 0, 0, 0)).getTime(), // 00:00:00
endtime: new Date(new Date().setHours(23, 59, 59, 0)).getTime(), // 23:59:59
search: "",
},
page: 1, //
pageSize: 20, //
total: 0, //
termLoading: false,
drawerSearch: false,
tableheight: "100%",
};
},
created() {
this.roleName = localStorage.getItem("userName");
},
mounted() {
// if (this.statusFlag) {
// this.getSearchdy();
// this.getProtocol();
// this.getactiveList();
// }
},
watch: {},
methods: {
initfn() {
this.getSearchdy();
this.getProtocol();
this.getactiveList();
},
//
getSearchdy() {
getSearchInfo({ type: 1 })
.then((res) => {
this.dyOptions = this.dyOptions.concat(res.data.list);
console.log(this.dyOptions);
this.getSearchxl();
})
.catch((err) => {});
},
//线
getSearchxl() {
getSearchInfo({ type: 2, id: this.formdata.dyid })
.then((res) => {
this.xlOptions = this.xlOptions.concat(res.data.list);
this.getSearchgt();
})
.catch((err) => {});
},
//
getSearchgt() {
getSearchInfo({ type: 3, id: this.formdata.lineid })
.then((res) => {
this.gtOptions = this.gtOptions.concat(res.data.list);
this.onSubmit();
})
.catch((err) => {});
},
getProtocol() {
//
getProtocolList()
.then((res) => {
console.log(res);
this.protocolOptions = this.protocolOptions.concat(res.data.list);
this.formdata.protocol = this.protocolOptions[0].id;
})
.catch((err) => {});
},
//
getactiveList() {
getActivityApi()
.then((res) => {
console.log(res);
// this.activityOptions = this.activityOptions.concat(res.data.list);
let activeArr = res.data.map((item) => ({
id: item.id,
name: item.title,
}));
this.activityOptions = this.activityOptions.concat(activeArr);
this.formdata.activityId = this.activityOptions[0].id;
// this.formdata.activityId =
// JSON.parse(localStorage.getItem("activeId")) !== null
// ? JSON.parse(localStorage.getItem("activeId"))
// : this.activityOptions[0].id;
})
.catch((err) => {});
},
changeActive(val) {
//localStorage.setItem("activeId", JSON.stringify(val));
},
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
return this.$message({
duration: 1500,
showClose: true,
message: "开始日期不能大于结束日期",
type: "warning",
});
}
this.page = 1;
this.getAllFun();
},
//
getAllFun() {
console.log(this.formdata);
this.termLoading = true;
let params = {
dataFlag: "PSOCB", //
start: this.formdata.starttime / 1000,
end: this.formdata.endtime / 1000,
pageNum: this.page,
pageSize: this.pageSize,
};
//
if (this.formdata.dyid !== -1) {
params.dyId = this.formdata.dyid;
}
if (this.formdata.lineid !== -1) {
params.lineId = this.formdata.lineid;
}
if (this.formdata.towerid !== -1) {
params.towerId = this.formdata.towerid;
}
if (this.formdata.isonline !== -1) {
params.isonline = this.formdata.isonline;
}
if (this.formdata.protocol !== -1) {
params.protocol = this.formdata.protocol;
}
if (this.formdata.activityId !== -1) {
params.activityId = this.formdata.activityId;
}
if (this.formdata.search !== "") {
params.cmdid = this.formdata.search;
}
setTimeout(() => {
gettermAllList(params)
.then((res) => {
console.log(res);
this.termAllList = res.data.list;
this.total = res.data.total;
this.termLoading = false;
})
.catch((err) => {
this.termLoading = false;
});
}, 100);
},
//
handleCurrentChange(val) {
this.page = val;
this.getAllFun();
},
//
handleSizeChange(val) {
this.pageSize = val;
this.getAllFun();
},
// //
// handleShowPhoto(row) {
// let params = this.formdata;
// this.$refs.photoDialogref.display(row, params);
// },
// // ip
// handleShowIp(row) {
// this.$refs.ipDialogref.display(row);
// },
showSearch() {
this.drawerSearch = !this.drawerSearch;
console.log(this.drawerSearch);
this.$nextTick(() => {
if (this.drawerSearch) {
//
console.log(this.$refs.statisRef.offsetHeight);
const searchBoxHeight = this.$refs.searchref.offsetHeight;
console.log("搜索框的高度:", searchBoxHeight);
this.tableheight =
this.$refs.statisRef.offsetHeight - searchBoxHeight - 36;
console.log(this.tableheight);
} else {
this.tableheight = "100%";
}
});
},
},
};
</script>
<style lang="less">
.equipmentStatusBox {
height: 100%;
.searchBox {
.dyclass {
.el-select {
width: 120px;
}
}
.xlclass {
.el-select {
width: 150px;
}
}
.gtclass {
.el-select {
width: 180px;
}
}
.tdclass {
.el-select {
width: 80px;
}
}
.dateclass {
.el-date-editor.el-input,
.el-date-editor.el-input__inner {
width: 190px;
}
}
.isonLineClass {
.el-form-item__content {
width: 120px;
}
}
}
.deviceTable {
height: calc(100% - 32px);
//background: #fcc;
.el-table {
.cell {
text-align: center;
vertical-align: middle; /* 如果需要垂直居中 */
}
}
.el-table {
color: #000;
thead {
color: #000;
font-weight: bold;
}
th.el-table__cell {
background: #dcdcdc !important;
}
td.el-table__cell,
th.el-table__cell.is-leaf {
border-bottom: 1px solid #dcdcdc;
}
.el-table__cell {
border-right: 1px solid #dcdcdc;
}
}
}
}
</style>

@ -0,0 +1,119 @@
<template>
<div class="reportDataBox">
<!-- <div class="reoprtContain"></div> -->
<el-tabs type="border-card" @tab-click="handleTabClick">
<el-tab-pane label="照片统计">
<span slot="label">
照片统计
<el-button
@click.stop="handlePicSearch"
v-if="picSearchFlag"
type="primary"
icon="el-icon-search"
></el-button>
</span>
<photostatis ref="photoStatisRef"></photostatis>
</el-tab-pane>
<el-tab-pane label="设备状态列表">
<span slot="label">
设备状态列表
<el-button
@click.stop="handlestatusSearch"
v-if="statusFlag"
type="primary"
icon="el-icon-search"
></el-button>
</span>
<equipmentStatus
ref="equipmentStatusRef"
:statusFlag="statusFlag"
></equipmentStatus
></el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import {} from "@/utils/api/index";
import photostatis from "./photostatis/index";
import equipmentStatus from "./equipmentStatus/index";
export default {
name: "reportData",
components: {
photostatis,
equipmentStatus,
},
data() {
return {
picSearchFlag: true,
statusFlag: false,
pictotalFlag: false,
};
},
created() {},
mounted() {},
watch: {},
methods: {
handleTabClick(tab, event) {
//
const tabName = tab.label;
console.log(tab);
if (tabName === "照片统计") {
this.picSearchFlag = true;
this.statusFlag = false;
this.pictotalFlag = false;
//
if (this.$refs.photoStatisRef) {
this.$refs.photoStatisRef.onSubmit(); // someMethod
}
} else if (tabName === "设备状态列表") {
this.picSearchFlag = false;
this.statusFlag = true;
this.pictotalFlag = false;
//
if (this.$refs.equipmentStatusRef) {
this.$refs.equipmentStatusRef.initfn(); // someOtherMethod
//this.$refs.equipmentStatusRef.onSubmit(); // someOtherMethod
}
}
//
},
handlePicSearch() {
console.log("aaaaaaaaaaaa");
this.$refs.photoStatisRef.showSearch();
},
handlestatusSearch() {
console.log("bbbbbb");
this.$refs.equipmentStatusRef.showSearch();
},
},
};
</script>
<style lang="less">
.reportDataBox {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
.el-tabs--border-card > .el-tabs__content {
padding: 8px;
}
.el-tabs {
height: 100%;
.el-tabs__header {
.el-button--default,
.el-button--primary {
width: auto;
margin-left: 12px;
}
}
.el-tabs__content {
height: calc(100% - 65px);
//overflow: auto;
.el-tab-pane {
height: 100%;
}
}
}
}
</style>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save