dggl.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <script setup lang="ts">
  2. import { clientGet } from '@/utils/request.ts'
  3. import type { BaseResponse } from '@/utils/type.ts'
  4. import { ref } from 'vue'
  5. import { ElLoading, ElMessage } from 'element-plus'
  6. import { useDebounceFn } from '@vueuse/core'
  7. interface StatusParams {
  8. cmd: number,
  9. lightNums: string,
  10. packageId: string
  11. }
  12. interface StatusResponse extends BaseResponse {
  13. data: string
  14. }
  15. interface LightData {
  16. light_num: string; // 灯编号
  17. brightness: number | boolean; // 亮度
  18. voltage: number; // 电压
  19. current: number; // 电流
  20. power: number; // 功率
  21. power_quantity: number; // 电量
  22. onlineStatus: number; // 在线状态
  23. }
  24. const cardDatas = ref<LightData[]>([]);
  25. const linkDialogVisible = ref(false);
  26. // const downloadUrl = ref('public/LedOK Express.rar');
  27. const orignalParams = [
  28. {
  29. cmd: 6012,
  30. lightNums: '40005289',
  31. packageId: '1050'
  32. },
  33. {
  34. cmd: 6012,
  35. lightNums: '40005272',
  36. packageId: '1050'
  37. },
  38. {
  39. cmd: 6012,
  40. lightNums: '40005274',
  41. packageId: '1050'
  42. },
  43. {
  44. cmd: 6012,
  45. lightNums: '40005281',
  46. packageId: '1050'
  47. }
  48. ]
  49. const getData = async () => {
  50. let process = 0
  51. const loading = ElLoading.service({
  52. lock: true,
  53. text: '正在加载数据' + process + '/' + orignalParams.length,
  54. background: 'rgba(200, 200, 200, .8)'
  55. })
  56. const list = []
  57. try {
  58. for (let i = 0; i < orignalParams.length; i++) {
  59. const res = await clientGet<StatusParams, StatusResponse>('/pole/instruct/issued/equipmentStatus', {
  60. params: orignalParams[i]
  61. })
  62. list.push(res)
  63. process = i + 1
  64. loading.setText('正在加载数据' + process + '/' + orignalParams.length)
  65. }
  66. const resList: LightData[] = list.map(res => {
  67. return JSON.parse(JSON.parse(res.data).params)
  68. })
  69. cardDatas.value = resList.flat(-1 >>> 1).map(item => {
  70. item.brightness = item.brightness != 0
  71. return item
  72. })
  73. } catch (error) {
  74. console.error('数据获取失败:', error)
  75. } finally {
  76. loading.close()
  77. }
  78. }
  79. const changeLight = useDebounceFn(async (light: LightData) => {
  80. const loading = ElLoading.service({
  81. lock: true,
  82. text: '正在操作灯杆' + light.light_num,
  83. background: 'rgba(200, 200, 200, .8)'
  84. })
  85. if (typeof light.brightness === 'number') {
  86. ElMessage.warning('出现了错误')
  87. return
  88. }
  89. try {
  90. const newBrightness = light.brightness ? 0 : 100
  91. await clientGet('/pole/instruct/issued/reportEnvironmentalData', {
  92. params: {
  93. cmd: 6011,
  94. lightNums: light.light_num,
  95. packageId: '1050',
  96. brightness: newBrightness
  97. }
  98. })
  99. const qq = await getSingleLightStatus({
  100. cmd: 6012,
  101. lightNums: light.light_num,
  102. packageId: '1050'
  103. })
  104. if(qq == null){
  105. ElMessage.error('获取状态失败,请重试')
  106. return
  107. }
  108. qq.brightness = qq.brightness != 0
  109. const updatedLightIndex = cardDatas.value.findIndex(card => card.light_num === light.light_num)
  110. if (updatedLightIndex !== -1) {
  111. cardDatas.value[updatedLightIndex] = (qq as LightData);
  112. }
  113. ElMessage.success(light.brightness ? '关灯' : '开灯')
  114. } catch (error) {
  115. console.error('开灯/关灯失败:', error)
  116. ElMessage.error('操作失败,请重试')
  117. }finally {
  118. loading.close()
  119. }
  120. },500);
  121. const getSingleLightStatus = async (params: StatusParams): Promise<LightData | null> => {
  122. try {
  123. const res = await clientGet<StatusParams, StatusResponse>('/pole/instruct/issued/equipmentStatus', {
  124. params: params
  125. });
  126. const parsedData = JSON.parse(JSON.parse(res.data).params);
  127. return parsedData[0];
  128. } catch (error) {
  129. console.error('获取单个灯杆状态失败:', error);
  130. ElMessage.error('获取状态失败,请重试');
  131. return null;
  132. }
  133. };
  134. const updateCurrentData = async (light:LightData)=>{
  135. const loading = ElLoading.service({
  136. lock: true,
  137. text: '正在获取当前灯杆数据',
  138. background: 'rgba(200, 200, 200, .8)'
  139. })
  140. const res = await getSingleLightStatus({cmd:6012,lightNums:light.light_num,packageId:'1050'})
  141. if(!res){
  142. ElMessage.error('获取状态失败,请重试')
  143. return
  144. }
  145. res.brightness = res.brightness != 0
  146. const updatedLightIndex = cardDatas.value.findIndex(card => card.light_num === light.light_num);
  147. if (updatedLightIndex !== -1) {
  148. cardDatas.value[updatedLightIndex] = res as LightData;
  149. }
  150. loading.close()
  151. }
  152. const toOtherLink = (linkStr:'一键报警'|'灯杆显示屏')=>{
  153. switch (linkStr){
  154. case '一键报警':
  155. window.open('https://172.16.102.27:8088/')
  156. break;
  157. case '灯杆显示屏':
  158. linkDialogVisible.value = true
  159. break;
  160. }
  161. }
  162. const init = () => {
  163. getData()
  164. }
  165. init()
  166. </script>
  167. <template>
  168. <div>
  169. <el-row :gutter="30" class="p-30px">
  170. <el-col :span="24">
  171. <el-row>
  172. <el-col :span="6">
  173. <el-button type="primary" @click="init">获取最新数据</el-button>
  174. </el-col>
  175. <el-col :span="4" :offset="14">
  176. <el-button type="info" @click="toOtherLink('一键报警')">一键报警</el-button>
  177. <el-button type="warning" @click="toOtherLink('灯杆显示屏')">灯杆显示屏</el-button>
  178. </el-col>
  179. </el-row>
  180. </el-col>
  181. <el-col :span="12" sm="24" v-for="(item,index) in cardDatas" :key="index" class="my-4">
  182. <el-card>
  183. <template #header>
  184. <div class="flex gap-1 justify-between px-3">
  185. <div class="flex gap-1">
  186. <div class="w-20px h-20px">
  187. <img class="w-full h-full" src="/src/assets/svg/灯杆.svg" alt="灯杆"/>
  188. </div>
  189. <div>灯杆信息</div>
  190. </div>
  191. <div>
  192. <el-button @click="updateCurrentData(item)">更新当前灯杆数据</el-button>
  193. </div>
  194. </div>
  195. </template>
  196. <template #default>
  197. <el-descriptions :title="'灯杆编号'+item.light_num" :column="2" border>
  198. <el-descriptions-item
  199. label="电压"
  200. label-align="right"
  201. align="center"
  202. >
  203. {{ item.voltage.toFixed(2) + 'V' }}
  204. </el-descriptions-item>
  205. <el-descriptions-item label="电流" label-align="right" align="center">
  206. {{ item.current.toFixed(2) + 'A' }}
  207. </el-descriptions-item>
  208. <el-descriptions-item label="功率" label-align="right" align="center">
  209. {{ item.power.toFixed(3) + 'kW' }}
  210. </el-descriptions-item>
  211. <el-descriptions-item label="电量" label-align="right" align="center">
  212. {{ item.power_quantity.toFixed(2) + '度' }}
  213. </el-descriptions-item>
  214. <el-descriptions-item label="在线状态" label-align="right" align="center">
  215. <el-tag :type="item.onlineStatus==1?'success':'danger'">
  216. <span v-if="item.onlineStatus==1">在线</span>
  217. <span v-else>离线</span>
  218. </el-tag>
  219. </el-descriptions-item>
  220. <el-descriptions-item label="开关" label-align="right" align="center" class-name="flex gap-20px">
  221. <el-text>当前
  222. <el-tag :type="item.brightness?'success':'danger'">{{ item.brightness ? '开' : '关' }}</el-tag>
  223. </el-text>
  224. <el-button :type="item.brightness?'info':'primary'" @click="changeLight(item)">
  225. {{ item.brightness ? '关闭' : '打开' }}
  226. </el-button>
  227. </el-descriptions-item>
  228. </el-descriptions>
  229. </template>
  230. </el-card>
  231. </el-col>
  232. </el-row>
  233. <el-dialog v-model="linkDialogVisible" title="请下载大屏显示器软件">
  234. <template #default>
  235. <div class="flex flex-col gap-10px">
  236. <div>
  237. <a :href="'/LedOK Express.rar'" download="LedOK_Express.rar">下载大屏显示器软件</a>
  238. </div>
  239. </div>
  240. </template>
  241. <template #footer>
  242. <el-button @click="linkDialogVisible=false">关闭</el-button>
  243. </template>
  244. </el-dialog>
  245. </div>
  246. </template>