index.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. <template>
  2. <!-- 设备列表 -->
  3. <div class="devicePage flex-col">
  4. <div class="listBox">
  5. <s-header :name="sys ? sys.title : $t('device.managementCenter')" :noback="true" :isFixed="false"></s-header>
  6. <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('public.requestFailed')"
  7. :finished="finished" :finished-text="$t('public.noMore')" offset="100" :immediate-check="false" @load="onLoad">
  8. <div class="deviceBox1 flex-col">
  9. <div class="searchRow flex-row justify-between">
  10. <div class="flex-col">
  11. <div class="flex-row justify-between bd3">
  12. <div class="flex-col outer4"></div>
  13. <span class="flex-col txt2">
  14. {{ $t("device.dataOverview") }}</span>
  15. </div>
  16. </div>
  17. <div class="flex-col">
  18. <div class="main5 flex-row justify-between">
  19. <van-popover v-model:show="showPopover" placement="left-start" theme="dark" :actions="actions"
  20. @select="selectLabel">
  21. <template #reference>
  22. <van-icon name="bars" class="fixed-icon o-pr-15" style="font-size: 0.55rem;" color="#4d6add" />
  23. </template>
  24. </van-popover>
  25. <img class="label2" src="../../assets/device/searchIcon.png" @click="searchClick" />
  26. <!-- <div class="TextGroup2 flex-col">
  27. <span class="txt3">{{ $t("device.search") }}</span>
  28. </div> -->
  29. </div>
  30. </div>
  31. </div>
  32. <img class="pic1" src="../../assets/device/line.png" />
  33. <div class="o-plr-15 o-ptb-20">
  34. <div class="bd1 flex-col">
  35. <div class="box2 l-f l-flex-c l-flex-j-a">
  36. <div @click="eqeStatusClk(1)" class="TextGroup3 flex-col">
  37. <div class="group1 flex-col justify-between align-center">
  38. <span class="word4">{{ equipStatus.machineUseNum }}</span>
  39. <span class="info1">{{ $t("device.totalNumberOfRuns") }}</span>
  40. </div>
  41. </div>
  42. <div @click="eqeStatusClk('')" class="TextGroup3 flex-col">
  43. <div class="group1 flex-col justify-between align-center">
  44. <span class="word4">{{ equipStatus.machineTotalNum }}</span>
  45. <span class="info1">{{ $t("device.totalNumberOfEquipment") }}</span>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="deviceBox2 flex-col justify-between">
  53. <van-tabs v-model:active="active" @click-tab="clickLabel" class="tabs2 o-pb-15">
  54. <van-tab :title="$t('device.whole')" name="">
  55. </van-tab>
  56. <van-tab v-for="item in labelList" :name="item.id" :key="item" :title="item.name">
  57. </van-tab>
  58. </van-tabs>
  59. <div class="section1 flex-col">
  60. <div class="outer1 flex-col o-plr-15">
  61. <div v-for="item in list" :key="item" class="o-pb-20">
  62. <div class="bd1 l-flex-between">
  63. <div class="l-flex-RC">
  64. <div class="layer1 flex-col"></div>
  65. <div class="txtBox">
  66. <span class="txt1">{{ item.name == null ? item.clientId.slice(-6) : item.name }}</span>
  67. </div>
  68. </div>
  69. <div v-if="item.hasTodayAlarm" :class="{ 'flash-icon': showAlert }" class="box4 o-mr-5"></div>
  70. <div v-if="!item.hasTodayAlarm" class="layer2 o-mr-5"
  71. :class="{ deviceOn: item.eqeStatus === 1, layerLeft: item.hasTodayAlarm, }"></div>
  72. </div>
  73. <!-- 机器编码 -->
  74. <span class="txt1 o-mt-10">{{ $t("device.machineUniqueCode") }}:{{ item.clientId }}</span>
  75. <!-- 锁机状态 -->
  76. <span v-if="user.type < 1" class="txt1 o-mt-10">
  77. {{ $t("device.lockCondition") }}:{{ item.isBlocked ? $t("device.lockState") : $t("device.unLockState")
  78. }}
  79. </span>
  80. <!-- 温湿度 -->
  81. <span v-if="(item.machineType == '0' || item.machineType == null) && item.equimentType != 'P30'"
  82. class="txt1 o-mt-10">
  83. {{ $t("device.furnaceHeadTemperature") + ':' +
  84. item.furnaceTm
  85. + $t("device.degree") }}
  86. </span>
  87. <span v-if="(item.machineType == '0' || item.machineType == null) && item.equimentType != 'P30'"
  88. class="txt1 o-mt-10">
  89. {{ $t("device.temperatureInCabinet") + ':' + item.cabinetTm
  90. + $t("device.degree") }}
  91. </span>
  92. <span v-if="(item.machineType == '0' || item.machineType == null) && item.equimentType != 'P30'"
  93. class="txt1 o-mt-10">
  94. {{ $t("device.humidityInCabinet") + ':' + item.cabinetHd
  95. + $t("device.humidity") }}
  96. </span>
  97. <span v-if="item.machineType == '1' && item.equimentType == 'P30'" class="txt1 o-mt-10">
  98. {{ $t("device.cornGeneratorTemperature") + ':' + item.cabinetTm + $t("device.degree") }}
  99. </span>
  100. <span v-if="item.machineType == '1' && item.equimentType == 'P30'" class="txt1 o-mt-10">
  101. {{ $t("device.stirringTemperature") + ':' + item.cabinetHd + $t("device.degree") }}
  102. </span>
  103. <span v-if="item.machineType == '1' && item.equimentType == 'P30'" class="txt1 o-mt-10">
  104. {{ $t("device.cupQuantity") + ':' + item.furnaceTm }}
  105. </span>
  106. <img v-if="item.checkType" class="pic1" referrerpolicy="no-referrer" src="../../assets/home/line.png" />
  107. <div class="contentBottomCon" v-if="item.checkType">
  108. <!-- 所属商家 -->
  109. <!-- <span class="txt1 o-mt-10">{{ $t("device.affiliatedMerchants") }}:{{ item.adminUserName }}</span> -->
  110. <div v-if="user.type < 2" class="contentWord kBordBott">{{ $t("device.affiliatedMerchants") }}:{{
  111. item.adminUserName }}
  112. </div>
  113. <!-- 睡眠状态 -->
  114. <div class="contentWord kBordBott">
  115. <span class="word o-mr-10">{{ $t("device.sleepState") }}:{{ item.isSleep ? $t("device.sleeping") :
  116. $t("device.notSleeping") }}</span>
  117. <van-switch :model-value="item.isSleep" size="18px" @click="changeSleep(item)" />
  118. </div>
  119. <!-- 睡眠描述 -->
  120. <div v-if="item.isSleep" class="contentWord kBordBott">
  121. <span class="word">{{ $t("device.sleepDesc") }}:</span>
  122. <van-field colon center class="word2" v-model="item.sleepDesc" v-if="!sleepDescBoxShow"
  123. :placeholder="$t('device.sleepDescPlace')" label-width="auto">
  124. <template #button class="button_1">
  125. <van-button type="primary" @click="sleepDescChg(item.sleepDesc, item.id)">
  126. {{ $t("device.confirm") }}
  127. </van-button>
  128. <van-button type="primary" @click="editSleepDesc()">{{ $t("device.cancel") }}</van-button>
  129. </template>
  130. </van-field>
  131. <div class="l-flex-RC" v-else>
  132. <span class="word o-mr-10">{{ item.sleepDesc == null ? $t("device.SuspendBusiness") :
  133. item.sleepDesc
  134. }}</span>
  135. <van-button type="primary" @click="editSleepDesc()">{{ $t("device.modify") }}</van-button>
  136. </div>
  137. </div>
  138. <span v-if="item.machineType == null || item.machineType == '0'"
  139. class="contentWord kBordBott l-flex-RC">
  140. <span class="word">{{ $t("device.clickRestart") }}:</span>
  141. <van-button @click="restartHead(item.id)" type="primary">{{ $t("device.restartHead") }}</van-button>
  142. </span>
  143. <!-- 炉头状态 -->
  144. <div class="contentWord kBordBott" v-if="item.machineType == null || item.machineType == '0'">
  145. <span class="word">
  146. {{ (item.machineType == '0' || item.machineType == null) ? $t("device.furnHeadStatus") :
  147. $t("device.deviceStatus") }}:
  148. {{ item.eqeStatus === 1 ? $t("device.opened") : $t("device.closed") }}
  149. </span>
  150. <div class="o-ml-10">
  151. <van-button @click="openCloseHead(item.id, 1)" type="primary">{{ $t("device.open") }}</van-button>
  152. <van-button @click="openCloseHead(item.id, 0)" type="primary">{{ $t("device.close")
  153. }}</van-button>
  154. </div>
  155. </div>
  156. <!-- <span class="txt5 o-ptb-10 kBordBott l-flex-RC"><span>远程开门:</span>
  157. <van-button type="primary">开门</van-button>
  158. </span> -->
  159. <!-- 定位: -->
  160. <span v-if="item.latitude" class="contentWord kBordBott l-flex-LC justify-space-between">
  161. <span class="word">{{ $t("device.position") }}:</span>
  162. <a class="clickable-link" @click="viewPosiClk(item)">{{ item.fullName }}</a>
  163. </span>
  164. <!-- 机器参数 -->
  165. <!-- <van-row class="layer5 kBordBott" justify="space-between"
  166. v-if="(item.machineType == '0' || item.machineType == null) && item.equimentType != 'P30'">
  167. <van-col class="word5">{{ $t("device.furnaceHeadTemperature") }}:{{
  168. item.furnaceTm
  169. }}{{ $t("device.degree") }}</van-col>
  170. <van-col class="word5">{{ $t("device.temperatureInCabinet") }}:{{
  171. item.cabinetTm
  172. }}{{ $t("device.degree") }}</van-col>
  173. <van-col class="word5">{{ $t("device.humidityInCabinet") }}:{{
  174. item.cabinetHd
  175. }}{{ $t("device.humidity") }}</van-col>
  176. </van-row> -->
  177. <!-- <van-row class="layer5 kBordBott" justify="space-between" v-if="item.machineType == '1'">
  178. <van-col class="word5">{{ $t("device.cornGeneratorTemperature") }}:{{
  179. item.cabinetTm
  180. }}{{ $t("device.degree") }}</van-col>
  181. <van-col class="word5">{{ $t("device.stirringTemperature") }}:{{
  182. item.cabinetHd
  183. }}{{ $t("device.degree") }}</van-col>
  184. <van-col class="word5">{{ $t("device.cupQuantity") }}:{{ item.furnaceTm
  185. }}</van-col>
  186. </van-row> -->
  187. <template v-if="item.isMaterialUse === '1' && (item.machineType == '0' || item.machineType == null)">
  188. <van-row justify="space-between" class="sugarTxt kBordBott">
  189. <van-col>
  190. {{ $t("device.whiteSugar") }}:{{ Format_calcuDecial(item.whiteSugar) }}%
  191. </van-col>
  192. <van-col>
  193. {{ $t("device.redSugar") }}:{{ Format_calcuDecial(item.redSugar) }}%
  194. </van-col>
  195. <van-col>
  196. {{ $t("device.yellowSugar") }}:{{ Format_calcuDecial(item.yellowSugar) }}%
  197. </van-col>
  198. <van-col>
  199. {{ $t("device.blueSugar") }}:{{ Format_calcuDecial(item.blueSugar) }}%
  200. </van-col>
  201. </van-row>
  202. <div class="sugarTxt kBordBott">
  203. <span>{{ $t("device.stick") }}:{{
  204. Format_calcuDecial(item.stick)
  205. }}%</span>
  206. </div>
  207. <van-row gutter="20" class="sugarTxt kBordBott">
  208. <van-col>
  209. {{ $t("device.water") }}:{{ Format_calcuDecial(item.water) }}%
  210. </van-col>
  211. <van-col>
  212. {{ $t("device.wasteWater") }}:{{ Format_calcuDecial(item.wasteWater) }}%
  213. </van-col>
  214. </van-row>
  215. <!-- 一键补料 -->
  216. <span class="contentWord kBordBott">
  217. <span class="l-flex-RC">{{ $t("device.oneKeyFeed") }}:
  218. <van-button class="replenishment" @click="replenishmentClk(item)" type="primary">{{
  219. $t("device.replenishment") }}
  220. </van-button>
  221. </span>
  222. </span>
  223. </template>
  224. <!-- 最近刷新时间 -->
  225. <span class="contentWord kBordBott">{{ $t("device.lastRefreshTime") }}:{{
  226. showDateTime(item.lastUpdateTime)
  227. }}</span>
  228. <!-- 音量 -->
  229. <span v-if="item.machineType != '2'" class="contentWord kBordBott">{{ $t("device.volume") }}:{{
  230. item.volume }}</span>
  231. <!-- 报警内容 -->
  232. <!-- <div class="contentWord kBordBott l-flex-LC justify-space-between">
  233. <span>{{ $t("device.alarmContent") }}:</span>
  234. <span class="word3">{{
  235. item.alarmList && item.alarmList[0] && item.alarmList[0].alarmContent
  236. ? showDateTime(item.alarmList[0].occurrenceTime) + " " + item.alarmList[0].alarmContent
  237. : $t("device.alarmContentNoData")
  238. }}
  239. </span>
  240. <van-button v-if="item.alarmList && item.alarmList[0] && item.alarmList[0].alarmContent"
  241. style="flex-shrink: 0; margin: 0;" type="primary" color="#07c160"
  242. :text="$t('device.eliminateAlarm')" @click="clearAlarm(item.alarmList[0], item)"></van-button>
  243. </div> -->
  244. <div class="alert-item kBordBott" v-for="itemAlarm in item.alarmList" :key="itemAlarm">
  245. <div class="alert-info o-pr-5">
  246. <span style="display: block;">{{ $t("device.time") }} : {{ showDateTime(itemAlarm.occurrenceTime)
  247. }}
  248. </span>
  249. <span>{{ $t("device.alarmContent") }} : {{ itemAlarm.alarmContent }}</span>
  250. </div>
  251. <div class="lineCon"></div>
  252. <div class="alert-actions">
  253. <van-button type="primary" color="#07c160" style="margin: 0 10px;"
  254. :text="$t('device.eliminateAlarm')"
  255. @click="clearAlarm(itemAlarm, item, item.alarmList)"></van-button>
  256. </div>
  257. </div>
  258. <div class="editDeviceBtnCon l-flex-center o-mt-10">
  259. <!-- 详细信息 -->
  260. <div class="l-flex-RC" @click="deviceSet(item)">
  261. <span class="c-text-14">{{
  262. $t("device.editDevice")
  263. }}</span>
  264. <div class="box2 flex-col"></div>
  265. </div>
  266. <!-- 远程操作 -->
  267. <div class="l-flex-RC" @click="deviceOprShow(item)">
  268. <span class="c-text-14">{{
  269. $t("device.commonOperations")
  270. }}</span>
  271. <div class="box2 flex-col"></div>
  272. </div>
  273. </div>
  274. <div style="height: 10px;"></div>
  275. </div>
  276. <div class="bd6 l-flex-center o-ptb-7" @click="item.checkType = !item.checkType">
  277. <div class="l-flex-RC">
  278. <span class="info2 o-mr-5">{{
  279. item.checkType ? $t("device.stow") : $t("device.seeMore")
  280. }}</span>
  281. <div class="group2 flex-col" :class="{ checkType: item.checkType }"></div>
  282. </div>
  283. </div>
  284. </div>
  285. <van-back-top @click="backTop" right="5vw" bottom="10vh" />
  286. </div>
  287. </div>
  288. </div>
  289. </van-list>
  290. </div>
  291. <deviceOper ref="oprRef" @operfinish="operFinish"></deviceOper>
  292. <!-- 搜索弹出框 -->
  293. <deviceSearch ref="searchRef" @search="search($event)"></deviceSearch>
  294. <div style="height: 50px;"></div>
  295. </div>
  296. </template>
  297. <script>
  298. import {
  299. Api_postMachineNum,
  300. } from "../../service/home";
  301. import { onMounted, reactive, toRefs, ref, onActivated } from "vue";
  302. import { showFailToast, showSuccessToast, showToast, showConfirmDialog } from "vant";
  303. import sHeader from "../../components/SimpleHeader";
  304. import { getLoginUser, Format_calcuDecial, styleUrl } from "../../common/js/utils";
  305. import {
  306. getDeviceList,
  307. eliminate,
  308. Api_getReplenishment,
  309. changeSleepDesc,
  310. setFurnace,
  311. sleepEquipment,
  312. } from "../../service/device/index";
  313. import deviceSearch from "./deviceSearch";
  314. import deviceOper from "./deviceOper";
  315. import { onBeforeRouteLeave, useRouter } from "vue-router";
  316. import dateUtil from "../../utils/dateUtil";
  317. import { useI18n } from "vue-i18n";
  318. import { onBeforeUnmount } from "vue";
  319. import { Api_getLabelList } from "../../service/labelMan";
  320. export default {
  321. name: "device",
  322. components: { sHeader, deviceSearch, deviceOper },
  323. setup() {
  324. const { t } = useI18n();
  325. const searchRef = ref(null);
  326. const oprRef = ref(null);
  327. const list = ref([]);
  328. const loading = ref(true);
  329. const error = ref(false);
  330. const finished = ref(false);
  331. const router = useRouter();
  332. const sys = ref(null);
  333. const user = getLoginUser();
  334. const verticalScrollPosition = ref(0);
  335. const labelList = ref([]);
  336. // 返回顶部
  337. const backTop = () => {
  338. window.scrollY = 0;
  339. }
  340. onActivated(() => {
  341. // 当组件被激活时,可能是从 keep-alive 缓存中激活的
  342. // 这时重新添加滚动事件监听器
  343. // console.log("进入时的位置", verticalScrollPosition.value);
  344. document.documentElement.scrollTop = verticalScrollPosition.value;
  345. document.body.scrollTop = verticalScrollPosition.value;
  346. window.scrollY = verticalScrollPosition.value;
  347. // window.addEventListener('scroll', handleScroll);
  348. });
  349. onBeforeRouteLeave(() => {
  350. verticalScrollPosition.value = document.documentElement.scrollTop || document.body.scrollTop || window.scrollY;
  351. // console.log("离开时的位置", verticalScrollPosition.value);
  352. })
  353. // 在组件卸载前清除定时器
  354. onBeforeUnmount(() => {
  355. clearInterval(updateDataInterval);
  356. });
  357. const updateDataInterval = () => {
  358. // 每隔5分钟更新数据
  359. setInterval(() => {
  360. init();
  361. if (oprRef.value) {
  362. oprRef.value.closeOper();
  363. }
  364. // verticalScrollPosition.value = 0;
  365. }, 5 * 60 * 1000); // 5分钟的毫秒数
  366. };
  367. //控制睡眠描述的显示隐藏
  368. const sleepDescBoxShow = ref(true);
  369. // 页面列表查询参数
  370. let searchParams = reactive({
  371. id: "", // 用户账户id
  372. // adminName: '', // 用户登录名
  373. current: 1, // 页数
  374. size: 10, // 页大小
  375. todayDate: dateUtil.formateDate(new Date(), "yyyy-MM-dd"), // 当天时间
  376. labelId: "", // 分组标签
  377. });
  378. // 初始化页面获取列表
  379. const showAlert = ref(false);
  380. onMounted(() => {
  381. sleepDescBoxShow.value = true;
  382. init();
  383. updateDataInterval();
  384. // window.addEventListener('scroll', handleScroll);
  385. // 加载样式
  386. styleUrl('device');
  387. setInterval(() => {
  388. showAlert.value = !showAlert.value;
  389. }, 500); // 1000毫秒即1秒
  390. });
  391. // 初始化
  392. const init = () => {
  393. // 获取设备情况
  394. getMachineNum();
  395. getLabelList();
  396. if (localStorage.getItem("loginSys")) {
  397. const loginSysString = localStorage.getItem("loginSys");
  398. sys.value = JSON.parse(loginSysString);
  399. }
  400. list.value = [];
  401. searchParams.current = 1;
  402. if (user) {
  403. searchParams.id = user.id;
  404. // if (user.isAdmined) {
  405. // searchParams.adminName = user.username;
  406. // }
  407. getList();
  408. }
  409. };
  410. // 获取设备标签
  411. const getLabelList = async () => {
  412. // console.log("adminId>>>>", user.id);
  413. Api_getLabelList({
  414. adminId: user.id,
  415. type: "1"
  416. }).then((res) => {
  417. const { data } = res.data;
  418. labelList.value = data;
  419. })
  420. }
  421. // 获取设备列表数据
  422. const getList = async () => {
  423. finished.value = false;
  424. const { data } = await getDeviceList(Object.assign({}, searchParams));
  425. if (data.code === "00000") {
  426. if (searchParams.current === 0) {
  427. list.value = [];
  428. }
  429. // 列表值叠加
  430. list.value = list.value.concat(
  431. data.data.records.map((item) => {
  432. if (item.sleepDesc == null) {
  433. item.sleepDesc = t("device.SuspendBusiness");
  434. }
  435. return {
  436. ...item,
  437. checkType: false,
  438. };
  439. })
  440. );
  441. if (list.value.length === data.data.total) {
  442. finished.value = true;
  443. }
  444. loading.value = false;
  445. } else {
  446. showFailToast(data.message);
  447. }
  448. };
  449. // 滚动加载
  450. const onLoad = () => {
  451. if (!finished.value) {
  452. // console.log("滚动加载")
  453. searchParams.current = searchParams.current + 1;
  454. getList();
  455. }
  456. };
  457. // 搜索点击
  458. const searchClick = () => {
  459. searchRef.value.showSearch();
  460. };
  461. // 搜索条件触发查询
  462. const search = (e) => {
  463. list.value = [];
  464. loading.value = true;
  465. searchParams.current = 1;
  466. searchParams = Object.assign(searchParams, e);
  467. getList();
  468. getMachineNum();
  469. };
  470. // 跳转设备编辑
  471. const deviceSet = (e) => {
  472. router.push({ path: "deviceSet", query: { deviceId: e.id } });
  473. };
  474. // 常用操作弹窗展示触发
  475. const deviceOprShow = (e) => {
  476. oprRef.value.showOper(e);
  477. };
  478. // 消除报警
  479. const clearAlarm = async (e, e1, e2) => {
  480. const params = {
  481. id: e.id,
  482. name: e.name,
  483. selfName: e.selfName,
  484. areaId: e.areaId,
  485. channel: e.channel,
  486. contactName: e.contactName,
  487. contactPhone: e.contactPhone,
  488. flowers: e.flowers,
  489. operationalName: e.operationalName,
  490. operationalPhone: e.operationalPhone,
  491. timeRuleId: e.timeRuleId,
  492. };
  493. const { data } = await eliminate(Object.assign({}, params));
  494. if (data.code) {
  495. showSuccessToast(t("device.successfullyEliminatedTheAlarm"));
  496. setTimeout(() => {
  497. e2 = e2.filter((item) => item.id !== e.id);
  498. list.value[list.value.findIndex((item) => item.id === e1.id)].alarmList = e2;
  499. if (e2.length === 0) {
  500. e1.hasTodayAlarm = false;
  501. }
  502. }, 1000);
  503. } else {
  504. showFailToast(data.message);
  505. }
  506. };
  507. const showDateTime = (date) => {
  508. if (!date) {
  509. return "";
  510. }
  511. const currentDate = new Date(dateUtil.formateDate(new Date(date), "yyyy/MM/dd hh:mm:ss"));
  512. return dateUtil.timeZoneDate(currentDate);
  513. };
  514. // 点击查看定位
  515. const viewPosiClk = (row) => {
  516. // console.log("row 是 >>>", row);
  517. if (row.latitude) {
  518. router.push({
  519. path: "viewPosition",
  520. query: {
  521. latitude: row.latitude,
  522. longitude: row.longitude,
  523. fullName: row.fullName,
  524. },
  525. });
  526. } else {
  527. showToast(`${t("device.noPosition")}!!!`);
  528. }
  529. };
  530. // 点击补料
  531. const replenishmentClk = (row) => {
  532. // console.log("row >>>", row);
  533. showConfirmDialog({
  534. title: t('user.tips'),
  535. message: t('device.isReplenishment'),
  536. }).then(async () => {
  537. const { data } = await Api_getReplenishment({
  538. equipmentId: row.id
  539. });
  540. if (data.code) {
  541. showSuccessToast(t("device.sentSuccessfully"));
  542. setTimeout(() => {
  543. // router.go(0);
  544. init();
  545. }, 1500);
  546. } else {
  547. showFailToast(data.message);
  548. }
  549. }).catch(() => {
  550. return;
  551. })
  552. // Api_getReplenishment({ equipmentId: row.id }).then((res) => {
  553. // console.log("res >>>", res);
  554. // // Toast(res.data.message);
  555. // showDialog({
  556. // message: t('device.sentSuccessfully'),
  557. // }).then(() => {
  558. // //返回上一页
  559. // router.go(0);
  560. // });
  561. // setTimeout(() => {
  562. // getList();
  563. // }, 500);
  564. // });
  565. };
  566. // 操作弹窗完成的回调
  567. const operFinish = () => {
  568. init();
  569. };
  570. // 设备状况
  571. const equipStatus = ref({});
  572. // 获取设备情况
  573. const getMachineNum = () => {
  574. Api_postMachineNum({
  575. adminId: user.id,
  576. companyType: searchParams.companyType
  577. }).then((res) => {
  578. equipStatus.value = res.data.data || {};
  579. });
  580. };
  581. // 点击运行总数和总设备数
  582. const eqeStatusClk = (val) => {
  583. searchParams.eqeStatus = val;
  584. // 初始化
  585. searchParams.current = 1;
  586. list.value = [];
  587. getList();
  588. };
  589. // 点击修改图标
  590. const editSleepDesc = () => {
  591. sleepDescBoxShow.value = !sleepDescBoxShow.value;
  592. }
  593. // 点击睡眠描述的确定按钮
  594. const sleepDescChg = async (sleepDesc, id) => {
  595. if (!sleepDesc) {
  596. showToast(t("device.sleepDescPlace"));
  597. } else {
  598. const { data } = await changeSleepDesc({
  599. equipmentId: id,
  600. sleepDesc,
  601. });
  602. if (data.code === "00000") {
  603. sleepDescBoxShow.value = true;
  604. showToast(data.message);
  605. // setTimeout(() => {
  606. // gettAdminGetRelation();
  607. // }, 500);
  608. }
  609. }
  610. }
  611. // 点击标签
  612. const active = ref("");
  613. const clickLabel = (item) => {
  614. // console.log(item);
  615. list.value = [];
  616. searchParams.current = 1;
  617. searchParams.labelId = item.name;
  618. getList();
  619. }
  620. // 分组管理
  621. const showPopover = ref(false);
  622. const actions = [
  623. { text: t("device.group"), value: '0' },
  624. { text: t("device.addGroup"), value: '1' },
  625. ];
  626. const selectLabel = (action) => {
  627. // showToast(action.value);
  628. if (action.value == '0') {
  629. router.push('/labelMan');
  630. }
  631. if (action.value == '1') {
  632. router.push("/labelManAdd");
  633. }
  634. }
  635. // 睡眠切换
  636. const changeSleep = (item) => {
  637. let eqeStatus = 1;
  638. showConfirmDialog({
  639. title: t('user.tips'),
  640. message: t("device.changeSleep"),
  641. }).then(async () => {
  642. if (item.isSleep) {
  643. eqeStatus = 0;
  644. }
  645. const { data } = await sleepEquipment({
  646. equipmentId: item.id,
  647. eqeStatus,
  648. });
  649. if (data.code) {
  650. showSuccessToast(t("device.changeSleepSuccess"));
  651. setTimeout(() => {
  652. // router.go(0);
  653. init();
  654. }, 1000);
  655. } else {
  656. showFailToast(data.message);
  657. }
  658. }).catch(() => {
  659. return;
  660. })
  661. };
  662. // 重启炉头
  663. const restartHead = (id) => {
  664. showConfirmDialog({
  665. title: t('user.tips'),
  666. message: t('device.restartFurnaceHeadTips'),
  667. }).then(async () => {
  668. const { data } = await setFurnace({
  669. equipmentId: id,
  670. eqeStatus: 1,
  671. });
  672. if (data.code) {
  673. showSuccessToast(t("device.restartSucceeded"));
  674. setTimeout(() => {
  675. router.go(0);
  676. }, 1000);
  677. } else {
  678. showFailToast(data.message);
  679. }
  680. }).catch(() => {
  681. return;
  682. })
  683. };
  684. // 开启/关闭炉头
  685. const openCloseHead = (id, status) => {
  686. // console.log("id", id);
  687. // console.log("status", status);
  688. showConfirmDialog({
  689. title: t('user.tips'),
  690. message: (status == 1 ? t("device.openFurnaceHeadTips") : t("device.closeFurnaceHeadTips")),
  691. }).then(async () => {
  692. const { data } = await setFurnace({
  693. equipmentId: id,
  694. eqeStatus: status,
  695. });
  696. if (data.code) {
  697. showSuccessToast((status == 1 ? t("device.open") : t("device.close")) + t("device.success"));
  698. setTimeout(() => {
  699. router.go(0);
  700. }, 1000);
  701. } else {
  702. showFailToast(data.message);
  703. }
  704. }).catch(() => {
  705. return;
  706. })
  707. };
  708. return {
  709. showAlert,
  710. ...toRefs(searchParams),
  711. list,
  712. loading,
  713. error,
  714. finished,
  715. onLoad,
  716. searchRef,
  717. searchClick,
  718. search,
  719. deviceSet,
  720. clearAlarm,
  721. oprRef,
  722. deviceOprShow,
  723. showDateTime,
  724. sys,
  725. viewPosiClk,
  726. replenishmentClk,
  727. Format_calcuDecial,
  728. operFinish,
  729. equipStatus,
  730. eqeStatusClk,
  731. editSleepDesc,
  732. sleepDescBoxShow,
  733. sleepDescChg,
  734. changeSleep,
  735. backTop,
  736. user,
  737. labelList,
  738. clickLabel,
  739. active,
  740. actions,
  741. showPopover,
  742. selectLabel,
  743. restartHead,
  744. openCloseHead,
  745. };
  746. },
  747. };
  748. </script>
  749. <style lang="less" scoped>
  750. @import "../../common/style/common";
  751. @import "../../styles/device/index";
  752. </style>