main.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. <template>
  2. <div class="all-con" style="position: relative;">
  3. <!-- 顶部图标和导航部分 -->
  4. <el-icon style="position: absolute;left: -15px;top: 17px;">
  5. <component style="color:#fff;background-color: #3d3dff;height: 2.5em;border-radius:5px 0 0 5px;"
  6. :is="showicon? CaretLeft : CaretRight" @click="onShowHide" />
  7. </el-icon>
  8. <el-card class="oilInfo-bottom one">
  9. <el-row :gutter="10" style="text-align: center;line-height: 2em;height: 2em">
  10. <!-- 导航选项 -->
  11. <el-col :span="1">
  12. <div :style="isDisplay == 1? 'border-bottom:1px solid blue' : 'border:none'" @click="display(1)">概览</div>
  13. </el-col>
  14. <el-col :span="2">
  15. <div :style="isDisplay == 2? 'border-bottom:1px solid blue' : 'border:none'" @click="display(2)">报警</div>
  16. </el-col>
  17. <el-col :span="3" class="oilInfo-bottom">
  18. <div :style="isDisplay == 3? 'border-bottom:1px solid blue' : 'border:none'" @click="display(3)">ECQS编码状态</div>
  19. </el-col>
  20. <el-col :span="3" class="oilInfo-bottom">
  21. <div :style="isDisplay == 4? 'border-bottom:1px solid blue' : 'border:none'" @click="display(4)">维修记录</div>
  22. </el-col>
  23. <el-row :span="15" class="oilInfo-bottom to-flex" style="position: absolute;right: 0;">
  24. <div style="margin-right: 1em;">图例:</div>
  25. <div style="margin-right: 2em;">
  26. <div class="status-point" style="background-color:#5b53f9;right: 18.5em;top: 0.75em;" />在线
  27. </div>
  28. <div style="margin-right: 0.75em;">
  29. <div class="status-point" style="background-color:#9f9fa3;right: 14.5em;top: 0.75em;" />离线
  30. </div>
  31. <div style="margin-right: 0.75em;">
  32. <img :src="uurl" style="width: 1em;margin-right: 0.25em;">校验成功
  33. </div>
  34. <div style="margin-right: 2em;">
  35. <img :src="urrl" style="width: 1em;margin-right: 0.25em;">校验失败
  36. </div>
  37. </el-row>
  38. </el-row>
  39. </el-card>
  40. <div class="tip-con">
  41. <el-alert v-if="detailsData.list.onlineStatus === '离线'" title="加油机长时间离线" type="error" class="mb15"></el-alert>
  42. <el-alert v-if="detailsData.list.onlineStatus === '在线'" title="加油机长时间在线" type="success" class="mb15"></el-alert>
  43. </div>
  44. <!-- 新的父容器包裹油机内容,方便设置样式 -->
  45. <div class="engine-content-container">
  46. <el-card class="oilInfo-con oilInfo-bottom">
  47. <el-row class='oilInfo-bottom'>
  48. <img class="oilInfo-img" :src="url">
  49. <div>
  50. <el-col :span="24" class="oilInfo-bottom">
  51. <div class="status-point oilInfo-con-first"
  52. :style="detailsData.list.onlineStatus == '在线'? 'background-color:#5b53f9' : 'background-color:#9f9fa3'" />
  53. <span style="margin:0 0.5em 0 1em">{{ detailsData.list.name }}号机油机</span>
  54. <img :src="uurl" style="width: 1em;">
  55. </el-col>
  56. <el-col :span="24" class="oilInfo-bottom">
  57. <span class='oilInfo-item'>出厂编号:</span>{{ detailsData.list.serialNumber }}
  58. </el-col>
  59. <el-col :span="24" class="oilInfo-bottom">
  60. <span class='oilInfo-item'>制造商:</span>{{ detailsData.list.manufacturer }}
  61. </el-col>
  62. </div>
  63. </el-row>
  64. <div>
  65. <el-row :gutter="20">
  66. <el-col :span="6" class="oilInfo-bottom">
  67. <span class='oilInfo-item'>机型:</span>{{ detailsData.list.model }}
  68. </el-col>
  69. <el-col :span="6" class="oilInfo-bottom">
  70. <span class='oilInfo-item'>规格参数:</span>{{ detailsData.list.modelSpec }}
  71. </el-col>
  72. <el-col :span="6" class="oilInfo-bottom">
  73. <span class='oilInfo-item'>测量范围:</span>{{ detailsData.list.measureRang }}
  74. </el-col>
  75. <el-col :span="6" class="oilInfo-bottom">
  76. <span class='oilInfo-item'>准确度等级:</span>{{ detailsData.list.accuracyLevel }}
  77. </el-col>
  78. </el-row>
  79. <el-row :gutter="20">
  80. <el-col :span="6" class="oilInfo-bottom">
  81. <span class='oilInfo-item'>生产日期:</span>{{ detailsData.list.createdTime }}
  82. </el-col>
  83. <el-col :span="6" class="oilInfo-bottom">
  84. <span class='oilInfo-item'>安装日期:</span>{{ detailsData.list.installationDate }}
  85. </el-col>
  86. <el-col :span="6" class="oilInfo-bottom">
  87. <span class='oilInfo-item'>启用日期:</span>{{ detailsData.list.startupDate }}
  88. </el-col>
  89. <el-col :span="6" class="oilInfo-bottom">
  90. <span class='oilInfo-item'>累计在线时间:</span>{{ detailsData.list.onlineDesc }}
  91. </el-col>
  92. </el-row>
  93. </div>
  94. </el-card>
  95. </div>
  96. <!-- 新的父容器包裹油枪信息,方便设置样式 -->
  97. <div class="nozzle-content-container">
  98. <el-row :gutter="16" style="margin-top:10px;" :key="flagData.keyData">
  99. <el-col :span="8" v-for="(item, index) in listcom" v-bind:key="index">
  100. <el-card class="oilInfo-msg oilInfo-bottom"
  101. @click="toParts(item.name, item.mainBoard_NozzleNo, item.onlineStatus, item.fuelName, item.alarming, item.code)">
  102. <el-row class="oilInfo-bottom">
  103. <img :src="url" class="oilInfo-img">
  104. <div>
  105. <el-col :span="24" class="oilInfo-bottom">
  106. <el-text tag="b">逻辑枪号:{{ item.name }}</el-text>
  107. <div style="position: absolute;right: 10%;top: 5%;">
  108. <div class="status-point"
  109. :style="item.onlineStatus == '在线'? 'background-color:#5b53f9' : 'background-color:#9f9fa3'">
  110. </div>
  111. <img :src="uurl" style="width: 1em;">
  112. </div>
  113. </el-col>
  114. <el-col :span="24" class="oilInfo-bottom">
  115. <span class="oilInfo-item-two">物理枪号:</span>{{ item.mainBoard_NozzleNo }}
  116. </el-col>
  117. <el-col :span="24" class="oilInfo-bottom">
  118. <span class="oilInfo-item-two">自锁功能:</span>{{ item.alarming }}
  119. </el-col>
  120. </div>
  121. </el-row>
  122. <el-row class="oilInfo-bottom">
  123. <span class="oilInfo-item-two">油品:</span>{{ item.fuelName }}
  124. </el-row>
  125. <el-row>
  126. <span class="oilInfo-item-two">ECQS编码:</span>{{ item.code }}
  127. </el-row>
  128. </el-card>
  129. </el-col>
  130. </el-row>
  131. </div>
  132. </div>
  133. </template>
  134. <script setup lang="ts">
  135. import { computed, onMounted, reactive, ref, watch } from "vue";
  136. //import { CirclePlusFilled } from '@element-plus/icons-vue'
  137. import { NozzlecontrolDtl } from "/@/api/admin/reportManagement/moreOilEngineDetails/moreOilEngineDetailsDto";
  138. import { OilEngineDetailsApi } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsApi";
  139. import { FuelDispenserEntity, AlarmHistoryDto } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsDto"
  140. import router from "/@/router";
  141. import { MoreOilEngineDetailsApi } from "/@/api/admin/reportManagement/moreOilEngineDetails/moreOilEngineDetailsApi";
  142. import {
  143. Document,
  144. Menu as IconMenu,
  145. Location,
  146. Setting,
  147. CaretRight,
  148. CaretLeft,
  149. } from '@element-plus/icons-vue'
  150. /******************************数据对象***************************************/
  151. const url = '/src/assets/logo-com.png'
  152. const uurl = '/src/assets/map/IconParkSolidCheckOne.png'
  153. const urrl = '/src/assets/map/IconParkSolidCloseOne.png'
  154. /**
  155. * 接收index.vue传的id,传递 菜单栏控制参数
  156. */
  157. const props = defineProps({
  158. id: String,
  159. })
  160. const emit = defineEmits(['getIcon'])
  161. /**
  162. * 表格数据对象
  163. */
  164. const tableData = reactive({
  165. loading: false,
  166. list: [] as Array<AlarmHistoryDto>
  167. })
  168. /**
  169. * 油机详情数据对象
  170. */
  171. const detailsData = reactive({
  172. loading: false,
  173. list: {} as FuelDispenserEntity
  174. })
  175. /**
  176. * 油机列表详情数据对象
  177. */
  178. const oilListData = reactive({
  179. loading: false,
  180. list: [] as Array<NozzlecontrolDtl>
  181. })
  182. /**
  183. * 油机列表初始ID
  184. */
  185. const initID = ref()
  186. const toPage = () => {
  187. const id = props.id
  188. router.push({ path: `/statement/${id}/more/moreAlert` })
  189. }
  190. /**
  191. * 油枪列表相关数据
  192. */
  193. let listcom = JSON.parse(JSON.stringify(oilListData.list))
  194. let flagData = reactive({
  195. keyData: 0,
  196. isFlag: '所有'
  197. })
  198. /******************************数据对象***************************************/
  199. /*******************************方法**************************************/
  200. // /**
  201. // * 变换时改样式
  202. // * @param event
  203. // * @param item
  204. // */
  205. // const onCardChange = (event, item) => {
  206. // // console.log(event)
  207. // // console.log(item);
  208. // let ele = event.target
  209. //
  210. // if( ele.getAttribute('name') !== 'card') {
  211. // ele = ele.closest('.card')
  212. // }
  213. //
  214. // if(ele.classList.contains("active-card")) return
  215. //
  216. // initID.value = item.oilEngineName
  217. //
  218. // const parentElement = document.getElementById('top-conId')
  219. // const myElement = parentElement.querySelector('.active-card')
  220. //
  221. // if(myElement){
  222. // myElement.classList.remove('active-card')
  223. // }
  224. //
  225. // ele.classList.add("active-card")
  226. // }
  227. watch(() => initID.value, () => {
  228. initTableData()
  229. initDetailsData()
  230. })
  231. watch(props, (val) => {
  232. init()
  233. })
  234. /*******************************方法**************************************/
  235. /**********************************初始化***********************************/
  236. /**
  237. * 格式化日期
  238. */
  239. const formatDate = (val) => {
  240. const date = new Date(val)
  241. const year: number = date.getFullYear();
  242. const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
  243. const day: string = date.getDate().toString().padStart(2, '0');
  244. const hours: string = date.getHours().toString().padStart(2, '0');
  245. const minutes: string = date.getMinutes().toString().padStart(2, '0');
  246. const seconds: string = date.getSeconds().toString().padStart(2, '0');
  247. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  248. }
  249. /**
  250. * 初始化油机列表详情数据对象
  251. */
  252. const initOilListData = async () => {
  253. oilListData.loading = true
  254. const fuelId = props.id
  255. const { data } = await new MoreOilEngineDetailsApi().getOilListData({ Fuelid: fuelId })
  256. oilListData.list = data
  257. oilListData.loading = false
  258. listcom = data
  259. flagData.keyData = Math.random()
  260. }
  261. /**
  262. * 初始化表格数据对象
  263. */
  264. const initTableData = async () => {
  265. tableData.loading = true
  266. const fuelId = props.id
  267. const filter = { fuelId: fuelId }
  268. const pageInput = { currentPage: 1, pageSize: 5 }
  269. const { data } = await new OilEngineDetailsApi().getAlarmHistoryDto({ ...pageInput, filter: filter })
  270. tableData.list = data.list
  271. tableData.list = tableData.list?.map((item) => {
  272. if (item.createdDate !== null) {
  273. item.createdDate = formatDate(item.createdDate)
  274. }
  275. return item
  276. })
  277. tableData.loading = false
  278. }
  279. /**
  280. * 初始化油机详情数据对象
  281. */
  282. const initDetailsData = async () => {
  283. detailsData.loading = true
  284. const fuelId = props.id
  285. const { data } = await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: fuelId })
  286. detailsData.list = data
  287. if (detailsData.list.createdTime !== null) {
  288. detailsData.list.createdTime = formatDate(detailsData.list.createdTime)
  289. }
  290. if (detailsData.list.installationDate !== null) {
  291. detailsData.list.installationDate = formatDate(detailsData.list.installationDate)
  292. }
  293. if (detailsData.list.startupDate !== null) {
  294. detailsData.list.startupDate = formatDate(detailsData.list.startupDate)
  295. }
  296. if (detailsData.list.onlineStatus !== null) {
  297. if (detailsData.list.onlineStatus === 'offline') {
  298. detailsData.list.onlineStatus = '离线'
  299. } else {
  300. detailsData.list.onlineStatus = '在线'
  301. }
  302. }
  303. if (detailsData.list.deviceStatus !== null) {
  304. if (detailsData.list.deviceStatus === 'enable') {
  305. detailsData.list.deviceStatus = '启用'
  306. } else if (detailsData.list.deviceStatus === 'factory') {
  307. detailsData.list.deviceStatus = '出厂注册'
  308. } else {
  309. detailsData.list.deviceStatus = '备案'
  310. }
  311. }
  312. detailsData.loading = false
  313. }
  314. const init = () => {
  315. initDetailsData()
  316. initTableData()
  317. initOilListData()
  318. }
  319. onMounted(() => {
  320. init()
  321. })
  322. // 路由跳转 -- 部件信息图
  323. const toParts = ((name: any, NozzleNo: any, status: any, fuelName: any, alarming: any, code: any) => {
  324. router.push({
  325. path: `/statement/partInformation`,
  326. query: {
  327. name: name,
  328. NozzleNo: NozzleNo,
  329. status: status,
  330. fuelName: fuelName,
  331. alarming: alarming,
  332. code: code
  333. }
  334. })
  335. })
  336. /**********************************初始化***********************************/
  337. const isOnline = (statu: string) => {
  338. if (statu == '所有') {
  339. listcom = JSON.parse(JSON.stringify(oilListData.list))
  340. } else {
  341. listcom = oilListData.list.filter((data) => {
  342. return data.onlineStatus === statu
  343. })
  344. }
  345. flagData.keyData = Math.random()
  346. flagData.isFlag = statu
  347. }
  348. const isDisplay = ref(1)
  349. // 内容区顶部导航 变换
  350. const display = (num: number) => {
  351. isDisplay.value = num
  352. if (num == 2) {
  353. toPage()
  354. }
  355. }
  356. // 菜单栏的显示与隐藏
  357. let showicon = ref(true)
  358. const onShowHide = () => {
  359. showicon.value = !showicon.value
  360. emit('getIcon', showicon.value)
  361. }
  362. </script>
  363. <style scoped lang="scss">
  364. .all-con {
  365. flex: 1;
  366. margin-left: 20px;
  367. }
  368. .oilInfo-bottom {
  369. margin-bottom: 10px;
  370. }
  371. .oilInfo-top {
  372. margin-bottom: 10px;
  373. }
  374. .oilInfo-con {
  375. width: 100%;
  376. height: 25%;
  377. border-radius: 10px;
  378. }
  379. .oilInfo-item {
  380. color: rgb(173, 171, 171)
  381. }
  382. .oilInfo-img {
  383. margin-right: 20px;
  384. width: 75px;
  385. height: 75px;
  386. background-color: #ccc;
  387. border-radius: 8px;
  388. }
  389. .oilLabel-con {
  390. background-color: #89898b;
  391. height: 1.5em;
  392. width: 3.9em;
  393. line-height: 1.5em;
  394. text-align: center;
  395. border-radius: 999rem;
  396. color: #fff;
  397. }
  398. .oilInfo-msg {
  399. height: 200px;
  400. .oilInfo-item-two {
  401. color: rgb(173, 171, 171)
  402. }
  403. }
  404. // 小圆点
  405. .status-point {
  406. display: inline-block;
  407. width: 6px;
  408. height: 6px;
  409. border-radius: 50%;
  410. position: absolute;
  411. right: 10%;
  412. top: 30%;
  413. margin-right: 30px;
  414. }
  415. .oilInfo-con-first {
  416. left: 7em;
  417. top: 0.5em;
  418. }
  419. </style>