From 2096f22b858727a449947ffaa68197ad96104d71 Mon Sep 17 00:00:00 2001
From: songshankun <songshankun@foxmail.com>
Date: 星期四, 09 十一月 2023 15:28:10 +0800
Subject: [PATCH] feat: 添加设备配置弹窗, 调整任务控制弹窗适配无工艺参数时允许不允许生产的情况

---
 src/views/dashboard/components/DeliverParamsConfigModal.vue |   96 ++++++++++++++++++++++++++++++++
 src/stores/devices.ts                                       |   10 +++
 src/components.d.ts                                         |    2 
 src/api/device.ts                                           |    2 
 src/api/index.ts                                            |   19 +++++
 src/views/dashboard/components/DashboardTitle.vue           |   21 +++++++
 src/views/dashboard/components/TaskControlModal.vue         |   13 +++-
 7 files changed, 157 insertions(+), 6 deletions(-)

diff --git a/src/api/device.ts b/src/api/device.ts
index f102b7b..1cd58f4 100644
--- a/src/api/device.ts
+++ b/src/api/device.ts
@@ -1,6 +1,8 @@
 export interface DeviceMap {
   deviceID: string
   deviceName: string
+  /** true鏃舵病鏈夊伐鑹哄弬鏁颁笉鍏佽涓嬪彂  false鏃舵病鏈夊伐鑹哄弬鏁板厑璁镐笅鍙�*/
+  needSetProcessParams: boolean
 }
 
 export interface Devices {
diff --git a/src/api/index.ts b/src/api/index.ts
index e474d51..8c68113 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -120,16 +120,31 @@
 }
 
 /**
- * 鑾峰彇褰撳墠闈㈡澘缁戝畾鐨勮澶囧垪琛�
+ * 璁惧畾褰撳墠璁惧
  */
 export function apiSetCurrentDevice(data: SetCurrentDeviceParams) {
-  return request<BaseResponse<Devices>>({
+  return request<BaseResponse>({
     url: `/v1/device/setCurrentDeviceId`,
     method: 'post',
     data
   })
 }
 
+export interface SetCurrentDeviceConfigParams {
+  needSetProcessParams: boolean
+}
+
+/**
+ * 璁惧畾褰撳墠璁惧閰嶇疆
+ */
+export function apiSetCurrentDeviceConfig(data: SetCurrentDeviceConfigParams) {
+  return request<BaseResponse>({
+    url: `/v1/device/config`,
+    method: 'post',
+    data
+  })
+}
+
 export interface CraftModelListParams {
   procedureId: number
   page: number
diff --git a/src/components.d.ts b/src/components.d.ts
index a257981..ce217b0 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -19,6 +19,8 @@
     ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
     ElPopover: typeof import('element-plus/es')['ElPopover']
     ElProgress: typeof import('element-plus/es')['ElProgress']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElStep: typeof import('element-plus/es')['ElStep']
     ElSteps: typeof import('element-plus/es')['ElSteps']
diff --git a/src/stores/devices.ts b/src/stores/devices.ts
index 26d7162..e0f81ef 100644
--- a/src/stores/devices.ts
+++ b/src/stores/devices.ts
@@ -10,6 +10,14 @@
     return deviceRes?.value?.data as Devices
   })
 
+  // 褰撳墠璁惧鍦ㄧ己灏戝伐鑹哄弬鏁扮殑鏃跺�欐槸鍚﹀厑璁镐笅鍙戠敓浜�
+  const currentDeviceAllowNoParams = computed(() => {
+    const currentDeviceInfo = deviceInfo.value.deviceList?.find((ele) => {
+      return ele.deviceID === deviceInfo.value.currentDeviceID
+    })
+    return !currentDeviceInfo?.needSetProcessParams
+  })
+
   /**
    * 濡傛灉浠诲姟鐘舵�佹槸杩涜涓�, 鍒欒疆璇� plc 鍙栬繘搴�
    */
@@ -28,5 +36,5 @@
     startDevicePolling()
   }
 
-  return { deviceInfo, startPollingDevice }
+  return { deviceInfo, startPollingDevice, currentDeviceAllowNoParams }
 })
diff --git a/src/views/dashboard/components/DashboardTitle.vue b/src/views/dashboard/components/DashboardTitle.vue
index 49d3323..446f322 100644
--- a/src/views/dashboard/components/DashboardTitle.vue
+++ b/src/views/dashboard/components/DashboardTitle.vue
@@ -26,10 +26,15 @@
           <IconCloudOff></IconCloudOff>
         </el-icon>
       </div>
+
+      <div class="params-config" @click="openConfigModal">
+        <el-icon size="28"><Setting /></el-icon>
+      </div>
     </div>
   </div>
   <DeviceCheckList v-model="showDevicesModal" @should-reload="emits('shouldReload')"></DeviceCheckList>
   <TroubleTrackerModal v-model="showProblemsModal" :problems="problemList"></TroubleTrackerModal>
+  <DeliverParamsConfigModal v-model="showConfigModal"></DeliverParamsConfigModal>
 </template>
 <script setup lang="ts">
 import AlertLightIcon from '@/components/icons/AlertLightIcon.vue'
@@ -43,6 +48,8 @@
 import { useRequest } from 'vue-hooks-plus'
 import { apiGetProblemList } from '@/api'
 import { PROBLEMS_POLLING_DURATION } from '@/common/constants'
+import { Setting } from '@element-plus/icons-vue'
+import DeliverParamsConfigModal from '@/views/dashboard/components/DeliverParamsConfigModal.vue'
 
 const emits = defineEmits<{
   shouldReload: []
@@ -98,6 +105,14 @@
   return cloudConnection ? cloudConnection?.CheckResult : true
 })
 
+// 閰嶇疆涓嬪彂鍙傛暟寮圭獥
+const showConfigModal = ref(false)
+function openConfigModal() {
+  showConfigModal.value = true
+}
+function closeConfigModal() {
+  showConfigModal.value = false
+}
 /**
  * 杞闂璇婃柇
  */
@@ -143,4 +158,10 @@
   font-size: 40px;
   color: #fff;
 }
+.cloud-connection-status {
+  margin-right: 10px;
+}
+.params-config {
+  cursor: pointer;
+}
 </style>
diff --git a/src/views/dashboard/components/DeliverParamsConfigModal.vue b/src/views/dashboard/components/DeliverParamsConfigModal.vue
new file mode 100644
index 0000000..9cfdd68
--- /dev/null
+++ b/src/views/dashboard/components/DeliverParamsConfigModal.vue
@@ -0,0 +1,96 @@
+<template>
+  <div class="deliver-params-config-modal">
+    <CommonModal v-model="modelData" @close="modelData = false">
+      <template #title>閰嶇疆</template>
+      <div class="config-content">
+        <el-radio-group v-model="config" class="config-radio-group">
+          <el-radio :label="false" size="large">鏃犲伐鑹哄弬鏁帮紝涓嶅厑璁镐笅鍙戠敓浜т换鍔�</el-radio>
+          <el-radio :label="true" size="large">鏃犲伐鑹哄弬鏁帮紝鍏佽涓嬪彂鐢熶骇浠诲姟</el-radio>
+        </el-radio-group>
+      </div>
+      <template #footer>
+        <div class="config-footer">
+          <BigButton class="btn" bg-color="#0dfde6" color="#333333" @click="setConfig">淇濆瓨</BigButton>
+        </div>
+      </template>
+    </CommonModal>
+  </div>
+</template>
+<script setup lang="ts">
+import BigButton from '@/views/dashboard/components/BigButton.vue'
+import { useVModel } from '@vueuse/core'
+import { ref, watch } from 'vue'
+import { useDevicesStore } from '@/stores/devices'
+import { storeToRefs } from 'pinia'
+import { apiSetCurrentDeviceConfig } from '@/api'
+import { ElMessage } from 'element-plus'
+const props = withDefaults(
+  defineProps<{
+    modelValue: boolean
+  }>(),
+  {
+    modelValue: false
+  }
+)
+
+const emit = defineEmits<{
+  'update:modelValue': [show: boolean]
+}>()
+const modelData = useVModel(props, 'modelValue', emit)
+const deviceStore = useDevicesStore()
+const { currentDeviceAllowNoParams } = storeToRefs(deviceStore)
+watch(modelData, () => {
+  // 鎵撳紑寮圭獥鏃跺垵濮嬪寲閫変腑椤�
+  if (modelData.value) {
+    config.value = currentDeviceAllowNoParams.value
+  }
+})
+
+const config = ref(false)
+
+function setConfig() {
+  apiSetCurrentDeviceConfig({
+    // 閫変腑鍏佽涓嬪彂鍗充笉闇�瑕佸伐鑹哄弬鏁� ,杩欎咯鏄弽鐨�
+    needSetProcessParams: !config.value
+  })
+    .then(() => {
+      ElMessage({
+        message: '璁剧疆鎴愬姛',
+        type: 'success',
+        duration: 3 * 1000
+      })
+      modelData.value = false
+      deviceStore.startPollingDevice()
+    })
+    .catch((err) => {
+      console.error(err)
+    })
+}
+</script>
+<style scoped lang="scss">
+.config-content {
+  padding: 10px 20px;
+}
+.config-radio-group {
+  display: flex;
+  flex-direction: column;
+  justify-content: start;
+  align-items: start;
+  :deep(.el-radio__label) {
+    color: #fff;
+  }
+}
+.config-footer {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  .btn {
+    height: 40px;
+    width: 100px;
+    font-size: 14px;
+    font-weight: 500;
+    line-height: 40px;
+    border-radius: 4px;
+  }
+}
+</style>
diff --git a/src/views/dashboard/components/TaskControlModal.vue b/src/views/dashboard/components/TaskControlModal.vue
index c51b154..e984ea7 100644
--- a/src/views/dashboard/components/TaskControlModal.vue
+++ b/src/views/dashboard/components/TaskControlModal.vue
@@ -40,6 +40,10 @@
 
                     <div class="info-item-two">
                       <div style="color: #4efefa; font-size: 18px; margin-bottom: 10px; margin-top: 20px">宸ヨ壓鍙傛暟</div>
+                      <!-- 鏈幏鍙栧埌宸ヨ壓鍙傛暟, 涓斿綋鍓嶈澶囧厑璁稿湪娌℃湁宸ヨ壓鍙傛暟鐨勬儏鍐典笅鐢熶骇, 鍒欐彁绀�-->
+                      <div v-if="getCraftParamsTip && currentDeviceAllowNoParams" class="info-item info-item-two">
+                        鏈幏鍙栧埌宸ヨ壓鍙傛暟, 璇锋墜鍔ㄨ缃垨鍦ㄤ簯绔伐鑹烘ā鍨嬩腑涓婁紶
+                      </div>
                       <div v-for="(item, index) in craftParams" :key="index" class="info-item info-item-two">
                         {{ item.Key }}锛歿{ item.Value || '' }}
                       </div>
@@ -52,7 +56,7 @@
         </template>
 
         <!--        鍙湁鑾峰彇鍒板伐鑹哄弬鏁版墠鍙互杩涜鎿嶄綔-->
-        <template v-if="getCraftParamsTip">
+        <template v-if="getCraftParamsTip && !currentDeviceAllowNoParams">
           <div class="content-tips">
             <div class="craft-params-error">
               <div class="error-icon">
@@ -108,7 +112,7 @@
         </template>
       </div>
       <template #footer>
-        <template v-if="getCraftParamsTip">
+        <template v-if="getCraftParamsTip && !currentDeviceAllowNoParams">
           <div class="btn">
             <BigButton bg-color="#4765c0" @click="closeModal"> 鍏抽棴 </BigButton>
           </div>
@@ -160,6 +164,7 @@
 import { createMachine } from 'xstate'
 import { useMachine } from '@xstate/vue'
 import { CircleCloseFilled, Loading, SuccessFilled } from '@element-plus/icons-vue'
+import { useDevicesStore } from '@/stores/devices'
 
 export interface TaskControlModalProps {
   task?: Task
@@ -196,7 +201,8 @@
 const craftParams = ref<CraftParam[]>()
 // 鑾峰彇宸ヨ壓鍙傛暟缁撴灉淇℃伅
 const getCraftParamsTip = ref('')
-
+// 褰撳墠璁惧鑻ユ病鏈夊伐鑹哄弬鏁版槸鍚﹀厑璁镐笅鍙�
+const { currentDeviceAllowNoParams } = storeToRefs(useDevicesStore())
 /**
  * 鑾峰彇褰撳墠灞曠ず鐨勪换鍔$殑宸ヨ壓鍙傛暟
  */
@@ -204,6 +210,7 @@
   if (taskId) {
     craftParams.value = []
     getCraftParamsTip.value = ''
+
     getCraftParams({ id: taskId }).then(
       (res) => {
         craftParams.value = res.data.Params ?? []

--
Gitblit v1.8.0