From 8be06bcd43b779e5fb86b9cf0bfbbdb3a3c2e4c2 Mon Sep 17 00:00:00 2001 From: duxingchen Date: Thu, 6 Aug 2026 11:36:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E9=9A=94=E7=A6=BB+2D?= =?UTF-8?q?=E8=93=9D=E5=9B=BE=E4=BF=AE=E5=A4=8D:=20isAssignee=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=98=BE=E9=9A=90+=E5=8F=AA=E8=AF=BB=E6=8F=90?= =?UTF-8?q?=E7=A4=BA+=E5=88=86=E6=94=AF=E6=A0=87=E7=AD=BE(badge-main/sub)+?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E5=90=8CY=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/scan/components/TreeCanvas.vue | 21 ++++++++++++++++++- .../pages/scan/components/WorkspaceArea.vue | 8 ++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/track-uniapp/src/pages/scan/components/TreeCanvas.vue b/track-uniapp/src/pages/scan/components/TreeCanvas.vue index bd0df8e..0f7b844 100644 --- a/track-uniapp/src/pages/scan/components/TreeCanvas.vue +++ b/track-uniapp/src/pages/scan/components/TreeCanvas.vue @@ -24,7 +24,7 @@ @tap="node.records && node.records.length && $emit('viewRecords', node)"> - {{ node.task_name }} + {{ node.parent_task_id ? branchLabelMap[node.id] || '分支' : '主分支' }} {{ statusLabel(node.status) }} @@ -106,6 +106,23 @@ export default { if (this.product) walk(this.product.task_tree); return map; }, + branchLabelMap() { + const map = {}; + const traverse = (tasks, prefix) => { + if (!tasks) return; + tasks.forEach((t, i) => { + map[t.id] = prefix ? `分支 ${prefix}${i + 1}` : '分支 1'; + traverse(t.child_tasks, prefix ? `${prefix}${i + 1}.` : `${i + 1}.`); + }); + }; + if (this.product && this.product.task_tree) { + this.product.task_tree.forEach((t, i) => { + map[t.id] = '主分支'; + traverse(t.child_tasks, `${i + 1}.`); + }); + } + return map; + }, canvasWidth() { if (!this.treeNodes.length) return 400; return Math.max(800, Math.max(...this.treeNodes.map(n => n.x)) + 300); }, canvasHeight() { if (!this.treeNodes.length) return 400; return Math.max(800, Math.max(...this.treeNodes.map(n => n.y)) + 300); } }, @@ -145,6 +162,8 @@ export default { .canvas-node.s-green { border-left-color: #22c55e; } .canvas-node.s-red { border-left-color: #ef4444; } .cn-header { display: flex; align-items: center; justify-content: space-between; } +.badge-main { font-size: 10px; padding: 2px 8px; border-radius: 6px; background: #2563eb; color: #fff; font-weight: 700; } +.badge-sub { font-size: 10px; padding: 2px 8px; border-radius: 6px; background: #ede9fe; color: #7c3aed; font-weight: 700; } .cn-name { font-size: 24px; font-weight: 800; color: #1f2937; } .cn-badge { font-size: 14px; padding: 4px 12px; border-radius: 8px; font-weight: 700; } .cn-badge.s-yellow { background: #fef3c7; color: #b45309; } diff --git a/track-uniapp/src/pages/scan/components/WorkspaceArea.vue b/track-uniapp/src/pages/scan/components/WorkspaceArea.vue index 0da5ce1..a7faf91 100644 --- a/track-uniapp/src/pages/scan/components/WorkspaceArea.vue +++ b/track-uniapp/src/pages/scan/components/WorkspaceArea.vue @@ -78,7 +78,7 @@ {{ formatTaskTime(lockedTask) }} - + + + 🔒 非当前任务指派人,仅可查看 + @@ -128,6 +131,7 @@ export default { return result; }, lockedTask() { return this.focusTasks.find(t => t.id === this.lockedTaskId) || null; }, + isAssignee() { if (!this.lockedTask) return false; return this.lockedTask.assignee_id == this.currentUserId || this.lockedTask.assignee_id == this.currentUsername; }, branchLabelsMap() { const map = {}; if (!this.product || !this.product.task_tree) return map; @@ -211,6 +215,8 @@ export default { .footer-btn::after { border: none; } .btn-icon { font-size: 36rpx; margin-bottom: 6rpx; } .btn-txt { font-size: 24rpx; font-weight: 700; } +.footer-readonly { justify-content: center; background: #fef2f2; } +.readonly-hint { font-size: 24rpx; color: #dc2626; font-weight: 600; } .footer-transfer { background: #dcfce7; color: #16a34a; } .footer-record { background: #eff6ff; color: #2563eb; } .footer-receive { background: #dbeafe; color: #1d4ed8; }