From 35b1ce8f65b78fcdfdd56481b29ed8d74a8a6621 Mon Sep 17 00:00:00 2001
From: songshankun <songshankun@foxmail.com>
Date: 星期五, 03 十一月 2023 17:57:45 +0800
Subject: [PATCH] feat: 进度条背景色,对接设备切换组件接口数据

---
 src/components/CommonModal.vue                     |    2 
 src/views/dashboard/components/DeviceCheckList.vue |   81 +++++++++++++++++++--------
 src/views/dashboard/components/ProcessingInfo.vue  |    1 
 src/views/dashboard/index.vue                      |   12 ++-
 src/stores/devices.ts                              |   10 +--
 src/components.d.ts                                |    1 
 src/stores/tasks.ts                                |   11 ++-
 src/api/index.ts                                   |   15 +++++
 src/views/dashboard/components/DashboardTitle.vue  |    6 +
 9 files changed, 99 insertions(+), 40 deletions(-)

diff --git a/src/api/index.ts b/src/api/index.ts
index 6b41213..03bc1c8 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -108,6 +108,21 @@
   })
 }
 
+export interface SetCurrentDeviceParams {
+  currentDeviceID: string
+}
+
+/**
+ * 鑾峰彇褰撳墠闈㈡澘缁戝畾鐨勮澶囧垪琛�
+ */
+export function apiSetCurrentDevice(data: SetCurrentDeviceParams) {
+  return request<BaseResponse<Devices>>({
+    url: `/v1/device/setCurrentDeviceId`,
+    method: 'post',
+    data
+  })
+}
+
 export interface CraftModelListParams {
   procedureId: number
   page: number
diff --git a/src/components.d.ts b/src/components.d.ts
index ab30609..5374a8f 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -10,7 +10,6 @@
     AlertLightIcon: typeof import('./components/icons/AlertLightIcon.vue')['default']
     BaseModal: typeof import('./components/BaseModal.vue')['default']
     CommonModal: typeof import('./components/CommonModal.vue')['default']
-    copy: typeof import('./components/BaseModal copy.vue')['default']
     DashboardLayout: typeof import('./components/DashboardLayout.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCollapse: typeof import('element-plus/es')['ElCollapse']
diff --git a/src/components/CommonModal.vue b/src/components/CommonModal.vue
index 372690b..43c79aa 100644
--- a/src/components/CommonModal.vue
+++ b/src/components/CommonModal.vue
@@ -28,7 +28,7 @@
   /** 鏄惁灞曠ず妯℃�佹 */
   modelValue: boolean
   /** 鏇村鐗堟湰 */
-  wider: boolean
+  wider?: boolean
 }
 const props = withDefaults(defineProps<BaseModalProps>(), {
   modelValue: false,
diff --git a/src/stores/devices.ts b/src/stores/devices.ts
index fb0fd53..36362b0 100644
--- a/src/stores/devices.ts
+++ b/src/stores/devices.ts
@@ -1,9 +1,11 @@
-import { computed, onUnmounted } from 'vue'
+import { computed, onUnmounted, ref } from 'vue'
 import { defineStore } from 'pinia'
-import { getDeviceList } from '@/api'
+import { apiSetCurrentDevice, getDeviceList } from '@/api'
+import type { SetCurrentDeviceParams } from '@/api'
 import { useRequest } from 'vue-hooks-plus'
 import type { Devices } from '@/api/device'
 import { DEVICE_INFO_POLLING_DURATION } from '@/common/constants'
+import { ElMessage } from 'element-plus'
 
 export const useDevicesStore = defineStore('device', () => {
   const deviceInfo = computed(() => {
@@ -27,10 +29,6 @@
     cancelDevicePolling()
     startDevicePolling()
   }
-
-  onUnmounted(() => {
-    cancelDevicePolling()
-  })
 
   return { deviceInfo, startPollingDevice }
 })
diff --git a/src/stores/tasks.ts b/src/stores/tasks.ts
index 3a97ead..e115738 100644
--- a/src/stores/tasks.ts
+++ b/src/stores/tasks.ts
@@ -77,10 +77,14 @@
   /**
    * 鍒锋柊鎵�鏈夋暟鎹�
    */
-  function reload(channel: number) {
+  function reloadChannel(channel: number) {
     getChannels(currentType.value).then(() => {
       autoSelectTask(channel)
     })
+  }
+
+  function reloadAllData() {
+    getChannels(currentType.value)
   }
 
   function moreChannelTasksBtn(channelNumber: number) {
@@ -128,9 +132,10 @@
     getChannels,
     moreBtnStatus,
     activeTask,
-    reload,
+    reloadChannel,
     setActiveTask,
     moreChannelTasksBtn,
-    foldChannelTasksBtn
+    foldChannelTasksBtn,
+    reloadAllData
   }
 })
diff --git a/src/views/dashboard/components/DashboardTitle.vue b/src/views/dashboard/components/DashboardTitle.vue
index 637ef35..981972f 100644
--- a/src/views/dashboard/components/DashboardTitle.vue
+++ b/src/views/dashboard/components/DashboardTitle.vue
@@ -23,7 +23,7 @@
       </div>
     </div>
   </div>
-  <DeviceCheckList v-model="showDevicesModal" :devices="deviceList"></DeviceCheckList>
+  <DeviceCheckList v-model="showDevicesModal" @should-reload="emits('shouldReload')"></DeviceCheckList>
   <TroubleTrackerModal v-model="showProblemsModal" :problems="problemList"></TroubleTrackerModal>
 </template>
 <script setup lang="ts">
@@ -39,6 +39,10 @@
 import { apiGetProblemList } from '@/api'
 import { PROBLEMS_POLLING_DURATION } from '@/common/constants'
 
+const emits = defineEmits<{
+  shouldReload: []
+}>()
+
 // 鏄惁鏄剧ず闂璇婃柇modal
 const showProblemsModal = ref(false)
 /**
diff --git a/src/views/dashboard/components/DeviceCheckList.vue b/src/views/dashboard/components/DeviceCheckList.vue
index 3091543..b63dfe5 100644
--- a/src/views/dashboard/components/DeviceCheckList.vue
+++ b/src/views/dashboard/components/DeviceCheckList.vue
@@ -4,18 +4,18 @@
       <template #title>璁惧閫夋嫨</template>
       <div class="device-box">
         <el-scrollbar always class="scroller">
-          <template v-if="devices?.length">
+          <template v-if="deviceInfo?.deviceIDList?.length">
             <div
-              v-for="(item, index) in devices"
+              v-for="(item, index) in deviceInfo?.deviceIDList"
               :key="index"
-              :class="item.checked ? 'device-item check-item' : 'device-item'"
-              @click="deviceClick(index)"
+              :class="selectedDevice === item ? 'device-item check-item' : 'device-item'"
+              @click="deviceClick(item)"
             >
               <div class="item-l">
-                <span>{{ item.number }}</span>
-                {{ item.name }}
+                <span>{{ item }}</span>
+                <!--  {{ item }}-->
               </div>
-              <div v-if="item.checked" class="item-r">
+              <div v-if="selectedDevice === item" class="item-r">
                 <el-icon class="item-icon" size="22" color="#00ff00"><CircleCheckFilled /></el-icon>
               </div>
             </div>
@@ -35,7 +35,11 @@
 import { useVModel } from '@vueuse/core'
 import { CircleCheckFilled } from '@element-plus/icons-vue'
 import BigButton from '@/views/dashboard/components/BigButton.vue'
-import { ref } from 'vue'
+import { useDevicesStore } from '@/stores/devices'
+import { storeToRefs } from 'pinia'
+import { ref, watch } from 'vue'
+import { apiSetCurrentDevice } from '@/api'
+import { ElMessage } from 'element-plus'
 export interface DeviceCheckListProps {
   modelValue: boolean
 }
@@ -45,28 +49,57 @@
 
 const emit = defineEmits<{
   'update:modelValue': [show: boolean]
+  shouldReload: []
 }>()
 const modelData = useVModel(props, 'modelValue', emit)
+const deviceStore = useDevicesStore()
+const { deviceInfo } = storeToRefs(deviceStore)
 
-const devices = ref([
-  {
-    number: '111',
-    name: '璁惧A',
-    checked: true
-  },
-  {
-    number: '222',
-    name: '璁惧b'
+// 寮圭獥鎵撳紑鏃惰瀹氬綋鍓嶉�変腑鐨勮澶�
+const selectedDevice = ref<string>('')
+watch(modelData, () => {
+  if (modelData.value) {
+    selectedDevice.value = deviceInfo.value?.currentDeviceID ?? ''
   }
-])
+})
+
+function deviceClick(deviceId: string) {
+  selectedDevice.value = deviceId
+}
+
+function saveModal() {
+  if (!selectedDevice.value) {
+    ElMessage({
+      message: '璇峰厛閫変腑涓�涓澶�',
+      type: 'error',
+      duration: 3 * 1000
+    })
+    return
+  }
+  apiSetCurrentDevice({ currentDeviceID: selectedDevice.value })
+    .then(() => {
+      ElMessage({
+        message: '璁惧畾鎴愬姛',
+        type: 'success',
+        duration: 2 * 1000
+      })
+      modelData.value = false
+      emit('shouldReload')
+    })
+    .catch((err) => {
+      console.error(err)
+      ElMessage({
+        message: err.msg,
+        type: 'error',
+        duration: 3 * 1000
+      })
+    })
+    .finally(() => {
+      deviceStore.startPollingDevice()
+    })
+}
 function closeModal() {
   modelData.value = false
-}
-function saveModal() {}
-const deviceClick = (index) => {
-  devices.value.find((ele) => (ele.checked = false))
-
-  devices.value[index].checked = true
 }
 </script>
 <style scoped lang="scss">
diff --git a/src/views/dashboard/components/ProcessingInfo.vue b/src/views/dashboard/components/ProcessingInfo.vue
index f29a18e..276eb7f 100644
--- a/src/views/dashboard/components/ProcessingInfo.vue
+++ b/src/views/dashboard/components/ProcessingInfo.vue
@@ -179,6 +179,7 @@
 }
 :deep(.el-progress-bar__outer) {
   border-radius: 8px;
+  background-color: #13235a;
 }
 :deep(.el-progress-bar__inner) {
   border-radius: 8px;
diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue
index d006860..6ab459c 100644
--- a/src/views/dashboard/index.vue
+++ b/src/views/dashboard/index.vue
@@ -7,7 +7,7 @@
       <ChannelCollapse :channels="channels"></ChannelCollapse>
     </template>
     <template #middleBlock1>
-      <DashboardTitle></DashboardTitle>
+      <DashboardTitle @should-reload="reloadAllData"></DashboardTitle>
     </template>
     <template #middleBlock2>
       <el-tabs v-model="activeMainTabName" class="main-info-tabs">
@@ -39,7 +39,7 @@
     <template #middleBlock3>
       <SubTitle>浠诲姟璇︽儏</SubTitle>
       <div class="task-detail">
-        <TaskControl :task="activeTask" @should-reload="reloadAllData"></TaskControl>
+        <TaskControl :task="activeTask" @should-reload="reloadChannel"></TaskControl>
       </div>
       <ColorInfo :type="1"></ColorInfo>
       <ColorInfo :type="2"></ColorInfo>
@@ -142,8 +142,12 @@
  * 瀹屾垚浠诲姟鎴栬�呬笅鍙戝弬鏁版垚鍔熷悗瑕佸埛鏂伴�氶亾鏁版嵁
  * @param task
  */
-function reloadAllData(task: Task) {
-  tasksStore.reload(task.Channel)
+function reloadChannel(task: Task) {
+  tasksStore.reloadChannel(task.Channel)
+}
+
+function reloadAllData() {
+  tasksStore.reloadAllData()
 }
 // 鍚姩plc 杞
 const plcStore = usePLCStore()

--
Gitblit v1.8.0