screens.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. <template>
  2. <div>
  3. <div class="gva-search-box">
  4. <el-form
  5. ref="searchForm"
  6. :inline="true"
  7. :model="searchInfo"
  8. >
  9. <el-form-item label="名称或编码">
  10. <el-input
  11. v-model="searchInfo.keyword"
  12. placeholder="搜索名称或SN"
  13. />
  14. </el-form-item>
  15. <el-form-item label="所属分路">
  16. <el-select v-model="searchInfo.shunt" placeholder="所属分路">
  17. <el-option label="主路" value=1></el-option>
  18. <el-option label="支路" value=2></el-option>
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item>
  22. <el-button
  23. type="primary"
  24. icon="search"
  25. @click="onSubmit"
  26. >查询</el-button>
  27. <el-button
  28. icon="refresh"
  29. @click="onReset"
  30. >重置</el-button>
  31. </el-form-item>
  32. </el-form>
  33. </div>
  34. <div class="gva-table-box">
  35. <div class="gva-btn-list">
  36. <el-button
  37. type="primary"
  38. icon="plus"
  39. @click="add()"
  40. >新增</el-button>
  41. </div>
  42. <el-table
  43. :data="tableData"
  44. style="width: 100%; margin-bottom: 20px"
  45. row-key="id"
  46. border
  47. :table-layout="'fixed'"
  48. :row-class-name="tableRowClassName"
  49. >
  50. <el-table-column prop="ID" label="#" :width="80"/>
  51. <el-table-column prop="shunt" label="所属分路" :width="100">
  52. <template #default="scope">
  53. {{ scope.row.shunt===1?"主路":scope.row.shunt===2?"支路":"未知" }}
  54. </template>
  55. </el-table-column>
  56. <el-table-column prop="screensName" label="名称" />
  57. <el-table-column prop="screensCode" label="编码">
  58. <template #default="scope">
  59. <el-tag effect="light">{{ scope.row.screensCode }}</el-tag>
  60. </template>
  61. </el-table-column>
  62. <el-table-column prop="sn" label="SN" />
  63. <el-table-column prop="screensBrand" label="品牌" />
  64. <el-table-column prop="screensModel" label="型号"/>
  65. <el-table-column prop="GateWay.gatewayName" label="所属网关"/>
  66. <el-table-column prop="status" label="在线状态">
  67. <template #default="scope">
  68. <div class="onlinebox" :style="{'background': scope.row.status===0 ? 'red':'green' }"></div>
  69. <span :style="{ color: scope.row.status === 0 ? 'red' : 'green' }">{{ scope.row.status === 0 ? '离线' : '在线' }}</span>
  70. </template>
  71. </el-table-column>
  72. <el-table-column
  73. align="left"
  74. fixed="right"
  75. label="操作"
  76. :width="300"
  77. >
  78. <template #default="scope">
  79. <el-button
  80. type="primary"
  81. link
  82. icon="view"
  83. @click="view(scope.row)"
  84. >查看</el-button>
  85. <el-button
  86. type="primary"
  87. link
  88. icon="edit"
  89. @click="editScreens(scope.row)"
  90. >编辑</el-button>
  91. <el-button
  92. type="primary"
  93. link
  94. @click="switchOpenCloseScreens(scope.row,1)"
  95. >亮屏</el-button>
  96. <el-button
  97. type="primary"
  98. link
  99. @click="switchOpenCloseScreens(scope.row,0)"
  100. >熄屏</el-button>
  101. <el-button
  102. type="primary"
  103. link
  104. @click="openInCodeDialog(scope.row)"
  105. >发送文字</el-button>
  106. <el-button
  107. type="primary"
  108. link
  109. @click="openVoiceBroadDialog(scope.row)"
  110. >远程喊话</el-button>
  111. <el-button
  112. type="primary"
  113. link
  114. @click="openSetBrightDialog(scope.row)"
  115. >设置</el-button>
  116. <el-button
  117. type="primary"
  118. link
  119. icon="delete"
  120. @click="deleteScreens(scope.row)"
  121. >删除</el-button>
  122. </template>
  123. </el-table-column>
  124. </el-table>
  125. <div class="gva-pagination">
  126. <el-pagination
  127. :current-page="page"
  128. :page-size="pageSize"
  129. :page-sizes="[10, 30, 50, 100]"
  130. :total="total"
  131. layout="total, sizes, prev, pager, next, jumper"
  132. @current-change="handleCurrentChange"
  133. @size-change="handleSizeChange"
  134. />
  135. </div>
  136. <el-dialog v-model="addScreensDialog" title="LED显示屏" width="900">
  137. <el-form
  138. ref="screensForm"
  139. :rules="rules"
  140. :model="screensInfo"
  141. label-width="100px"
  142. style="padding: 15px"
  143. >
  144. <el-row>
  145. <el-col :span="12">
  146. <el-form-item label="屏幕名称:" :inline="false" prop="screensName">
  147. <el-input v-model="screensInfo.screensName"></el-input>
  148. </el-form-item>
  149. </el-col>
  150. <el-col :span="12">
  151. <el-form-item label="编码:" :inline="false">
  152. <el-input disabled v-model="screensInfo.screensCode"></el-input>
  153. </el-form-item>
  154. </el-col>
  155. </el-row>
  156. <el-row>
  157. <el-col :span="12">
  158. <el-form-item label="SN:" :inline="false" prop="sn">
  159. <el-input v-model="screensInfo.sn"></el-input>
  160. </el-form-item>
  161. </el-col>
  162. <el-col :span="12">
  163. <el-form-item label="组网方式:" :inline="false" prop="network">
  164. <el-select v-model="screensInfo.network" placeholder="请选择组网方式">
  165. <el-option label="网关" :value=0></el-option>
  166. <el-option label="4G模块" :value=1></el-option>
  167. </el-select>
  168. </el-form-item>
  169. </el-col>
  170. </el-row>
  171. <el-row>
  172. <el-col :span="12">
  173. <el-form-item label="ip地址:" :inline="false" prop="ipAddress">
  174. <el-input v-model="screensInfo.ipAddress"></el-input>
  175. </el-form-item>
  176. </el-col>
  177. <el-col :span="12">
  178. <el-form-item label="品牌:" :inline="false" prop="screensBrand">
  179. <el-input v-model="screensInfo.screensBrand"></el-input>
  180. </el-form-item>
  181. </el-col>
  182. </el-row>
  183. <el-row>
  184. <el-col :span="12">
  185. <el-form-item label="型号:" :inline="false" prop="screensModel">
  186. <el-input v-model="screensInfo.screensModel"></el-input>
  187. </el-form-item>
  188. </el-col>
  189. <el-col :span="12">
  190. <el-form-item label="所属网关:" :inline="false" prop="gatewayId">
  191. <el-select v-model="screensInfo.gatewayId" placeholder="所属网关">
  192. <el-option v-for=" (item) in screensParams.gatewayList" :label="item.gatewayName" :value="item.id"></el-option>
  193. </el-select>
  194. </el-form-item>
  195. </el-col>
  196. </el-row>
  197. <el-row>
  198. <el-col :span="12">
  199. <el-form-item label="分辨率:" :inline="false">
  200. <el-select v-model="screensInfo.resolutionId" placeholder="请选择分辨率">
  201. <el-option v-for=" (item) in screensParams.resolution" :label="item.price" :value="item.ID"></el-option>
  202. </el-select>
  203. </el-form-item>
  204. </el-col>
  205. <el-col :span="12">
  206. <el-form-item label="屏幕尺寸:" :inline="false">
  207. <el-select v-model="screensInfo.screensSizeId" placeholder="请选择屏幕尺寸">
  208. <el-option v-for=" (item) in screensParams.screensSize" :label="item.size" :value="item.ID"></el-option>
  209. </el-select>
  210. </el-form-item>
  211. </el-col>
  212. </el-row>
  213. <el-row>
  214. <el-col :span="12">
  215. <el-form-item label="所属分路:" :inline="false">
  216. <el-select v-model="screensInfo.shunt" placeholder="请选择所属分路">
  217. <el-option label="主路" :value=1></el-option>
  218. <el-option label="支路" :value=2></el-option>
  219. </el-select>
  220. </el-form-item>
  221. </el-col>
  222. <el-col :span="12">
  223. <el-form-item label="分路描述:" :inline="false">
  224. <el-input v-model="screensInfo.shuntDescribe"></el-input>
  225. </el-form-item>
  226. </el-col>
  227. </el-row>
  228. <el-row>
  229. <el-col :span="12">
  230. <el-form-item label="安装时间:" :inline="false">
  231. <el-date-picker
  232. v-model="screensInfo.installTime"
  233. type="date"
  234. placeholder="Pick a day"
  235. size="default"
  236. />
  237. </el-form-item>
  238. </el-col>
  239. <el-col :span="12">
  240. <el-form-item label="时控开关Sn:" :inline="false">
  241. <el-input v-model="screensInfo.switchSn"></el-input>
  242. </el-form-item>
  243. </el-col>
  244. </el-row>
  245. </el-form>
  246. <template #footer>
  247. <div class="dialog-footer">
  248. <el-button @click="closeAddScreensDialog">取消</el-button>
  249. <el-button type="primary" @click="enterAddScreensDialog">
  250. 确定
  251. </el-button>
  252. </div>
  253. </template>
  254. </el-dialog>
  255. <el-dialog v-model="viewScreensDialog" title="详情" style="padding: 35px">
  256. <el-form
  257. :model="screensInfo"
  258. label-width="110px"
  259. style="padding: 20px"
  260. >
  261. <el-row>
  262. <el-col :span="12">
  263. <el-form-item label="屏幕名称:" :inline="false">
  264. {{screensInfo.screensName }}
  265. </el-form-item>
  266. </el-col>
  267. <el-col :span="12">
  268. <el-form-item label="编码:" :inline="false">
  269. {{screensInfo.screensCode }}
  270. </el-form-item>
  271. </el-col>
  272. </el-row>
  273. <el-row>
  274. <el-col :span="12">
  275. <el-form-item label="品牌:" :inline="false">
  276. {{screensInfo.screensBrand }}
  277. </el-form-item>
  278. </el-col>
  279. <el-col :span="12">
  280. <el-form-item label="型号:" :inline="false">
  281. {{screensInfo.screensModel }}
  282. </el-form-item>
  283. </el-col>
  284. </el-row>
  285. <el-row>
  286. <el-col :span="12">
  287. <el-form-item label="SN:" :inline="false">
  288. {{screensInfo.sn }}
  289. </el-form-item>
  290. </el-col>
  291. <el-col :span="12">
  292. <el-form-item label="组网方式:" :inline="false">
  293. {{screensInfo.network === 0 ? '网关':'4G模块' }}
  294. </el-form-item>
  295. </el-col>
  296. </el-row>
  297. <el-row>
  298. <el-col :span="12">
  299. <el-form-item label="ip地址:" :inline="false">
  300. {{screensInfo.ipAddress }}
  301. </el-form-item>
  302. </el-col>
  303. <el-col :span="12">
  304. <el-form-item label="所属网关:" :inline="false">
  305. {{screensInfo.GateWay.gatewayName }}
  306. </el-form-item>
  307. </el-col>
  308. </el-row>
  309. <el-row>
  310. <el-col :span="12">
  311. <el-form-item label="分辨率:" :inline="false">
  312. {{screensInfo.Resolution.price }}
  313. </el-form-item>
  314. </el-col>
  315. <el-col :span="12">
  316. <el-form-item label="屏幕尺寸:" :inline="false">
  317. {{screensInfo.ScreensSize.size }}
  318. </el-form-item>
  319. </el-col>
  320. </el-row>
  321. <el-row>
  322. <el-col :span="12">
  323. <el-form-item label="所属分路:" :inline="false">
  324. <el-tag effect="dark">{{screensInfo.shunt===1?"主路":screensInfo.shunt===2?"支路":"未知"}}</el-tag>
  325. </el-form-item>
  326. </el-col>
  327. <el-col :span="12">
  328. <el-form-item label="分路描述:" :inline="false">
  329. {{screensInfo.shuntDescribe }}
  330. </el-form-item>
  331. </el-col>
  332. </el-row>
  333. <el-row>
  334. <el-col :span="12">
  335. <el-form-item label="在线状态:" :inline="false">
  336. <div class="onlinebox" :style="{'background': screensInfo.status===0 ? 'red':'green' }"></div>
  337. <span :style="{ color: screensInfo.status === 0 ? 'red' : 'green' }">{{ screensInfo.status === 0 ? '离线' : '在线' }}</span>
  338. </el-form-item>
  339. </el-col>
  340. <el-col :span="12">
  341. <el-form-item label="安装时间:" :inline="false">
  342. {{screensInfo.installTime }}
  343. </el-form-item>
  344. </el-col>
  345. </el-row>
  346. <el-row>
  347. </el-row>
  348. <el-row>
  349. <el-col :span="12">
  350. <el-form-item label="最近上线时间:" :inline="false">
  351. {{ screensInfo.lastOnlineTime}}
  352. </el-form-item>
  353. </el-col>
  354. <el-col :span="12">
  355. <el-form-item label="累计在线时长:" :inline="false">
  356. <el-tag type="success">{{ onlineSum }}</el-tag>
  357. </el-form-item>
  358. </el-col>
  359. </el-row>
  360. <el-row>
  361. <el-col :span="12">
  362. <el-form-item label="上次离线时间:" :inline="false">
  363. {{ screensInfo.lastOfflineTime }}
  364. </el-form-item>
  365. </el-col>
  366. <el-col :span="12">
  367. <el-form-item label="累计离线时长:" :inline="false">
  368. <el-tag type="warning">{{ offlineSum }}</el-tag>
  369. </el-form-item>
  370. </el-col>
  371. </el-row>
  372. </el-form>
  373. </el-dialog>
  374. <!-- 发送内码文字时打开的弹窗-->
  375. <el-dialog v-model="inCodeDialog" title="发送文字" width="900">
  376. <!-- <div class="dialog-footer" style="position: relative;left: 780px;height: 35px">-->
  377. <!-- <el-button type="danger" circle @click="addData()">添加</el-button>-->
  378. <!-- <el-button type="danger" circle @click="minData()">移除</el-button>-->
  379. <!-- </div>-->
  380. <el-scrollbar max-height="400px">
  381. <el-form v-for="(item,i) in dataForms" ref="dataForm" :rules="rules" :model="dataForms" label-width="120px" style="padding: 15px">
  382. <!-- <el-divider>文字数据{{i+1}}</el-divider>-->
  383. <el-row>
  384. <el-col :span="24">
  385. <el-form-item label="文字内容:" :inline="false" prop="text">
  386. <template #label>
  387. <span>文字内容</span>
  388. <span style="color: red">(必填)</span>:
  389. </template>
  390. <el-input v-model="item.text" type="textarea" :maxlength="4" show-word-limit/>
  391. </el-form-item>
  392. </el-col>
  393. </el-row>
  394. <el-row>
  395. <el-col :span="12">
  396. <el-form-item label="文字颜色:" :inline="false">
  397. <el-select v-model="item.color" placeholder="请选择文字颜色">
  398. <el-option label="红色" value="红色" />
  399. <el-option label="黄色" value="黄色" />
  400. <el-option label="绿色" value="绿色" />
  401. </el-select>
  402. </el-form-item>
  403. </el-col>
  404. <!-- <el-col :span="12">-->
  405. <!-- <el-form-item label="文字尺寸:" :inline="false">-->
  406. <!-- <el-select v-model="item.size" placeholder="请选择文字尺寸">-->
  407. <!-- <el-option label="16号" value="16号" />-->
  408. <!-- <el-option label="24号" value="24号" />-->
  409. <!-- <el-option label="32号" value="32号" />-->
  410. <!-- <el-option label="48号" value="48号" />-->
  411. <!-- <el-option label="64号" value="64号" />-->
  412. <!-- </el-select>-->
  413. <!-- </el-form-item>-->
  414. <!-- </el-col>-->
  415. </el-row>
  416. </el-form>
  417. </el-scrollbar>
  418. <template #footer>
  419. <div class="dialog-footer">
  420. <el-button @click="closeInCodeDialog">取消</el-button>
  421. <el-button type="primary" @click="enterInCodeDialog">
  422. 确定
  423. </el-button>
  424. </div>
  425. </template>
  426. </el-dialog>
  427. <!--远程喊话弹窗-->
  428. <el-dialog v-model="voiceBroadDialog" title="远程喊话" width="900">
  429. <el-scrollbar max-height="400px">
  430. <el-form ref="dataForm" :rules="rules" :model="voiceBroadForm" label-width="120px" style="padding: 15px">
  431. <el-row>
  432. <el-col :span="24">
  433. <el-form-item label="播报内容:" :inline="false" prop="broadContent">
  434. <el-input v-model="voiceBroadForm.broadContent" type="textarea"/>
  435. </el-form-item>
  436. </el-col>
  437. </el-row>
  438. </el-form>
  439. </el-scrollbar>
  440. <template #footer>
  441. <div class="dialog-footer">
  442. <el-button @click="closeVoiceBroadDialog">取消</el-button>
  443. <el-button type="primary" @click="enterVoiceBroadDialog">
  444. 发送
  445. </el-button>
  446. </div>
  447. </template>
  448. </el-dialog>
  449. <!--设置亮度和时控弹窗-->
  450. <el-dialog v-model="setBrightDialog" title="设置" width="500">
  451. <el-form ref="dataForm" :model="setBrightForm" style="padding: 15px">
  452. <el-divider content-position="left">亮度</el-divider>
  453. <el-row>
  454. <el-col :span="21">
  455. <el-form-item label="白天:" :inline="false" prop="broadContent">
  456. <el-slider v-model="setBrightForm.dayBright" :step="10" :format-tooltip="(e) => e + '%'" /><div style="position: absolute;left: 360px">{{ setBrightForm.dayBright }}%</div>
  457. </el-form-item>
  458. </el-col>
  459. </el-row>
  460. <el-row>
  461. <el-col :span="21">
  462. <el-form-item label="晚上:" :inline="false" prop="broadContent">
  463. <el-slider v-model="setBrightForm.nightBright" :step="10" :format-tooltip="(e) => e + '%'"/><div style="position: absolute;left: 360px">{{ setBrightForm.nightBright }}%</div>
  464. </el-form-item>
  465. </el-col>
  466. </el-row>
  467. <el-divider content-position="left">声音</el-divider>
  468. <el-row :gutter="25">
  469. <el-col :span="11">
  470. <el-form-item label="开:" :inline="false">
  471. <el-select v-model="setBrightForm.audioOn" placeholder="请设置时间">
  472. <template #prefix>
  473. <span style="padding-left: 3px;padding-top: 4px;"><el-icon><Clock /></el-icon></span>
  474. </template>
  475. <el-option v-for=" x in timeArr" :label="x" :value="x" />
  476. </el-select>
  477. </el-form-item>
  478. </el-col>
  479. <el-col :span="11">
  480. <el-form-item label="关:" :inline="false">
  481. <el-select v-model="setBrightForm.audioOff" placeholder="请设置时间">
  482. <template #prefix>
  483. <span style="padding-left: 3px;padding-top: 4px;"><el-icon><Clock /></el-icon></span>
  484. </template>
  485. <el-option v-for=" x in timeArr" :label="x" :value="x" />
  486. </el-select>
  487. </el-form-item>
  488. </el-col>
  489. </el-row>
  490. <el-divider content-position="left">屏幕<span style="color: red">(默认00:00-00:00表示常亮)</span> </el-divider>
  491. <el-row :gutter="25">
  492. <el-col :span="11">
  493. <el-form-item label="亮:" :inline="false">
  494. <el-select v-model="setBrightForm.ledOn" placeholder="请设置时间">
  495. <template #prefix>
  496. <span style="padding-left: 3px;padding-top: 4px;"><el-icon><Clock /></el-icon></span>
  497. </template>
  498. <el-option v-for=" x in timeArr" :label="x" :value="x" />
  499. </el-select>
  500. </el-form-item>
  501. </el-col>
  502. <el-col :span="11">
  503. <el-form-item label="熄:" :inline="false">
  504. <el-select v-model="setBrightForm.ledOff" placeholder="请设置时间">
  505. <template #prefix>
  506. <span style="padding-left: 3px;padding-top: 4px;"><el-icon><Clock /></el-icon></span>
  507. </template>
  508. <el-option v-for=" x in timeArr" :label="x" :value="x" />
  509. </el-select>
  510. </el-form-item>
  511. </el-col>
  512. </el-row>
  513. </el-form>
  514. <template #footer>
  515. <div class="dialog-footer">
  516. <el-button @click="closeSetBrightDialog">取消</el-button>
  517. <el-button type="primary" @click="enterSetBrightDialog">
  518. 确定
  519. </el-button>
  520. </div>
  521. </template>
  522. </el-dialog>
  523. </div>
  524. </div>
  525. </template>
  526. <script setup>
  527. import {
  528. deleteBaseScreens,
  529. getScreensList,
  530. queryscreensParms,
  531. setScreensInfo,
  532. addScreens,
  533. switchScreens,
  534. sendInternalCode, voiceBroad, setBrightAudioLed
  535. } from "@/api/screens";
  536. import { ref,reactive} from 'vue'
  537. import {ElMessage, ElMessageBox} from "element-plus";
  538. import dayjs from "dayjs";
  539. const page = ref(1)
  540. const total = ref(0)
  541. const pageSize = ref(10)
  542. const tableData = ref([])
  543. const searchInfo = ref({})
  544. const screensInfo = ref({})
  545. const nowSn = ref("")
  546. const timeArr = ref([
  547. '00:00', '00:10', '00:20', '00:30', '00:40', '00:50',
  548. '01:00', '01:10', '01:20', '01:30', '01:40', '01:50',
  549. '02:00', '02:10', '02:20', '02:30', '02:40', '02:50',
  550. '03:00', '03:10', '03:20', '03:30', '03:40', '03:50',
  551. '04:00', '04:10', '04:20', '04:30', '04:40', '04:50',
  552. '05:00', '05:10', '05:20', '05:30', '05:40', '05:50',
  553. '06:00', '06:10', '06:20', '06:30', '06:40', '06:50',
  554. '07:00', '07:10', '07:20', '07:30', '07:40', '07:50',
  555. '08:00', '08:10', '08:20', '08:30', '08:40', '08:50',
  556. '09:00', '09:10', '09:20', '09:30', '09:40', '09:50',
  557. '10:00', '10:10', '10:20', '10:30', '10:40', '10:50',
  558. '11:00', '11:10', '11:20', '11:30', '11:40', '11:50',
  559. '12:00', '12:10', '12:20', '12:30', '12:40', '12:50',
  560. '13:00', '13:10', '13:20', '13:30', '13:40', '13:50',
  561. '14:00', '14:10', '14:20', '14:30', '14:40', '14:50',
  562. '15:00', '15:10', '15:20', '15:30', '15:40', '15:50',
  563. '16:00', '16:10', '16:20', '16:30', '16:40', '16:50',
  564. '17:00', '17:10', '17:20', '17:30', '17:40', '17:50',
  565. '18:00', '18:10', '18:20', '18:30', '18:40', '18:50',
  566. '19:00', '19:10', '19:20', '19:30', '19:40', '19:50',
  567. '20:00', '20:10', '20:20', '20:30', '20:40', '20:50',
  568. '21:00', '21:10', '21:20', '21:30', '21:40', '21:50',
  569. '22:00', '22:10', '22:20', '22:30', '22:40', '22:50',
  570. '23:00', '23:10', '23:20', '23:30', '23:40', '23:50'])
  571. const dataForms = ref([
  572. {
  573. text:'',
  574. color:'红色',
  575. size:'24号'
  576. }
  577. ])
  578. const voiceBroadForm = ref({})
  579. const setBrightForm = ref({})
  580. const screensParams = reactive({
  581. resolution:[],
  582. screensSize:[],
  583. gatewayList:[]
  584. })
  585. const screensForm = ref(null)
  586. const dataForm = ref(null)
  587. const dialogFlag = ref('add')
  588. const isFlag = ref('')
  589. const addScreensDialog = ref(false)
  590. const viewScreensDialog = ref(false)
  591. const inCodeDialog = ref(false)
  592. const voiceBroadDialog = ref(false)
  593. const setBrightDialog = ref(false)
  594. const onlineSum = ref('0')
  595. const offlineSum = ref('0')
  596. const oldSn = ref('')
  597. const rules = ref({
  598. screensName: [
  599. { required: true, message: '请输入名称',trigger: 'blur'},
  600. { min: 5, message: '最低5位字符', trigger: 'blur' }
  601. ],
  602. screensBrand: [
  603. { required: true, message: '请填写品牌',trigger: 'blur'},
  604. ],
  605. screensModel: [
  606. { required: true, message: '请填写型号',trigger: 'blur'},
  607. ],
  608. sn: [
  609. { required: true, message:'请输入设备SN',trigger: 'blur'},
  610. ],
  611. network: [
  612. { required: true, message:'请选择组网方式',trigger: 'blur'},
  613. ],
  614. gatewayId: [
  615. { required: true, message:'请选择网关',trigger: 'blur'},
  616. ],
  617. broadContent: [
  618. { required: true, message:'请填写播报内容',trigger: 'blur'},
  619. ]
  620. })
  621. const TimeConversion = (t) => {
  622. const timestampInSec = Math.floor(t / 1000); // 转换为秒
  623. // 计算总天数
  624. const totalDays = Math.floor(timestampInSec / (24 * 60 * 60)); // 每天 86400 秒
  625. // 计算年数
  626. const years = Math.floor(totalDays / 365);
  627. // 计算剩余的天数
  628. const remainingDays = totalDays % 365;
  629. // 计算剩余的小时数
  630. const hours = Math.floor((timestampInSec % (24 * 60 * 60)) / 3600); // 每小时 3600 秒
  631. // 根据年数、天数和小时数返回相应的格式
  632. if (years > 0) {
  633. return `${years}年${remainingDays}天${hours}小时`;
  634. } else if (remainingDays > 0) {
  635. return `${remainingDays}天${hours}小时`;
  636. } else {
  637. return `${hours}小时`;
  638. }
  639. }
  640. const getNowDay = ()=>{
  641. let timestamp = Date.now(); // 获取当前时间戳,单位是毫秒
  642. screensInfo.value.installTime = new Date(timestamp)
  643. }
  644. const getRandomCode = (prex)=>{
  645. let str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  646. let arr1 = str1.split("");
  647. screensInfo.value.screensCode = prex
  648. for(let i = 0; i < 10;i++){
  649. let n = Math.round(Math.random()*(arr1.length -1));
  650. screensInfo.value.screensCode += arr1[n]
  651. }
  652. }
  653. const tableRowClassName = ({row, rowIndex})=>{
  654. if ((rowIndex+1) % 2 === 0) {
  655. return 'success-row';
  656. }
  657. return '';
  658. }
  659. const getTableData = async() => {
  660. const table = await getScreensList({page: page.value, pageSize: pageSize.value,...searchInfo.value})
  661. if (table.code === 0) {
  662. tableData.value = table.data.list
  663. total.value = table.data.total
  664. page.value = table.data.page
  665. pageSize.value = table.data.pageSize
  666. }
  667. }
  668. const getScreensParms = async() => {
  669. const table = await queryscreensParms()
  670. if (table.code === 0) {
  671. screensParams.screensSize = table.data.screensSize
  672. screensParams.resolution = table.data.resolution
  673. screensParams.gatewayList = table.data.pubGateway
  674. }
  675. }
  676. getScreensParms()
  677. getTableData()
  678. const view = (row)=>{
  679. viewScreensDialog.value = true
  680. screensInfo.value = JSON.parse(JSON.stringify(row))
  681. screensInfo.value.installTime = new Date(screensInfo.value.installTime).toLocaleDateString()
  682. if (screensInfo.value.status ===1 ){
  683. onlineSum.value = TimeConversion(new Date()-new Date(screensInfo.value.lastOnlineTime))
  684. offlineSum.value = TimeConversion(new Date(screensInfo.value.lastOnlineTime)-new Date(screensInfo.value.lastOfflineTime))
  685. }else {
  686. onlineSum.value = TimeConversion(new Date(screensInfo.value.lastOfflineTime)-new Date(screensInfo.value.lastOnlineTime))
  687. offlineSum.value = TimeConversion(new Date()-new Date(screensInfo.value.lastOfflineTime))
  688. }
  689. if (screensInfo.value.lastOnlineTime === '0001-01-01T00:00:00Z' || screensInfo.value.lastOnlineTime === null ){
  690. screensInfo.value.lastOnlineTime = '——'
  691. onlineSum.value = "无"
  692. }else {
  693. screensInfo.value.lastOnlineTime = dayjs(screensInfo.value.lastOnlineTime).format('YYYY-MM-DD HH:mm:ss')
  694. }
  695. if (screensInfo.value.lastOfflineTime === '0001-01-01T00:00:00Z' || screensInfo.value.lastOfflineTime === null ){
  696. screensInfo.value.lastOfflineTime = '——'
  697. offlineSum.value = "无"
  698. }else {
  699. screensInfo.value.lastOfflineTime = dayjs(screensInfo.value.lastOfflineTime).format('YYYY-MM-DD HH:mm:ss')
  700. }
  701. }
  702. const handleSizeChange = (val) => {
  703. pageSize.value = val
  704. getTableData()
  705. }
  706. const handleCurrentChange = (val) => {
  707. page.value = val
  708. getTableData()
  709. }
  710. const add = () => {
  711. screensInfo.value={GateWay:{},Resolution:{},ScreensSize:{},resolutionId:1,screensSizeId:1,shunt:1}
  712. dialogFlag.value = 'add'
  713. addScreensDialog.value = true
  714. getNowDay()
  715. getRandomCode("XSP-")
  716. }
  717. const closeAddScreensDialog = () => {
  718. screensForm.value.resetFields()
  719. addScreensDialog.value = false
  720. isFlag.value=''
  721. }
  722. // 弹窗相关
  723. const onSubmit = () => {
  724. page.value = 1
  725. pageSize.value = 10
  726. getTableData()
  727. }
  728. const onReset = () => {
  729. searchInfo.value = {}
  730. }
  731. const enterAddScreensDialog = async() => {
  732. screensForm.value.validate(async valid => {
  733. if (valid) {
  734. const req = {
  735. ...screensInfo.value
  736. }
  737. if (dialogFlag.value === 'add') {
  738. const res = await addScreens(req)
  739. if (res.code === 0) {
  740. ElMessage({ type: 'success', message: '创建成功' })
  741. await getTableData()
  742. closeAddScreensDialog()
  743. }
  744. }
  745. if (dialogFlag.value === 'edit') {
  746. req.oldSn = oldSn.value
  747. const res = await setScreensInfo(req)
  748. if (res.code === 0) {
  749. ElMessage({ type: 'success', message: '编辑成功' })
  750. await getTableData()
  751. closeAddScreensDialog()
  752. }
  753. }
  754. }
  755. })
  756. }
  757. const editScreens = (row) => {
  758. dialogFlag.value = 'edit'
  759. oldSn.value = row.sn
  760. screensInfo.value = JSON.parse(JSON.stringify(row))
  761. addScreensDialog.value = true
  762. }
  763. const deleteScreens = (obj) => {
  764. ElMessageBox.confirm('您确定要删除吗?', '提示', {
  765. confirmButtonText: '确定',
  766. cancelButtonText: '取消',
  767. type: 'warning',
  768. })
  769. .then(async() => {
  770. const res = await deleteBaseScreens({ Sn:obj.sn })
  771. if (res.code === 0) {
  772. ElMessage({
  773. type: 'success',
  774. message: '删除成功!',
  775. })
  776. getTableData()
  777. }
  778. })
  779. .catch(() => {
  780. ElMessage({
  781. type: 'info',
  782. message: '已取消删除',
  783. })
  784. })
  785. }
  786. const switchOpenCloseScreens = async (obj,opt) => {
  787. if (obj.status ===0 ){
  788. ElMessage({
  789. type: 'info',
  790. message: '操作失败,设备离线',
  791. })
  792. return
  793. }
  794. var res = await switchScreens({sn:obj.sn,network:obj.network,flag:opt});
  795. if (res.code === 0) {
  796. ElMessage({
  797. type: 'success',
  798. message: '操作成功!',
  799. })
  800. }
  801. }
  802. const openInCodeDialog = async (obj)=>{
  803. if (obj.status ===0 ){
  804. ElMessage({
  805. type: 'info',
  806. message: '操作失败,设备离线',
  807. })
  808. return
  809. }
  810. inCodeDialog.value = true
  811. nowSn.value = obj.sn
  812. }
  813. const openVoiceBroadDialog = async (obj)=>{
  814. if (obj.status ===0 ){
  815. ElMessage({
  816. type: 'info',
  817. message: '操作失败,设备离线',
  818. })
  819. return
  820. }
  821. voiceBroadDialog.value = true
  822. nowSn.value = obj.sn
  823. }
  824. // const addData = ()=>{
  825. // if(dataForms.value.length === 5){
  826. // ElMessage({
  827. // type: 'info',
  828. // message: '最多添加五个数据',
  829. // })
  830. // return
  831. // }
  832. // var arr = {text:'',color:'',size:''}
  833. // dataForms.value.push(arr)
  834. // }
  835. // const minData = ()=>{
  836. // if(dataForms.value.length === 1){
  837. // ElMessage({
  838. // type: 'info',
  839. // message: '至少选择一个数据',
  840. // })
  841. // return
  842. // }
  843. // dataForms.value.length = dataForms.value.length-1
  844. // }
  845. const closeInCodeDialog = ()=>{
  846. nowSn.value = ""
  847. inCodeDialog.value = false
  848. dataForms.value = [{text:'', color:'红色',size:'24号'}]
  849. }
  850. const enterInCodeDialog = async ()=>{
  851. for (const x of dataForms.value) { // 使用 for...of 循环
  852. if (x.text === '') {
  853. ElMessage({
  854. type: 'error',
  855. message: '请填写文字内容',
  856. })
  857. return;
  858. }
  859. }
  860. var res = await sendInternalCode({sn:nowSn.value,content:dataForms.value});
  861. if (res.code === 0) {
  862. ElMessage({
  863. type: 'success',
  864. message: '操作成功!',
  865. })
  866. }
  867. }
  868. const closeVoiceBroadDialog = ()=>{
  869. nowSn.value = ""
  870. voiceBroadDialog.value = false
  871. voiceBroadForm.value = {}
  872. }
  873. const enterVoiceBroadDialog = async () => {
  874. var res = await voiceBroad({sn: nowSn.value, broadContent: voiceBroadForm.value.broadContent});
  875. if (res.code === 0) {
  876. ElMessage({
  877. type: 'success',
  878. message: '操作成功!',
  879. })
  880. }
  881. }
  882. const openSetBrightDialog = async (obj)=>{
  883. if (obj.status ===0 ){
  884. ElMessage({
  885. type: 'info',
  886. message: '操作失败,设备离线',
  887. })
  888. return
  889. }
  890. console.log("=====",obj)
  891. setBrightForm.value = {dayBright:obj.dayBright,nightBright:obj.nightBright,audioOn:obj.audioOn,audioOff:obj.audioOff,switchSn:obj.switchSn,ledOn:obj.ledOn,ledOff:obj.ledOff}
  892. setBrightDialog.value = true
  893. nowSn.value = obj.sn
  894. }
  895. const closeSetBrightDialog = ()=>{
  896. setBrightDialog.value = false
  897. nowSn.value = ""
  898. getTableData()
  899. }
  900. const enterSetBrightDialog = async () => {
  901. var res = await setBrightAudioLed({
  902. sn: nowSn.value,
  903. dayBright: setBrightForm.value.dayBright,
  904. nightBright: setBrightForm.value.nightBright,
  905. audioOn: setBrightForm.value.audioOn,
  906. audioOff: setBrightForm.value.audioOff,
  907. switchSn: setBrightForm.value.switchSn,
  908. ledOn:setBrightForm.value.ledOn,
  909. ledOff:setBrightForm.value.ledOff
  910. });
  911. if (res.code === 0) {
  912. ElMessage({
  913. type: 'success',
  914. message: '操作成功!',
  915. })
  916. }
  917. closeSetBrightDialog()
  918. }
  919. </script>
  920. <style>
  921. .el-table .success-row {
  922. background: #f3fdef;
  923. }
  924. .onlinebox{
  925. width: 12px; height: 12px;border-radius: 50%; display: inline-block; margin-right: 4px; position: relative; top: 1px;
  926. }
  927. .el-dialog__header{
  928. border-bottom: 1px solid #e8eaec;
  929. }
  930. .el-dialog__footer {
  931. border-top: 1px solid #e8eaec;
  932. }
  933. </style>