From 3a0087aa5e3eed5d9d7a793a17dc01fd1d6df80c Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期四, 17 四月 2025 17:01:15 +0800
Subject: [PATCH] 看板大屏2修改页面

---
 UI-Project/src/views/KanbanData/kanbanData.vue |  263 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 246 insertions(+), 17 deletions(-)

diff --git a/UI-Project/src/views/KanbanData/kanbanData.vue b/UI-Project/src/views/KanbanData/kanbanData.vue
index c08aab8..e2db803 100644
--- a/UI-Project/src/views/KanbanData/kanbanData.vue
+++ b/UI-Project/src/views/KanbanData/kanbanData.vue
@@ -8,6 +8,7 @@
   loadYieldData()
   loadUtilizationData()
   loadQuantityData()
+  loadPlannedData()
 })
 
 // 鍏抽棴椤甸潰鍋滄瀹氭椂鍣�
@@ -68,8 +69,8 @@
 // 鍦ㄥ埗閲�
 const locationOptions = [
   { label: '鍗婃垚鍝�', value: '鍗婃垚鍝�' },
-  { label: '7014搴撲綅', value: '7014搴撲綅' },
-  { label: '7016搴撲綅', value: '7016搴撲綅' }
+  { label: '7014', value: '7014' },
+  { label: '7016', value: '7016' }
 ]
 
 // 鍦ㄥ埗閲忔暟鎹�
@@ -80,6 +81,15 @@
 })
 const quantityData = ref([])
 const quantityLoading = ref(false)
+
+// 璁″垝浜ч噺鏁版嵁
+const plannedFormData = ref({
+  recordDate: new Date().toISOString().slice(0, 10),
+  type: '',
+  value: null
+})
+const plannedData = ref([])
+const plannedLoading = ref(false)
 
 // 鏃ユ湡鏍煎紡鍖�
 const formatDate = (dateStr) => {
@@ -94,9 +104,8 @@
 const checkExists = (date, code, data, excludeId = null) => {
   return data.some(item => {
     const itemDate = item.recordTime ? formatDate(item.recordTime) : item.recordDate;
-    return itemDate === date && 
-      (item.lineNo === code || item.locationCode === code) && 
-      (!excludeId || item.id !== excludeId);
+    const codeMatch = item.lineNo === code || item.locationCode === code || item.type === code;
+    return itemDate === date && codeMatch && (!excludeId || item.id !== excludeId);
   });
 }
 
@@ -182,6 +191,34 @@
     console.error(error)
   } finally {
     quantityLoading.value = false
+  }
+}
+
+// 鍔犺浇璁″垝浜ч噺鏁版嵁
+const loadPlannedData = async () => {
+  plannedLoading.value = true
+  try {
+    const res = await request({
+      url: '/deviceInteraction/plannedAmount/listPlanned',
+      method: 'post',
+      data: { page: 1, pageSize: 50 }
+    })
+    if (res.code === 200 && res.data?.records) {
+      plannedData.value = res.data.records.map(item => {
+        const formattedDate = item.recordTime ? formatDate(item.recordTime) : '';
+        return {
+          ...item,
+          recordDate: formattedDate,
+          editing: false,
+          originalData: { ...item, recordDate: formattedDate }
+        };
+      });
+    }
+  } catch (error) {
+    ElMessage.error('璁″垝浜ч噺鏁版嵁鍔犺浇澶辫触')
+    console.error(error)
+  } finally {
+    plannedLoading.value = false
   }
 }
 
@@ -284,10 +321,44 @@
   }
 }
 
+// 鎻愪氦璁″垝浜ч噺琛ㄥ崟
+const handlePlannedSubmit = async () => {
+  if (!plannedFormData.value.recordDate || !plannedFormData.value.type || plannedFormData.value.value === null) {
+    ElMessage.error('璇峰~鍐欏畬鏁翠俊鎭�')
+    return
+  }
+
+  // 妫�鏌ユ槸鍚﹀瓨鍦ㄧ浉鍚屾棩鏈熷拰绫诲瀷鐨勮褰�
+  if (checkExists(plannedFormData.value.recordDate, plannedFormData.value.type, plannedData.value)) {
+    ElMessage.error('璇ユ棩鏈熷拰绫诲瀷鐨勮褰曞凡瀛樺湪')
+    return
+  }
+
+  try {
+    const recordTimeStr = `${plannedFormData.value.recordDate} 00:00:00`;
+    
+    await request({
+      url: '/deviceInteraction/plannedAmount/addPlanned',
+      method: 'post',
+      data: {
+        type: plannedFormData.value.type,
+        value: plannedFormData.value.value,
+        recordTime: recordTimeStr
+      }
+    })
+    ElMessage.success('娣诲姞鎴愬姛')
+    resetPlannedForm()
+    loadPlannedData()
+  } catch (error) {
+    ElMessage.error('娣诲姞澶辫触')
+    console.error(error)
+  }
+}
+
 // 閲嶇疆琛ㄥ崟
 const resetYieldForm = () => {
   yieldFormData.value = {
-    recordDate: new Date().toISOString().slice(0, 10),
+    recordDate: yieldFormData.value.recordDate, // 淇濇寔褰撳墠閫夋嫨鐨勬棩鏈�
     lineNo: '',
     yieldvalue: null
   }
@@ -295,7 +366,7 @@
 
 const resetUtilizationForm = () => {
   utilizationFormData.value = {
-    recordDate: new Date().toISOString().slice(0, 10),
+    recordDate: utilizationFormData.value.recordDate, // 淇濇寔褰撳墠閫夋嫨鐨勬棩鏈�
     lineNo: '',
     utilizationRate: null
   }
@@ -303,7 +374,7 @@
 
 const resetQuantityForm = () => {
   quantityFormData.value = {
-    recordDate: new Date().toISOString().slice(0, 10),
+    recordDate: quantityFormData.value.recordDate, // 淇濇寔褰撳墠閫夋嫨鐨勬棩鏈�
     locationCode: '',
     quantity: null
   }
@@ -427,6 +498,56 @@
   }
 }
 
+// 缂栬緫璁″垝浜ч噺
+const handlePlannedEdit = async (index, row) => {
+  if (!row.editing) {
+    row.editing = true
+    return
+  }
+
+  if (!row.recordDate || !row.type || row.value === null) {
+    ElMessage.error('璇峰~鍐欏畬鏁翠俊鎭�')
+    return
+  }
+
+  // 妫�鏌ユ槸鍚﹀瓨鍦ㄧ浉鍚屾棩鏈熷拰绫诲瀷鐨勮褰曪紙鎺掗櫎褰撳墠璁板綍锛�
+  if (checkExists(row.recordDate, row.type, plannedData.value, row.id)) {
+    ElMessage.error('璇ユ棩鏈熷拰绫诲瀷鐨勮褰曞凡瀛樺湪')
+    return
+  }
+
+  try {
+    const recordTimeStr = `${row.recordDate} 00:00:00`;
+    
+    await request({
+      url: '/deviceInteraction/plannedAmount/updatePlanned',
+      method: 'post',
+      data: {
+        id: row.id,
+        type: row.type,
+        value: row.value,
+        recordTime: recordTimeStr
+      }
+    })
+    row.editing = false
+    row.originalData = { ...row }
+    ElMessage.success('淇敼鎴愬姛')
+    loadPlannedData()
+  } catch (error) {
+    ElMessage.error('淇敼澶辫触')
+    console.error(error)
+  }
+}
+
+// 閲嶇疆璁″垝浜ч噺琛ㄥ崟
+const resetPlannedForm = () => {
+  plannedFormData.value = {
+    recordDate: plannedFormData.value.recordDate,
+    type: '',
+    value: null
+  }
+}
+
 // 鍙栨秷缂栬緫
 const cancelEdit = (row) => {
   Object.assign(row, row.originalData)
@@ -459,6 +580,12 @@
         method: 'post',
         data: { id: id }
       })
+    } else if (type === 'planned') {
+      await request({
+        url: '/deviceInteraction/plannedAmount/deletePlanned',
+        method: 'post',
+        data: { id: id }
+      })
     }
     
     ElMessage.success('鍒犻櫎鎴愬姛')
@@ -467,6 +594,7 @@
     if (type === 'yieldvalue') loadYieldData()
     else if (type === 'utilization') loadUtilizationData()
     else if (type === 'quantity') loadQuantityData()
+    else if (type === 'planned') loadPlannedData()
     
   } catch (error) {
     if (error !== 'cancel') {
@@ -598,8 +726,8 @@
             </el-form-item>
             <el-form-item label="鐢熶骇绾�">
               <el-select v-model="utilizationFormData.lineNo" placeholder="閫夋嫨鐢熶骇绾�" style="width: 180px">
-                <el-option label="涓�绾�" value="涓�绾�" />
-                <el-option label="浜岀嚎" value="浜岀嚎" />
+                <el-option label="鏍囧噯" value="鏍囧噯" />
+                <el-option label="瀹氬埗" value="瀹氬埗" />
               </el-select>
             </el-form-item>
             <el-form-item label="鍒╃敤鐜�">
@@ -635,8 +763,8 @@
             <el-table-column prop="lineNo" label="鐢熶骇绾�" width="180">
               <template #default="scope">
                 <el-select v-if="scope.row.editing" v-model="scope.row.lineNo" style="width: 140px">
-                  <el-option label="涓�绾�" value="涓�绾�" />
-                  <el-option label="浜岀嚎" value="浜岀嚎" />
+                  <el-option label="鏍囧噯" value="鏍囧噯" />
+                  <el-option label="瀹氬埗" value="瀹氬埗" />
                 </el-select>
                 <span v-else>{{ scope.row.lineNo }}</span>
               </template>
@@ -702,8 +830,8 @@
             <el-form-item label="绫诲瀷">
               <el-select v-model="quantityFormData.locationCode" placeholder="閫夋嫨绫诲瀷" style="width: 180px">
                 <el-option label="鍗婃垚鍝�" value="鍗婃垚鍝�" />
-                <el-option label="7014搴撲綅" value="7014搴撲綅" />
-                <el-option label="7016搴撲綅" value="7016搴撲綅" />
+                <el-option label="7014" value="7014" />
+                <el-option label="7016" value="7016" />
               </el-select>
             </el-form-item>
             <el-form-item label="鏁伴噺">
@@ -739,13 +867,13 @@
               <template #default="scope">
                 <el-select v-if="scope.row.editing" v-model="scope.row.locationCode" style="width: 140px">
                   <el-option label="鍗婃垚鍝�" value="鍗婃垚鍝�" />
-                  <el-option label="7014搴撲綅" value="7014搴撲綅" />
-                  <el-option label="7016搴撲綅" value="7016搴撲綅" />
+                  <el-option label="7014" value="7014" />
+                  <el-option label="7016" value="7016" />
                 </el-select>
                 <span v-else>
                   {{ 
                     scope.row.locationCode === '鍗婃垚鍝�' ? '鍗婃垚鍝�' : 
-                    scope.row.locationCode === '7014搴撲綅' ? '7014搴撲綅' : '7016搴撲綅'
+                    scope.row.locationCode === '7014' ? '7014' : '7016'
                   }}
                 </span>
               </template>
@@ -794,6 +922,107 @@
             </el-table-column>
           </el-table>
         </el-tab-pane>
+
+        <!-- 璁″垝浜ч噺鏍囩椤� -->
+        <el-tab-pane label="璁″垝浜ч噺" name="planned">
+          <el-form :inline="true" :model="plannedFormData" label-width="100px" class="form-container">
+            <el-form-item label="鏃ユ湡">
+              <el-date-picker
+                v-model="plannedFormData.recordDate"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="閫夋嫨鏃ユ湡"
+                style="width: 180px"
+              />
+            </el-form-item>
+            <el-form-item label="绫诲瀷">
+              <el-select v-model="plannedFormData.type" placeholder="閫夋嫨绫诲瀷" style="width: 180px">
+                <el-option label="骞虫柟" value="骞虫柟" />
+                <el-option label="鐗囨暟" value="鐗囨暟" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="鏁板��">
+              <el-input-number
+                v-model="plannedFormData.value"
+                :precision="plannedFormData.type === '骞虫柟' ? 2 : 0"
+                :step="plannedFormData.type === '骞虫柟' ? 0.01 : 1"
+                :min="0"
+                controls-position="right"
+                style="width: 180px"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="handlePlannedSubmit">鎻愪氦</el-button>
+              <el-button @click="resetPlannedForm">閲嶇疆</el-button>
+            </el-form-item>
+          </el-form>
+
+          <el-table :data="plannedData" v-loading="plannedLoading" style="width: 100%">
+            <el-table-column prop="recordDate" label="鏃ユ湡" width="180">
+              <template #default="scope">
+                <el-date-picker
+                  v-if="scope.row.editing"
+                  v-model="scope.row.recordDate"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+                  style="width: 140px"
+                />
+                <span v-else>{{ scope.row.recordDate }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="type" label="绫诲瀷" width="180">
+              <template #default="scope">
+                <el-select v-if="scope.row.editing" v-model="scope.row.type" style="width: 140px">
+                  <el-option label="骞虫柟" value="骞虫柟" />
+                  <el-option label="鐗囨暟" value="鐗囨暟" />
+                </el-select>
+                <span v-else>{{ scope.row.type }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="value" label="鏁板��" width="180">
+              <template #default="scope">
+                <el-input-number
+                  v-if="scope.row.editing"
+                  v-model="scope.row.value"
+                  :precision="scope.row.type === '骞虫柟' ? 2 : 0"
+                  :step="scope.row.type === '骞虫柟' ? 0.01 : 1"
+                  :min="0"
+                  controls-position="right"
+                  style="width: 140px"
+                />
+                <span v-else>{{ scope.row.value }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="200" fixed="right">
+              <template #default="scope">
+                <el-button-group>
+                  <el-button 
+                    size="small" 
+                    :type="scope.row.editing ? 'success' : 'primary'"
+                    @click="handlePlannedEdit(scope.$index, scope.row)"
+                  >
+                    {{ scope.row.editing ? '淇濆瓨' : '缂栬緫' }}
+                  </el-button>
+                  <el-button 
+                    v-if="scope.row.editing" 
+                    size="small"
+                    @click="cancelEdit(scope.row)"
+                  >
+                    鍙栨秷
+                  </el-button>
+                  <el-button 
+                    v-else 
+                    size="small" 
+                    type="danger" 
+                    @click="handleDelete(scope.$index, plannedData, 'planned')"
+                  >
+                    鍒犻櫎
+                  </el-button>
+                </el-button-group>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
       </el-tabs>
     </el-main>
   </el-container>

--
Gitblit v1.8.0