detail.vue 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486
  1. <template>
  2. <div class="safetyList">
  3. <customHeader>监控分站管理详情</customHeader>
  4. <div class="content">
  5. <a-tabs class="tab-box" v-model:activeKey="activeKey" @change="onChangeTab">
  6. <a-tab-pane tab="分站监测" key="device" />
  7. <a-tab-pane tab="历史数据" key="history" />
  8. <a-tab-pane tab="监测详情" key="manageAuto" />
  9. <a-tab-pane tab="操作记录" key="operationRecord" />
  10. </a-tabs>
  11. <div class="box-content">
  12. <!-- 分站监测 -->
  13. <div class="now-content" v-if="activeKey == 'device'">
  14. <div class="left-box">
  15. <div class="left-title">
  16. <div class="title-fz">
  17. <span>分站:</span>
  18. <span>
  19. [通讯正常]
  20. <span class="zd-open">{{ openNum || 0 }}</span>
  21. </span>
  22. <span>
  23. [通讯中断]
  24. <span class="zd-close">{{ clsoeNum || 0 }}</span>
  25. </span>
  26. </div>
  27. <div class="title-btn" style="margin-left: 55%">
  28. <a-button type="primary" size="small" @click="getAllShow">显示全部</a-button>
  29. </div>
  30. </div>
  31. <div class="left-content">
  32. <div class="card-box" v-for="(item, index) in cardList" :key="index">
  33. <div :class="[
  34. 'card-item',
  35. {
  36. selected: selectedIndex === index,
  37. 'card-itemN': item.isNewAccess,
  38. 'card-itemL': !item.isNewAccess && item.linkstatus,
  39. 'card-itemD': !item.isNewAccess && !item.linkstatus,
  40. },
  41. ]" @click="cardClick(item, index)">
  42. <div class="card-item-label">{{ item.strname }}</div>
  43. </div>
  44. <div :class="activeIndex % 4 == 3 ? 'card-modal1' : 'card-modal'" v-if="activeIndex == index && isShow">
  45. <div class="modal-name">站点名称:</div>
  46. <a-input v-model:value="stationName" size="small" placeholder="请输入" @blur="changeName" />
  47. <div class="modal-lj">连接状态:</div>
  48. <a-radio-group v-model:value="stationStatus" size="small" :options="ljList" @change="changeStatus" />
  49. <a-popconfirm title="删除内容无法恢复,是否删除" ok-text="确定" cancel-text="取消" @confirm="handleDelStation"
  50. @cancel="handleCancelDelStation">
  51. <a-button type="primary" preIcon="ant-design:delete-outlined" size="mini"
  52. class="down-btn">删除</a-button>
  53. </a-popconfirm>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. <div class="right-box">
  59. <div class="right-title">详细信息:</div>
  60. <a-table size="small" :scroll="{ y: 680 }" :columns="columns" :data-source="tableData"
  61. :pagination="pagination" @change="pageChange">
  62. <template #action="{ record }">
  63. <a-button v-if="!record.devInfoList" type="primary" :disabled="record.linkId != '0'" size="small"
  64. @click="handlerunDeviceMonitor(record, '启动')">启动</a-button>
  65. <a-button type="success" size="small" style="margin: 0px 10px"
  66. @click="handlerunDeviceMonitor(record, '编辑')">编辑</a-button>
  67. <a-popconfirm title="删除内容无法恢复,是否删除" ok-text="确定" cancel-text="取消"
  68. @confirm="handlerunDeviceMonitor(record, '删除')" @cancel="handleCancelDelStation">
  69. <a-button v-if="!record.devInfoList" type="success" size="small"
  70. style="margin-right:10px">删除</a-button>
  71. </a-popconfirm>
  72. <a-button type="primary" v-if="!record.devInfoList" size="small" @click="debugClick(record)">{{
  73. record.debugTitle }}</a-button>
  74. </template>
  75. <template #bodyCell="{ column, text }">
  76. <template v-if="column.dataIndex === 'valueJc' && text">
  77. <div v-for="item in text.split(',')" :key="item">
  78. <span
  79. v-if="item.substring(item.indexOf(':') + 1) && !isNaN(parseFloat(item.substring(item.indexOf(':') + 1)))"
  80. style="display: inline-block; width: 42%; text-align: right; color: rgb(0, 242, 255); margin-right: 5px">{{
  81. item.substring(0, item.indexOf(':') + 1) }}</span>
  82. <span
  83. v-if="item.substring(item.indexOf(':') + 1) && !isNaN(parseFloat(item.substring(item.indexOf(':') + 1)))"
  84. style="display: inline-block; width: 52%; text-align: left; color: #fff">{{
  85. item.substring(item.indexOf(':') + 1) === '1'
  86. ? '正风'
  87. : item.substring(item.indexOf(':') + 1) === '2'
  88. ? '反风'
  89. : item.substring(item.indexOf(':') + 1)
  90. }}
  91. </span>
  92. </div>
  93. </template>
  94. </template>
  95. </a-table>
  96. <!-- 一键启动弹窗 -->
  97. <a-modal style="top: 300px; left: 360px" v-model:visible="visibleModal" :width="450" title="一键启动"
  98. @ok="handleOk" @cancel="handleCancel">
  99. <a-form :model="startupData" labelAlign="right" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
  100. <a-form-item label="安装位置">
  101. <a-input v-model:value="startupData.address" placeholder="请输入" style="width: 260px" />
  102. </a-form-item>
  103. </a-form>
  104. </a-modal>
  105. <!-- 编辑弹窗 -->
  106. <a-modal style="top: 300px; left: 360px" v-model:visible="visibleModalEdit" :width="450" title="编辑信息"
  107. @ok="handleOkEdit" @cancel="handleCancelEdit">
  108. <a-form :model="startupDataEdit" labelAlign="right" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
  109. <a-form-item label="安装位置">
  110. <a-input v-model:value="startupDataEdit.address" placeholder="请输入" style="width: 260px" />
  111. </a-form-item>
  112. </a-form>
  113. </a-modal>
  114. <!-- 调试弹窗 -->
  115. <a-modal style="top: 300px; left: 360px" v-model:visible="visibleModalDebug" :width="450" title="调试信息"
  116. @ok="handleOkDebug" @cancel="handleCancelDebug">
  117. <a-form :model="startupDataDebug" labelAlign="right" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
  118. <a-form-item label="风速">
  119. <a-input v-model:value="startupDataDebug.speed" placeholder="请输入" style="width: 260px" />
  120. </a-form-item>
  121. <a-form-item label="风向">
  122. <a-select v-model:value="startupDataDebug.direction" style="width: 260px">
  123. <a-select-option v-for="file in derictList" :key="file.label" :value="file.value">{{ file.label
  124. }}</a-select-option>
  125. </a-select>
  126. </a-form-item>
  127. </a-form>
  128. </a-modal>
  129. </div>
  130. </div>
  131. <!-- 历史数据 -->
  132. <div class="history-content" v-if="activeKey == 'history'">
  133. <div class="left-box">
  134. <div class="left-title">
  135. <div class="title-fz">
  136. <span>分站:</span>
  137. <span>
  138. [通讯正常]
  139. <span class="zd-open">{{ openNum || 0 }}</span>
  140. </span>
  141. <span>
  142. [通讯中断]
  143. <span class="zd-close">{{ clsoeNum || 0 }}</span>
  144. </span>
  145. </div>
  146. </div>
  147. <div class="left-content">
  148. <div class="card-box" v-for="(item, index) in cardList" :key="index">
  149. <div :class="[
  150. 'card-item',
  151. {
  152. selected: selectedIndex === index,
  153. 'card-itemN': item.isNewAccess,
  154. 'card-itemL': !item.isNewAccess && item.linkstatus,
  155. 'card-itemD': !item.isNewAccess && !item.linkstatus,
  156. },
  157. ]" @click="cardClick(item, index)">
  158. <div class="card-item-label">{{ item.strname }}</div>
  159. </div>
  160. <div :class="activeIndex % 4 == 3 ? 'card-modal1' : 'card-modal'" v-if="activeIndex == index && isShow">
  161. <div class="modal-name">站点名称:</div>
  162. <a-input v-model:value="stationName" size="small" placeholder="请输入" @blur="changeName" />
  163. <div class="modal-lj">连接状态:</div>
  164. <a-radio-group v-model:value="stationStatus" size="small" :options="ljList" @change="changeStatus" />
  165. <a-popconfirm title="删除内容无法恢复,是否删除" ok-text="确定" cancel-text="取消" @confirm="handleDelStation"
  166. @cancel="handleCancelDelStation">
  167. <a-button type="primary" preIcon="ant-design:delete-outlined" size="mini"
  168. class="down-btn">删除</a-button>
  169. </a-popconfirm>
  170. </div>
  171. </div>
  172. </div>
  173. </div>
  174. <div class="right-box">
  175. <HistoryTable class="historytable" :scroll="scroll" :historyColumns="historyColumns"
  176. :stationId="stationId" />
  177. </div>
  178. </div>
  179. <!-- 监测详情 -->
  180. <div class="detail-content" v-if="activeKey == 'manageAuto'">
  181. <!-- <a-button preIcon="ant-design:sync-outlined" @click="visibleModalEdit1 = true">重置</a-button> -->
  182. <a-table size="small" :scroll="{ y: 710 }" :columns="columnsDetail" :data-source="tableData1">
  183. <template #action="{ record }">
  184. <a-button v-if="hasPermission('operateRecord:return')" type="primary" size="small"
  185. @click="handleEdit(record)">编辑</a-button>
  186. </template>
  187. <template #bodyCell="{ column, text }"></template>
  188. </a-table>
  189. <!-- 编辑弹窗 -->
  190. <a-modal v-model:visible="visibleModalEdit1" :width="1100" @cancel="cancenModal"
  191. :bodyStyle="{ display: 'flex', height: '680px', 'overflow-y': 'auto', 'margin-bottom': '15px' }"
  192. title="编辑信息" :footer="null">
  193. <a-form :model="formView" labelAlign="right" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
  194. <a-form-item label="第一路风速风向:">
  195. <a-input v-model:value="formView.dylfsfx" placeholder="请输入" disabled
  196. style="width: 260px; margin-right: 10px" />
  197. </a-form-item>
  198. <a-form-item label="第一路报警状态:">
  199. <a-input v-model:value="formView.dylbjzt" placeholder="请输入" disabled
  200. style="width: 260px; margin-right: 10px" />
  201. </a-form-item>
  202. <a-form-item label="第一路1发2收AD值:">
  203. <a-input v-model:value="formView.dyl1f2sADz" placeholder="请输入" disabled
  204. style="width: 260px; margin-right: 10px" />
  205. </a-form-item>
  206. <a-form-item label="第一路2发1收AD值:">
  207. <a-input v-model:value="formView.dyl2f1sADz" placeholder="请输入" disabled
  208. style="width: 260px; margin-right: 10px" />
  209. </a-form-item>
  210. <a-form-item label="通风量:">
  211. <a-input v-model:value="formView.tfl" placeholder="请输入" disabled
  212. style="width: 260px; margin-right: 10px" />
  213. </a-form-item>
  214. <a-form-item label="硬件版本:">
  215. <a-input v-model:value="formView.yjbb" placeholder="请输入" disabled
  216. style="width: 260px; margin-right: 10px" />
  217. </a-form-item>
  218. <a-form-item label="软件版本:">
  219. <a-input v-model:value="formView.rjbb" placeholder="请输入" disabled
  220. style="width: 260px; margin-right: 10px" />
  221. </a-form-item>
  222. <a-form-item label="在线离线标志:">
  223. <a-input v-model:value="formView.zxlxbz" placeholder="请输入" disabled
  224. style="width: 260px; margin-right: 10px" />
  225. </a-form-item>
  226. <a-form-item label="日期和时间:">
  227. <a-input v-model:value="formView.rqsj" placeholder="请输入" disabled
  228. style="width: 260px; margin-right: 10px" />
  229. </a-form-item>
  230. </a-form>
  231. <a-form :model="formEdit" labelAlign="right" :label-col="{ span: 7 }" :wrapper-col="{ span: 17 }">
  232. <a-form-item label="传感器设备:">
  233. <a-select v-model:value="formEdit.cgq" @change="changeCgq" style="width: 260px; margin-right: 10px">
  234. <a-select-option v-for="(file, index) in cgqList" :key="index" :value="file.value">{{ file.label
  235. }}</a-select-option>
  236. </a-select>
  237. <a-button type="success" @click="getDeviceList">读取</a-button>
  238. </a-form-item>
  239. <a-form-item label="RS485_MODBUS地址:">
  240. <a-input v-model:value="formEdit.rs485modbusdz" placeholder="请输入"
  241. style="width: 260px; margin-right: 10px" />
  242. <a-button class="down-btn" type="primary" @click="handleClick('RS485_MODBUS地址')">下发</a-button>
  243. </a-form-item>
  244. <a-form-item label="探头安装距离:">
  245. <a-input v-model:value="formEdit.ttazjl" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  246. <a-button class="down-btn" type="primary" @click="handleClick('探头安装距离')">下发</a-button>
  247. </a-form-item>
  248. <a-form-item label="基线距离:">
  249. <a-input v-model:value="formEdit.jxjl" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  250. <a-button class="down-btn" type="primary" @click="handleClick('基线距离')">下发</a-button>
  251. </a-form-item>
  252. <a-form-item label="安装角度:">
  253. <a-input v-model:value="formEdit.azjd" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  254. <a-button class="down-btn" type="primary" @click="handleClick('安装角度')">下发</a-button>
  255. </a-form-item>
  256. <a-form-item label="设置时长:">
  257. <a-input v-model:value="formEdit.szsz" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  258. <a-button class="down-btn" type="primary" @click="handleClick('设置时长')">下发</a-button>
  259. </a-form-item>
  260. <a-form-item label="数据平均周期:">
  261. <a-input v-model:value="formEdit.sjpjzq" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  262. <a-button class="down-btn" type="primary" @click="handleClick('数据平均周期')">下发</a-button>
  263. </a-form-item>
  264. <a-form-item label="第一路一发二收PG值:">
  265. <a-input v-model:value="formEdit.dylyfesPGz" placeholder="请输入"
  266. style="width: 260px; margin-right: 10px" />
  267. <a-button class="down-btn" type="primary" @click="handleClick('第一路一发二收PG值')">下发</a-button>
  268. </a-form-item>
  269. <a-form-item label="第一路二发一收PG值:">
  270. <a-input v-model:value="formEdit.dylefysPGz" placeholder="请输入"
  271. style="width: 260px; margin-right: 10px" />
  272. <a-button class="down-btn" type="primary" @click="handleClick('第一路二发一收PG值')">下发</a-button>
  273. </a-form-item>
  274. <a-form-item label="风道截面积:">
  275. <a-input v-model:value="formEdit.fdjmj" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  276. <a-button class="down-btn" type="primary" @click="handleClick('风道截面积')">下发</a-button>
  277. </a-form-item>
  278. <a-form-item label="第一路整体系数k:">
  279. <a-input v-model:value="formEdit.dylztxsk" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  280. <a-button class="down-btn" type="primary" @click="handleClick('第一路整体系数k')">下发</a-button>
  281. </a-form-item>
  282. <a-form-item label="第一路第一段系数:">
  283. <a-input v-model:value="formEdit.dyldydxs1" placeholder="请输入"
  284. style="width: 260px; margin-right: 10px" />
  285. <a-button class="down-btn" type="primary" @click="handleClick('第一路第一段系数')">下发</a-button>
  286. </a-form-item>
  287. <a-form-item label="第一路第二段系数:">
  288. <a-input v-model:value="formEdit.dyldedxs2" placeholder="请输入"
  289. style="width: 260px; margin-right: 10px" />
  290. <a-button class="down-btn" type="primary" @click="handleClick('第一路第二段系数')">下发</a-button>
  291. </a-form-item>
  292. <a-form-item label="第一路第三段系数:">
  293. <a-input v-model:value="formEdit.dyldsdxs3" placeholder="请输入"
  294. style="width: 260px; margin-right: 10px" />
  295. <a-button class="down-btn" type="primary" @click="handleClick('第一路第三段系数')">下发</a-button>
  296. </a-form-item>
  297. <a-form-item label="第一路第四段系数:">
  298. <a-input v-model:value="formEdit.dyldsdxs4" placeholder="请输入"
  299. style="width: 260px; margin-right: 10px" />
  300. <a-button class="down-btn" type="primary" @click="handleClick('第一路第四段系数')">下发</a-button>
  301. </a-form-item>
  302. <a-form-item label="第一路第五段系数:">
  303. <a-input v-model:value="formEdit.dyldwdxs5" placeholder="请输入"
  304. style="width: 260px; margin-right: 10px" />
  305. <a-button class="down-btn" type="primary" @click="handleClick('第一路第五段系数')">下发</a-button>
  306. </a-form-item>
  307. <a-form-item label="第一路第六段系数:">
  308. <a-input v-model:value="formEdit.dyldldxs6" placeholder="请输入"
  309. style="width: 260px; margin-right: 10px" />
  310. <a-button class="down-btn" type="primary" @click="handleClick('第一路第六段系数')">下发</a-button>
  311. </a-form-item>
  312. <a-form-item label="系数KB:">
  313. <a-input v-model:value="formEdit.xsKB" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  314. <a-button class="down-btn" type="primary" @click="handleClick('系数KB')">下发</a-button>
  315. </a-form-item>
  316. <a-form-item label="系数KB符号:">
  317. <a-input v-model:value="formEdit.xsKBfh" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  318. <a-button class="down-btn" type="primary" @click="handleClick('系数KB符号')">下发</a-button>
  319. </a-form-item>
  320. <a-form-item label="高报警阈值:">
  321. <a-input v-model:value="formEdit.gbjyz" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  322. <a-button class="down-btn" type="primary" @click="handleClick('高报警阈值')">下发</a-button>
  323. </a-form-item>
  324. <a-form-item label="低报警阈值:">
  325. <a-input v-model:value="formEdit.dbjyz" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  326. <a-button class="down-btn" type="primary" @click="handleClick('低报警阈值')">下发</a-button>
  327. </a-form-item>
  328. <a-form-item label="报警使能:">
  329. <a-input v-model:value="formEdit.bjsn" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  330. <a-button class="down-btn" type="primary" @click="handleClick('报警使能')">下发</a-button>
  331. </a-form-item>
  332. <a-form-item label="第一路485波特率:">
  333. <a-input v-model:value="formEdit.dyl485btl" placeholder="请输入"
  334. style="width: 260px; margin-right: 10px" />
  335. <a-button class="down-btn" type="primary" @click="handleClick('第一路485波特率')">下发</a-button>
  336. </a-form-item>
  337. <a-form-item label="四个字节保存密码:">
  338. <a-input v-model:value="formEdit.sgzjbcmm" placeholder="请输入" style="width: 260px; margin-right: 10px" />
  339. <a-button class="down-btn" type="primary" @click="handleClick('四个字节保存密码')">下发</a-button>
  340. </a-form-item>
  341. </a-form>
  342. </a-modal>
  343. </div>
  344. <!-- 操作记录 -->
  345. <div class="detail-content" v-if="activeKey == 'operationRecord'">
  346. <operateRecord :operationData="operationData" @getSearchRecord="getSearchRecord"></operateRecord>
  347. </div>
  348. </div>
  349. </div>
  350. </div>
  351. </template>
  352. <script setup lang="ts">
  353. import { ref, nextTick, reactive, onMounted, onUnmounted } from 'vue';
  354. import { usePermission } from '/@/hooks/web/usePermission';
  355. import {
  356. subStationList,
  357. getList,
  358. getListAll,
  359. getEdit,
  360. runDeviceMonitor,
  361. update158DevName,
  362. updateDebugStatus,
  363. get158StationData,
  364. set158StationData,
  365. get158StationDevices,
  366. set158StationRead,
  367. remove158Substation,
  368. get158SetLog,
  369. remove158Device
  370. } from '../safetyList.api';
  371. import { historyColumns } from '../historyLsit.data';
  372. import { columnsDetail, columns } from '../safetyList.data';
  373. import HistoryTable from './HistoryTable.vue';
  374. import customHeader from '/@/components/vent/customHeader.vue';
  375. import operateRecord from './operateRecord.vue'
  376. import dayjs from 'dayjs';
  377. const { hasPermission } = usePermission();
  378. let activeKey = ref('device');
  379. let cardList = ref<any[]>([]);
  380. let activeIndex = ref(null);
  381. let isShow = ref(false);
  382. let stationName = ref('');
  383. let stationStatus = ref(null);
  384. let ljList = reactive<any[]>([
  385. { value: 0, label: '断开' },
  386. { value: 1, label: '连接' },
  387. ]);
  388. let selectedIndex = ref(0);
  389. let openNum = ref(0);
  390. let clsoeNum = ref(0);
  391. let tableData = ref<any[]>([]);
  392. let tableData1 = ref<any[]>([]);
  393. //分页参数配置
  394. let pagination = reactive({
  395. current: 1, // 当前页码
  396. pageSize: 20, // 每页显示条数
  397. total: 0, // 总条目数,后端返回
  398. // showTotal: (total, range) => `${range[0]}-${range[1]} 条,总共 ${total} 条`, // 分页右下角显示信息
  399. showSizeChanger: true, // 是否可改变每页显示条数
  400. pageSizeOptions: ['10', '20', '30', '40', '50', '100'], // 可选的每页显示条数
  401. });
  402. let visibleModalEdit = ref(false);
  403. let visibleModalEdit1 = ref(false);
  404. let formEdit = reactive({
  405. id: '',
  406. cgq: '',
  407. rs485modbusdz: '',
  408. ttazjl: '',
  409. jxjl: '',
  410. azjd: '',
  411. szsz: '',
  412. sjpjzq: '',
  413. dylyfesPGz: '',
  414. dylefysPGz: '',
  415. fdjmj: '',
  416. dylztxsk: '',
  417. dyldydxs1: '',
  418. dyldedxs2: '',
  419. dyldsdxs3: '',
  420. dyldsdxs4: '',
  421. dyldwdxs5: '',
  422. dyldldxs6: '',
  423. xsKB: '',
  424. xsKBfh: '',
  425. gbjyz: '',
  426. dbjyz: '',
  427. bjsn: '',
  428. dyl485btl: '',
  429. sgzjbcmm: '',
  430. });
  431. let formView = reactive({
  432. dylfsfx: '',
  433. dylbjzt: '',
  434. dyl1f2sADz: '',
  435. dyl2f1sADz: '',
  436. tfl: '',
  437. yjbb: '',
  438. rjbb: '',
  439. zxlxbz: '',
  440. rqsj: '',
  441. });
  442. let formSearch = reactive({
  443. pageNo: 1,
  444. pageSize: 1000,
  445. starttime_begin: dayjs().add(-1, 'day').format('YYYY-MM-DD HH:mm:ss'),
  446. starttime_endtime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  447. nsubstationid: '',
  448. nwartype: 1001,
  449. });
  450. let cgqList = reactive<any[]>([]);
  451. let devId = ref('');
  452. let startupDataEdit = reactive({
  453. address: '',
  454. });
  455. //一键启动弹窗
  456. let visibleModal = ref(false);
  457. let startupData = reactive({
  458. address: '',
  459. });
  460. let paramId = ref('');
  461. let startupDataDebug = reactive({
  462. speed: '',
  463. direction: '',
  464. });
  465. let visibleModalDebug = ref(false);
  466. let debugFlag = ref('');
  467. let debugStationId = ref('');
  468. let debugDeviceId = ref('');
  469. let derictList = reactive<any[]>([
  470. { label: '正向', value: '0' },
  471. { label: '反向', value: '1' },
  472. ]);
  473. let devStationId = ref('');
  474. let stationId = ref('');
  475. const scroll = reactive({
  476. y: 680,
  477. });
  478. let operationData = ref<any[]>([])//操作记录列表
  479. //定时刷新左侧分站数据
  480. let timer: null | NodeJS.Timeout = null;
  481. function getMonitor(flag = false) {
  482. timer = setTimeout(
  483. async () => {
  484. await getSubStationList();
  485. if (timer) {
  486. timer = null;
  487. }
  488. getMonitor();
  489. },
  490. flag ? 0 : 3000
  491. );
  492. }
  493. let timer1: null | NodeJS.Timeout = null;
  494. function getMonitor1(flag = false) {
  495. timer1 = setTimeout(
  496. async () => {
  497. await getStationList();
  498. if (timer1) {
  499. timer1 = null;
  500. }
  501. getMonitor1();
  502. },
  503. flag ? 0 : 5000
  504. );
  505. }
  506. async function getDeviceList() {
  507. let res = await set158StationRead({ stationId: devStationId.value, deviceId: formEdit.cgq });
  508. if (res) {
  509. let data = await get158StationData();
  510. let list = data.filter((v) => v.stationId == devStationId.value)[0];
  511. // formView = {
  512. // dylfsfx: list.dylfsfx,
  513. // dylbjzt: list.dylbjzt,
  514. // dyl1f2sADz: list.dyl1f2sADz,
  515. // dyl2f1sADz: list.dyl2f1sADz,
  516. // tfl: list.tfl,
  517. // yjbb: list.yjbb,
  518. // rjbb: list.rjbb,
  519. // zxlxbz: list.zxlxbz,
  520. // rqsj: list.rqsj,
  521. // };
  522. formView = Object.assign({}, list)
  523. }
  524. }
  525. //tab选项切换
  526. async function onChangeTab(tab) {
  527. activeKey.value = tab;
  528. stationId.value = ''
  529. clearTimeout(timer1);
  530. clearTimeout(timer);
  531. if (activeKey.value == 'device') {
  532. await getSubStationList();
  533. await getStationList1();
  534. getMonitor()
  535. } else if (activeKey.value == 'history') {
  536. await getSubStationList();
  537. await getStationList();
  538. getMonitor()
  539. } else if (activeKey.value == 'manageAuto') {
  540. await getStationList();
  541. getMonitor1();
  542. } else if (activeKey.value == 'operationRecord') {
  543. await getSearchRecord({ stationId: '', deviceId: '' })
  544. }
  545. }
  546. //弹窗关闭
  547. function cancenModal() {
  548. formEdit.id = ''
  549. formEdit.cgq = ''
  550. formEdit.rs485modbusdz = ''
  551. formEdit.ttazjl = ''
  552. formEdit.jxjl = ''
  553. formEdit.azjd = ''
  554. formEdit.szsz = ''
  555. formEdit.sjpjzq = ''
  556. formEdit.dylyfesPGz = ''
  557. formEdit.dylefysPGz = ''
  558. formEdit.fdjmj = ''
  559. formEdit.dylztxsk = ''
  560. formEdit.dyldydxs1 = ''
  561. formEdit.dyldedxs2 = ''
  562. formEdit.dyldsdxs3 = ''
  563. formEdit.dyldsdxs4 = ''
  564. formEdit.dyldwdxs5 = ''
  565. formEdit.dyldldxs6 = ''
  566. formEdit.xsKB = ''
  567. formEdit.xsKBfh = ''
  568. formEdit.gbjyz = ''
  569. formEdit.dbjyz = ''
  570. formEdit.bjsn = ''
  571. formEdit.dyl485btl = ''
  572. formEdit.sgzjbcmm = ''
  573. formView.dylfsfx = ''
  574. formView.dylbjzt = ''
  575. formView.dyl1f2sADz = ''
  576. formView.dyl2f1sADz = ''
  577. formView.tfl = ''
  578. formView.yjbb = ''
  579. formView.rjbb = ''
  580. formView.zxlxbz = ''
  581. formView.rqsj = ''
  582. }
  583. //获取详细信息列表
  584. async function getStationList() {
  585. let res = await get158StationData();
  586. res.forEach((el) => {
  587. el.linkstatusC = el.linkstatus ? '连接' : '断开';
  588. });
  589. tableData1.value = res;
  590. }
  591. //传感器选项切换
  592. function changeCgq(val) {
  593. formEdit.cgq = val;
  594. }
  595. //编辑
  596. async function handleEdit(record) {
  597. cgqList.length = 0;
  598. visibleModalEdit1.value = true;
  599. devStationId.value = record.stationId;
  600. let res = await get158StationDevices({ stationId: devStationId.value });
  601. console.log(res, '分站下设备下拉选项-------------');
  602. if (res.length != 0) {
  603. res.forEach((el) => {
  604. cgqList.push({ label: el.strinstallpos, value: el.id });
  605. });
  606. }
  607. }
  608. //下发
  609. async function handleClick(data) {
  610. switch (data) {
  611. case 'RS485_MODBUS地址':
  612. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'rs485modbusdz', value: formEdit.rs485modbusdz });
  613. visibleModalEdit1.value = false;
  614. getStationList();
  615. break;
  616. case '探头安装距离':
  617. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'ttazjl', value: formEdit.ttazjl });
  618. visibleModalEdit1.value = false;
  619. getStationList();
  620. break;
  621. case '基线距离':
  622. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'jxjl', value: formEdit.jxjl });
  623. visibleModalEdit1.value = false;
  624. getStationList();
  625. break;
  626. case '安装角度':
  627. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'azjd', value: formEdit.azjd });
  628. visibleModalEdit1.value = false;
  629. getStationList();
  630. break;
  631. case '设置时长':
  632. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'szsz', value: formEdit.szsz });
  633. visibleModalEdit1.value = false;
  634. getStationList();
  635. break;
  636. case '数据平均周期':
  637. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'sjpjzq', value: formEdit.sjpjzq });
  638. visibleModalEdit1.value = false;
  639. getStationList();
  640. break;
  641. case '第一路一发二收PG值':
  642. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dylyfesPGz', value: formEdit.dylyfesPGz });
  643. visibleModalEdit1.value = false;
  644. getStationList();
  645. break;
  646. case '第一路二发一收PG值':
  647. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dylefysPGz', value: formEdit.dylefysPGz });
  648. visibleModalEdit1.value = false;
  649. getStationList();
  650. break;
  651. case '风道截面积':
  652. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'fdjmj', value: formEdit.fdjmj });
  653. visibleModalEdit1.value = false;
  654. getStationList();
  655. break;
  656. case '第一路整体系数k':
  657. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dylztxsk', value: formEdit.dylztxsk });
  658. visibleModalEdit1.value = false;
  659. getStationList();
  660. break;
  661. case '第一路第一段系数':
  662. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyldydxs1', value: formEdit.dyldydxs1 });
  663. visibleModalEdit1.value = false;
  664. getStationList();
  665. break;
  666. case '第一路第二段系数':
  667. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyldedxs2', value: formEdit.dyldedxs2 });
  668. visibleModalEdit1.value = false;
  669. getStationList();
  670. break;
  671. case '第一路第三段系数':
  672. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyldsdxs3', value: formEdit.dyldsdxs3 });
  673. visibleModalEdit1.value = false;
  674. getStationList();
  675. break;
  676. case '第一路第四段系数':
  677. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyldsdxs4', value: formEdit.dyldsdxs4 });
  678. visibleModalEdit1.value = false;
  679. getStationList();
  680. break;
  681. case '第一路第五段系数':
  682. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyldwdxs5', value: formEdit.dyldwdxs5 });
  683. visibleModalEdit1.value = false;
  684. getStationList();
  685. break;
  686. case '第一路第六段系数':
  687. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyldldxs6', value: formEdit.dyldldxs6 });
  688. visibleModalEdit1.value = false;
  689. getStationList();
  690. break;
  691. case '系数KB':
  692. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'xsKB', value: formEdit.xsKB });
  693. visibleModalEdit1.value = false;
  694. getStationList();
  695. break;
  696. case '系数KB符号':
  697. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'xsKBfh', value: formEdit.xsKBfh });
  698. visibleModalEdit1.value = false;
  699. getStationList();
  700. break;
  701. case '高报警阈值':
  702. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'gbjyz', value: formEdit.gbjyz });
  703. visibleModalEdit1.value = false;
  704. getStationList();
  705. break;
  706. case '低报警阈值':
  707. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dbjyz', value: formEdit.dbjyz });
  708. visibleModalEdit1.value = false;
  709. getStationList();
  710. break;
  711. case '报警使能':
  712. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'bjsn', value: formEdit.bjsn });
  713. visibleModalEdit1.value = false;
  714. getStationList();
  715. break;
  716. case '第一路485波特率':
  717. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'dyl485btl', value: formEdit.dyl485btl });
  718. visibleModalEdit1.value = false;
  719. getStationList();
  720. break;
  721. case '四个字节保存密码':
  722. await set158StationData({ stationId: devStationId.value, deviceId: formEdit.cgq, plcCode: 'sgzjbcmm', value: formEdit.sgzjbcmm });
  723. visibleModalEdit1.value = false;
  724. getStationList();
  725. break;
  726. }
  727. }
  728. //获取分站实时监测信息
  729. async function getSubStationList() {
  730. let res = await subStationList({ strtype: 'modbus' });
  731. if (res.length != 0) {
  732. cardList.value = res;
  733. stationId.value = stationId.value ? stationId.value : cardList.value[0].id
  734. openNum.value = cardList.value?.filter((v) => v.linkstatus == 1)['length'];
  735. clsoeNum.value = cardList.value?.filter((v) => v.linkstatus == 0)['length'];
  736. } else {
  737. cardList.value = [];
  738. }
  739. }
  740. //分站站点选项点击
  741. function cardClick(item, index) {
  742. selectedIndex.value = index; // 更新选中索引
  743. activeIndex.value = item.isNewAccess || !item.linkstatus ? index : null;
  744. stationName.value = item.strname;
  745. stationStatus.value = item.linkstatus;
  746. stationId.value = item.id;
  747. isShow.value = true;
  748. getStationList1();
  749. }
  750. //分站站点名称编辑
  751. function changeName(val) {
  752. getChangeStation();
  753. }
  754. async function getChangeStation() {
  755. let res = await getEdit({ id: stationId.value, strname: stationName.value, linkstatus: stationStatus.value });
  756. getSubStationList();
  757. isShow.value = false;
  758. }
  759. //站点连接状态修改
  760. function changeStatus(val) {
  761. getChangeStation();
  762. }
  763. //获取详细信息列表
  764. async function getStationList1() {
  765. let res = await getList({ subId: stationId.value, pageNo: pagination.current, pageSize: pagination.pageSize });
  766. if (res && res.length != 0) {
  767. res.forEach((el) => {
  768. el.key = el.id;
  769. el.linkIdC = el.linkId || '';
  770. el.stripC = el.strip || '';
  771. el.linkstatusC = el.linkstatus ? '连接' : '断开';
  772. el.gdmsC = el.gdms == '1' ? '直流供电' : el.gdms == '0' ? '交流供电' : '';
  773. el.children = el.devInfoList;
  774. el.children.forEach((v) => {
  775. v.key = v.id;
  776. v.debugTitle = v.deviceType == 'windrect_ds_25x' || v.deviceType == 'windrect_ds_two' ? '调试' : '';
  777. v.stripC = v.strserno || '';
  778. v.linkstatusC = v.netStatus ? '连接' : '断开';
  779. v.linkIdC = v.linkId == '0' ? '未启用' : v.linkId == '1' ? '启用' : v.linkId == '2' ? '设备异常' : '';
  780. v.updateTime = v.time;
  781. v.gdmsC = v.gdms == '1' ? '直流供电' : v.gdms == '0' ? '交流供电' : '';
  782. v.valueJc = `风向:${v.forward || ''},风量:${v.m3 || ''}m³/min,风速:${v.windSpeed || ''}m/s,气压:${v.pa || ''}Pa,压差:${v.difPress || ''
  783. }Pa,温度:${v.temperature || ''}℃,湿度:${v.humidity || ''}%,断面积:${v.area || ''}㎡`;
  784. });
  785. });
  786. }
  787. tableData.value = res;
  788. pagination.total = res.total;
  789. }
  790. async function getStationListAll() {
  791. let res = await getListAll();
  792. res.forEach((el) => {
  793. el.key = el.id;
  794. el.linkIdC = el.linkId || '';
  795. el.stripC = el.strip || '';
  796. el.linkstatusC = el.linkstatus ? '连接' : '断开';
  797. el.gdmsC = el.gdms == '1' ? '直流供电' : el.gdms == '0' ? '交流供电' : '';
  798. el.children = el.devInfoList;
  799. el.children.forEach((v) => {
  800. v.key = v.id;
  801. v.debugTitle = v.deviceType == 'windrect_ds_25x' || v.deviceType == 'windrect_ds_two' ? '调试' : '';
  802. v.stripC = v.strserno || '';
  803. v.linkstatusC = v.netStatus ? '连接' : '断开';
  804. v.linkIdC = v.linkId == '0' ? '未启用' : v.linkId == '1' ? '启用' : v.linkId == '2' ? '设备异常' : '';
  805. v.updateTime = v.time;
  806. v.gdmsC = v.gdms == '1' ? '直流供电' : v.gdms == '0' ? '交流供电' : '';
  807. v.valueJc = `风向:${v.forward || ''},风量:${v.m3 || ''}m³/min,风速:${v.windSpeed || ''}m/s,气压:${v.pa || ''}Pa,压差:${v.difPress || ''
  808. }Pa,温度:${v.temperature || ''}℃,湿度:${v.humidity || ''}%,断面积:${v.area || ''}㎡`;
  809. });
  810. });
  811. tableData.value = res;
  812. // pagination.total = res.total;
  813. }
  814. //显示全部
  815. function getAllShow() {
  816. // pagination.current = 1;
  817. // stationId.value = '';
  818. getStationListAll();
  819. }
  820. //启动新设备
  821. async function handlerunDeviceMonitor(record, val) {
  822. devId.value = record.id;
  823. switch (val) {
  824. case '编辑':
  825. visibleModalEdit.value = true;
  826. startupDataEdit.address = record.strinstallpos;
  827. paramId.value = record.devInfoList ? 'subId' : 'devId';
  828. break;
  829. case '启动':
  830. visibleModal.value = true;
  831. startupData.address = record.strinstallpos;
  832. break;
  833. case '删除':
  834. await remove158Device({ devId: devId.value })
  835. getStationList1()
  836. break;
  837. }
  838. }
  839. //分站,设备调试
  840. function debugClick(record) {
  841. if (record.debugTitle == '调试') {
  842. //正在调试中
  843. startupDataDebug.speed = '';
  844. startupDataDebug.direction = '';
  845. visibleModalDebug.value = true;
  846. debugFlag.value = 'device';
  847. debugDeviceId.value = record.id;
  848. tableData.value.forEach((el) => {
  849. el.devInfoList.forEach((v) => {
  850. if (v.id == debugDeviceId.value) {
  851. debugStationId.value = el.id;
  852. }
  853. });
  854. });
  855. record.debugTitle = '结束调试';
  856. // if (record.devInfoList) {
  857. // debugFlag.value = 'station'
  858. // debugStationId.value = record.id
  859. // tableData.value.forEach(el => {
  860. // el.debugTitle = '结束调试'
  861. // el.devInfoList.forEach(v => {
  862. // v.debugTitle = '结束调试'
  863. // })
  864. // })
  865. // } else {
  866. // debugFlag.value = 'device'
  867. // debugDeviceId.value = record.id
  868. // tableData.value.forEach(el => {
  869. // el.devInfoList.forEach(v => {
  870. // if (v.id == debugDeviceId.value) {
  871. // debugStationId.value = el.id
  872. // }
  873. // })
  874. // })
  875. // record.debugTitle = '结束调试'
  876. // }
  877. } else if (record.debugTitle == '结束调试') {
  878. debugFlag.value = 'device';
  879. debugDeviceId.value = record.id;
  880. tableData.value.forEach((el) => {
  881. el.devInfoList.forEach((v) => {
  882. if (v.id == debugDeviceId.value) {
  883. debugStationId.value = el.id;
  884. }
  885. });
  886. });
  887. record.debugTitle = '调试';
  888. stopDebug();
  889. // if (record.devInfoList) {
  890. // debugFlag.value = 'station'
  891. // debugStationId.value = record.id
  892. // tableData.value.forEach(el => {
  893. // el.debugTitle = '调试'
  894. // el.devInfoList.forEach(v => {
  895. // v.debugTitle = '调试'
  896. // })
  897. // })
  898. // stopDebug()
  899. // } else {
  900. // debugFlag.value = 'device'
  901. // debugDeviceId.value = record.id
  902. // tableData.value.forEach(el => {
  903. // el.devInfoList.forEach(v => {
  904. // if (v.id == debugDeviceId.value) {
  905. // debugStationId.value = el.id
  906. // }
  907. // })
  908. // })
  909. // record.debugTitle = '调试'
  910. // stopDebug()
  911. // }
  912. }
  913. }
  914. //停止调试
  915. async function stopDebug() {
  916. let res = await updateDebugStatus({ stationId: debugStationId.value, deviceId: debugDeviceId.value, debugFlag: '0' });
  917. if (res) {
  918. getStationList1();
  919. }
  920. // if (debugFlag.value == 'station') {
  921. // let res = await updateDebugStatus({ stationId: debugStationId.value, debugFlag: '0' })
  922. // getStationList1()
  923. // } else {
  924. // let res = await updateDebugStatus({ stationId: debugStationId.value, deviceId: debugDeviceId.value, debugFlag: '0' })
  925. // getStationList1()
  926. // }
  927. }
  928. async function handleOk() {
  929. let res = await runDeviceMonitor({ devId: devId.value, devName: startupData.address });
  930. visibleModal.value = false;
  931. getStationList1({ subId: stationId.value, pageNo: pagination.current, pageSize: pagination.pageSize });
  932. }
  933. function handleCancel() {
  934. visibleModal.value = false;
  935. startupData.address = '';
  936. }
  937. //编辑
  938. async function handleOkEdit() {
  939. if (paramId.value == 'subId') {
  940. let res = await update158DevName({ subId: devId.value, devName: startupDataEdit.address });
  941. console.log(res, '设备名称编辑---');
  942. visibleModalEdit.value = false;
  943. getStationList1();
  944. } else {
  945. let res = await update158DevName({ devId: devId.value, devName: startupDataEdit.address });
  946. console.log(res, '设备名称编辑---');
  947. visibleModalEdit.value = false;
  948. getStationList1();
  949. }
  950. }
  951. //取消编辑
  952. function handleCancelEdit() {
  953. visibleModalEdit.value = false;
  954. startupDataEdit.address = '';
  955. }
  956. //调试确认
  957. async function handleOkDebug() {
  958. let res = await updateDebugStatus({
  959. stationId: debugStationId.value,
  960. deviceId: debugDeviceId.value,
  961. speed: startupDataDebug.speed,
  962. direction: startupDataDebug.direction,
  963. debugFlag: '1',
  964. });
  965. if (res) {
  966. visibleModalDebug.value = false;
  967. getStationList1();
  968. }
  969. // if (debugFlag.value == 'station') {
  970. // let res = await updateDebugStatus({ stationId: debugStationId.value, speed: startupDataDebug.speed, direction: startupDataDebug.direction, debugFlag: '1' })
  971. // visibleModalDebug.value = false
  972. // getStationList1()
  973. // } else {
  974. // let res = await updateDebugStatus({ stationId: debugStationId.value, deviceId: debugDeviceId.value, speed: startupDataDebug.speed, direction: startupDataDebug.direction, debugFlag: '1' })
  975. // visibleModalDebug.value = false
  976. // getStationList1()
  977. // }
  978. }
  979. //调试取消
  980. function handleCancelDebug() {
  981. visibleModalDebug.value = false;
  982. tableData.value.forEach((el) => {
  983. el.devInfoList.forEach((v) => {
  984. v.debugTitle = v.deviceType == 'windrect_ds_25x' || v.deviceType == 'windrect_ds_two' ? '调试' : '';
  985. });
  986. });
  987. debugFlag.value = '';
  988. debugStationId.value = '';
  989. debugDeviceId.value = '';
  990. }
  991. //分页切换
  992. function pageChange(val) {
  993. pagination.current = val.current;
  994. pagination.pageSize = val.pageSize;
  995. getStationList1();
  996. }
  997. //删除左侧分站
  998. async function handleDelStation() {
  999. let res = await remove158Substation({ stationId: stationId.value })
  1000. console.log(res, '删除左侧分站')
  1001. if (res) {
  1002. getSubStationList();
  1003. getStationList1();
  1004. }
  1005. }
  1006. //取消删除左侧分站
  1007. function handleCancelDelStation() { }
  1008. //操作记录查询
  1009. async function getSearchRecord(param) {
  1010. let res = await get158SetLog({ ...param })
  1011. if (res && res.length != 0) {
  1012. operationData.value = res.records
  1013. }
  1014. }
  1015. onMounted(async () => {
  1016. await getSubStationList();
  1017. await getStationList1();
  1018. getMonitor()
  1019. });
  1020. onUnmounted(() => {
  1021. if (timer) {
  1022. clearTimeout(timer);
  1023. timer = undefined;
  1024. }
  1025. if (timer1) {
  1026. clearTimeout(timer1);
  1027. timer1 = undefined;
  1028. }
  1029. });
  1030. </script>
  1031. <style lang="less" scoped>
  1032. .safetyList {
  1033. width: calc(100% - 20px);
  1034. height: calc(100% - 80px);
  1035. position: relative;
  1036. margin: 70px 10px 10px 10px;
  1037. .content {
  1038. position: relative;
  1039. width: 100%;
  1040. height: 100%;
  1041. .tab-box {
  1042. display: flex;
  1043. color: #fff;
  1044. position: relative;
  1045. background: linear-gradient(#001325, #012e4f);
  1046. :deep(.zxm-tabs-nav) {
  1047. margin: 0 !important;
  1048. .zxm-tabs-tab {
  1049. width: 180px;
  1050. height: 45px;
  1051. background: url('/@/assets/images/top-btn.png') center no-repeat;
  1052. background-size: cover;
  1053. display: flex;
  1054. justify-content: center;
  1055. font-size: 16px;
  1056. }
  1057. .zxm-tabs-tab-active {
  1058. width: 180px;
  1059. position: relative;
  1060. background: url('/@/assets/images/top-btn-select.png') center no-repeat;
  1061. background-size: cover;
  1062. .zxm-tabs-tab-btn {
  1063. color: #fff !important;
  1064. }
  1065. }
  1066. .zxm-tabs-ink-bar {
  1067. width: 0 !important;
  1068. }
  1069. .zxm-tabs-tab+.zxm-tabs-tab {
  1070. margin: 0 !important;
  1071. }
  1072. }
  1073. }
  1074. .box-content {
  1075. height: calc(100% - 50px);
  1076. padding-top: 10px;
  1077. box-sizing: border-box;
  1078. .now-content {
  1079. position: relative;
  1080. width: 100%;
  1081. height: 100%;
  1082. display: flex;
  1083. justify-content: space-between;
  1084. align-items: center;
  1085. .left-box {
  1086. width: 40%;
  1087. height: 100%;
  1088. margin-right: 15px;
  1089. padding: 10px;
  1090. box-sizing: border-box;
  1091. background: url('/@/assets/images/fire/bj1.png') no-repeat center;
  1092. background-size: 100% 100%;
  1093. .left-title {
  1094. display: flex;
  1095. height: 30px;
  1096. align-items: center;
  1097. font-size: 14px;
  1098. margin-bottom: 10px;
  1099. span {
  1100. color: #fff;
  1101. }
  1102. .zd-open {
  1103. color: rgb(0, 242, 255);
  1104. }
  1105. .zd-close {
  1106. color: #ff0000;
  1107. }
  1108. .title-fz {
  1109. margin-right: 25px;
  1110. }
  1111. }
  1112. .left-content {
  1113. display: flex;
  1114. justify-content: flex-start;
  1115. align-items: flex-start;
  1116. flex-wrap: wrap;
  1117. height: calc(100% - 40px);
  1118. overflow-y: auto;
  1119. .card-box {
  1120. position: relative;
  1121. // width: 242px;
  1122. width: 182px;
  1123. height: 120px;
  1124. margin-bottom: 15px;
  1125. display: flex;
  1126. justify-content: center;
  1127. .card-itemN {
  1128. position: relative;
  1129. width: 85px;
  1130. height: 120px;
  1131. background: url('/@/assets/images/zd-2.png') no-repeat center;
  1132. background-size: 100% 100%;
  1133. cursor: pointer;
  1134. .card-item-label {
  1135. width: 100%;
  1136. position: absolute;
  1137. bottom: 5px;
  1138. font-size: 12px;
  1139. color: #fff;
  1140. text-align: center;
  1141. }
  1142. }
  1143. .card-itemL {
  1144. position: relative;
  1145. width: 85px;
  1146. height: 120px;
  1147. background: url('/@/assets/images/zd-3.png') no-repeat center;
  1148. background-size: 100% 100%;
  1149. cursor: pointer;
  1150. .card-item-label {
  1151. width: 100%;
  1152. position: absolute;
  1153. bottom: 5px;
  1154. font-size: 12px;
  1155. color: #fff;
  1156. text-align: center;
  1157. }
  1158. }
  1159. .card-itemD {
  1160. position: relative;
  1161. width: 85px;
  1162. height: 120px;
  1163. background: url('/@/assets/images/zd-1.png') no-repeat center;
  1164. background-size: 100% 100%;
  1165. cursor: pointer;
  1166. .card-item-label {
  1167. width: 100%;
  1168. position: absolute;
  1169. bottom: 5px;
  1170. font-size: 12px;
  1171. color: #fff;
  1172. text-align: center;
  1173. }
  1174. }
  1175. .card-modal {
  1176. width: 86px;
  1177. position: absolute;
  1178. left: 140px;
  1179. color: #fff;
  1180. top: 50%;
  1181. transform: translate(0, -50%);
  1182. font-size: 12px;
  1183. }
  1184. .card-modal1 {
  1185. width: 86px;
  1186. position: absolute;
  1187. left: -42px;
  1188. color: #fff;
  1189. top: 50%;
  1190. transform: translate(0, -50%);
  1191. font-size: 12px;
  1192. }
  1193. }
  1194. }
  1195. }
  1196. .right-box {
  1197. width: calc(60% - 15px);
  1198. height: 100%;
  1199. padding: 10px;
  1200. box-sizing: border-box;
  1201. background: url('/@/assets/images/fire/bj1.png') no-repeat center;
  1202. background-size: 100% 100%;
  1203. .right-title {
  1204. display: flex;
  1205. height: 30px;
  1206. align-items: center;
  1207. font-size: 14px;
  1208. color: #fff;
  1209. margin-bottom: 10px;
  1210. }
  1211. }
  1212. }
  1213. .detail-content {
  1214. width: 100%;
  1215. height: 100%;
  1216. }
  1217. .history-content {
  1218. position: relative;
  1219. width: 100%;
  1220. height: 100%;
  1221. display: flex;
  1222. justify-content: space-between;
  1223. align-items: center;
  1224. background: url('/@/assets/images/fire/bj1.png') no-repeat center;
  1225. background-size: 100% 100%;
  1226. color: #fff;
  1227. .left-box {
  1228. width: 40%;
  1229. height: 100%;
  1230. margin-right: 15px;
  1231. padding: 10px;
  1232. box-sizing: border-box;
  1233. background: url('/@/assets/images/fire/bj1.png') no-repeat center;
  1234. background-size: 100% 100%;
  1235. .left-title {
  1236. display: flex;
  1237. height: 30px;
  1238. align-items: center;
  1239. font-size: 14px;
  1240. margin-bottom: 10px;
  1241. span {
  1242. color: #fff;
  1243. }
  1244. .zd-open {
  1245. color: rgb(0, 242, 255);
  1246. }
  1247. .zd-close {
  1248. color: #ff0000;
  1249. }
  1250. .title-fz {
  1251. margin-right: 25px;
  1252. }
  1253. }
  1254. .left-content {
  1255. display: flex;
  1256. justify-content: flex-start;
  1257. align-items: flex-start;
  1258. flex-wrap: wrap;
  1259. height: calc(100% - 40px);
  1260. overflow-y: auto;
  1261. .card-box {
  1262. position: relative;
  1263. // width: 242px;
  1264. width: 182px;
  1265. height: 120px;
  1266. margin-bottom: 15px;
  1267. display: flex;
  1268. justify-content: center;
  1269. .card-itemN {
  1270. position: relative;
  1271. width: 85px;
  1272. height: 120px;
  1273. background: url('/@/assets/images/zd-2.png') no-repeat center;
  1274. background-size: 100% 100%;
  1275. cursor: pointer;
  1276. .card-item-label {
  1277. width: 100%;
  1278. position: absolute;
  1279. bottom: 5px;
  1280. font-size: 12px;
  1281. color: #fff;
  1282. text-align: center;
  1283. }
  1284. }
  1285. .card-itemL {
  1286. position: relative;
  1287. width: 85px;
  1288. height: 120px;
  1289. background: url('/@/assets/images/zd-3.png') no-repeat center;
  1290. background-size: 100% 100%;
  1291. cursor: pointer;
  1292. .card-item-label {
  1293. width: 100%;
  1294. position: absolute;
  1295. bottom: 5px;
  1296. font-size: 12px;
  1297. color: #fff;
  1298. text-align: center;
  1299. }
  1300. }
  1301. .card-itemD {
  1302. position: relative;
  1303. width: 85px;
  1304. height: 120px;
  1305. background: url('/@/assets/images/zd-1.png') no-repeat center;
  1306. background-size: 100% 100%;
  1307. cursor: pointer;
  1308. .card-item-label {
  1309. width: 100%;
  1310. position: absolute;
  1311. bottom: 5px;
  1312. font-size: 12px;
  1313. color: #fff;
  1314. text-align: center;
  1315. }
  1316. }
  1317. .card-modal {
  1318. width: 86px;
  1319. position: absolute;
  1320. left: 140px;
  1321. color: #fff;
  1322. top: 50%;
  1323. transform: translate(0, -50%);
  1324. font-size: 12px;
  1325. }
  1326. .card-modal1 {
  1327. width: 86px;
  1328. position: absolute;
  1329. left: -42px;
  1330. color: #fff;
  1331. top: 50%;
  1332. transform: translate(0, -50%);
  1333. font-size: 12px;
  1334. }
  1335. }
  1336. }
  1337. }
  1338. .right-box {
  1339. width: calc(60% - 15px);
  1340. height: 100%;
  1341. padding: 10px;
  1342. box-sizing: border-box;
  1343. background: url('/@/assets/images/fire/bj1.png') no-repeat center;
  1344. background-size: 100% 100%;
  1345. .historytable {
  1346. height: 100%;
  1347. }
  1348. .right-title {
  1349. display: flex;
  1350. height: 30px;
  1351. align-items: center;
  1352. font-size: 14px;
  1353. color: #fff;
  1354. margin-bottom: 10px;
  1355. }
  1356. }
  1357. }
  1358. }
  1359. }
  1360. }
  1361. .down-btn {
  1362. line-height: 15px;
  1363. height: 20px;
  1364. padding: 0px 17px;
  1365. font-size: 12px;
  1366. }
  1367. .zxm-form {
  1368. width: 50%;
  1369. height: 100%;
  1370. padding-top: 20px !important;
  1371. box-sizing: border-box;
  1372. }
  1373. .zxm-picker,
  1374. .zxm-input {
  1375. border: 1px solid #3ad8ff77 !important;
  1376. background-color: #ffffff !important;
  1377. color: #fff !important;
  1378. }
  1379. .card-item.selected {
  1380. border: 2px solid #3ad8ff77;
  1381. /* 选中时的边框颜色 */
  1382. }
  1383. ::v-deep(.zxm-radio-wrapper) {
  1384. font-size: 12px;
  1385. }
  1386. ::v-deep(.zxm-input) {
  1387. font-size: 12px;
  1388. }
  1389. ::v-deep(.zxm-select:not(.zxm-select-customize-input) .zxm-select-selector) {
  1390. border: 1px solid #3ad8ff77 !important;
  1391. }
  1392. ::v-deep(.zxm-select-selection-item) {
  1393. color: #fff !important;
  1394. }
  1395. // ::v-deep(.zxm-form-item-label > label) {
  1396. // color: #fff !important;
  1397. // }</style>
  1398. <style>
  1399. div[aria-hidden='true'] {
  1400. display: none !important;
  1401. }
  1402. </style>
  1403. //
  1404. //
  1405. <style lang="less" scoped>
  1406. // // .search-area {
  1407. // // width: 100%;
  1408. // // padding: 5px;
  1409. // // margin: 10px;
  1410. // // box-sizing: border-box;
  1411. // // }
  1412. // // .card-item.selected {
  1413. // // border: 2px solid #3ad8ff77;
  1414. // // /* 选中时的边框颜色 */
  1415. // // }
  1416. // // </style>