From 241ab413828a3627a123ae001fc05f5c35031861 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期六, 24 一月 2026 14:34:47 +0800
Subject: [PATCH] #

---
 src/main/webapp/views/tvDevice/tvDevice.html |   88 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 81 insertions(+), 7 deletions(-)

diff --git a/src/main/webapp/views/tvDevice/tvDevice.html b/src/main/webapp/views/tvDevice/tvDevice.html
index 103e18f..a3db0eb 100644
--- a/src/main/webapp/views/tvDevice/tvDevice.html
+++ b/src/main/webapp/views/tvDevice/tvDevice.html
@@ -157,6 +157,24 @@
                 </div>
             </div>
 
+            <div style="margin-bottom: 15px;">
+                <el-card shadow="hover">
+                    <div slot="header">
+                        <span>鎵嬪姩寮傚父淇℃伅</span>
+                    </div>
+                    <el-form label-position="top" size="small">
+                        <el-form-item label="寮傚父淇℃伅">
+                            <el-input type="textarea" v-model="manualError" :rows="3"
+                                placeholder="杈撳叆闇�瑕佷笅鍙戝埌璁惧鐨勫紓甯镐俊鎭�"></el-input>
+                        </el-form-item>
+                        <el-button type="primary" size="small" @click="saveManualError"
+                            :loading="manualErrorSaving">淇濆瓨</el-button>
+                        <el-button size="small" @click="clearManualError"
+                            :disabled="manualErrorSaving">娓呯┖</el-button>
+                    </el-form>
+                </el-card>
+            </div>
+
             <!-- 琛ㄦ牸鍖哄煙 -->
             <div class="table-section">
                 <el-table :data="tableData" border stripe @selection-change="handleSelectionChange" style="width: 100%;"
@@ -222,12 +240,9 @@
                                     <el-select v-model="installForm.taskId" placeholder="璇烽�夋嫨宸插畬鎴愮殑鎵撳寘浠诲姟"
                                         style="width: 100%;" filterable>
                                         <el-option v-for="task in completedTasks" :key="task.id"
-                                            :label="task.projectName || task.taskId" :value="task.id"
+                                            :label="buildTaskLabel(task)" :value="task.id"
                                             :disabled="!task.apkPath">
-                                            <span>{{ task.projectName || task.repoAlias }}</span>
-                                            <span style="float: right; color: #909399; font-size: 12px;">
-                                                {{ task.apkPath ? '宸蹭笅杞�' : '鏈笅杞�' }}
-                                            </span>
+                                            <span>{{ buildTaskLabel(task) }}</span>
                                         </el-option>
                                     </el-select>
                                 </el-form-item>
@@ -430,7 +445,10 @@
                 screenshotImage: '',
                 screenshotLoading: false,
                 autoRefreshScreenshot: false,
-                screenshotTimer: null
+                screenshotTimer: null,
+
+                manualError: '',
+                manualErrorSaving: false
             },
 
             computed: {
@@ -449,12 +467,60 @@
                 this.loadData();
                 this.loadAllDevices();
                 this.loadCompletedTasks();
+                this.loadManualError();
             },
 
             methods: {
                 // 鑾峰彇璇锋眰澶�
                 getHeaders() {
                     return { 'token': localStorage.getItem('token') };
+                },
+                loadManualError() {
+                    $.ajax({
+                        url: baseUrl + '/openapi/manualError/auth',
+                        headers: this.getHeaders(),
+                        method: 'GET',
+                        success: (res) => {
+                            if (res.code === 200) {
+                                this.manualError = (res.data && res.data.manualError) ? res.data.manualError : '';
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl + '/';
+                            } else {
+                                this.$message.error(res.msg || '鍔犺浇澶辫触');
+                            }
+                        },
+                        error: () => {
+                            this.$message.error('璇锋眰澶辫触');
+                        }
+                    });
+                },
+                saveManualError() {
+                    this.manualErrorSaving = true;
+                    $.ajax({
+                        url: baseUrl + '/openapi/manualError/auth',
+                        headers: this.getHeaders(),
+                        method: 'POST',
+                        contentType: 'application/json;charset=UTF-8',
+                        data: JSON.stringify({ manualError: this.manualError }),
+                        success: (res) => {
+                            this.manualErrorSaving = false;
+                            if (res.code === 200) {
+                                this.$message.success('淇濆瓨鎴愬姛');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl + '/';
+                            } else {
+                                this.$message.error(res.msg || '淇濆瓨澶辫触');
+                            }
+                        },
+                        error: () => {
+                            this.manualErrorSaving = false;
+                            this.$message.error('璇锋眰澶辫触');
+                        }
+                    });
+                },
+                clearManualError() {
+                    this.manualError = '';
+                    this.saveManualError();
                 },
 
                 // 鍔犺浇鏁版嵁
@@ -951,6 +1017,14 @@
                     this.$message.error('涓婁紶澶辫触');
                 },
 
+                buildTaskLabel(task) {
+                    const name = task.projectName || task.repoAlias || task.taskId || '';
+                    const time = this.formatDate(task.createdAt) || '-';
+                    const id = task.id != null ? task.id : '';
+                    const status = task.apkPath ? '宸蹭笅杞�' : '鏈笅杞�';
+                    return `${name} | ID: ${id} | ${time} | ${status}`;
+                },
+
                 // 鏍煎紡鍖栨棩鏈�
                 formatDate(timestamp) {
                     if (!timestamp) return '';
@@ -968,4 +1042,4 @@
     </script>
 </body>
 
-</html>
\ No newline at end of file
+</html>

--
Gitblit v1.9.1