Browse Source

feat:new-02

0235711 2 ngày trước cách đây
mục cha
commit
6c043f1487

+ 2 - 1
src/app/pages/customer-service/consultation-order/consultation-order.scss

@@ -1,3 +1,4 @@
+@use 'sass:math';
 // iOS风格变量定义
 $primary-color: #007AFF;
 $primary-dark: #0062CC;
@@ -329,7 +330,7 @@ $card-padding: 16px;
   }
   
   + .card {
-    margin-top: -$grid-gap/2;
+    margin-top: math.div(-$grid-gap, 2);
     border-top: 0.5px solid $border-color;
     border-radius: 0 0 $border-radius $border-radius;
   }

+ 22 - 15
src/app/pages/customer-service/dashboard/dashboard.html

@@ -112,25 +112,32 @@
             <span class="task-status">{{ getTaskStatus(task) }}</span>
           </div>
           
-          <!-- 任务处理进度条 -->
-          <ng-container *ngIf="taskProcessingState()[task.id]?.inProgress">
-            <div class="task-progress-container">
-              <div class="task-progress-bar" [style.width]="taskProcessingState()[task.id]?.progress + '%'">
-                <span class="task-progress-text">{{ taskProcessingState()[task.id]?.progress }}%</span>
+          <!-- 任务处理状态(使用本地变量 s 消除可选链告警) -->
+          <ng-container *ngIf="taskProcessingState()[task.id] as s">
+            <ng-container *ngIf="s.inProgress === true">
+              <div class="task-progress-container">
+                <div class="task-progress-bar" [style.width]="s.progress + '%'">
+                  <span class="task-progress-text">{{ s.progress }}%</span>
+                </div>
               </div>
-            </div>
+            </ng-container>
           </ng-container>
         </div>
             <div class="task-actions">
-          <button 
-            class="btn-primary"
-            [class.processing]="taskProcessingState()[task.id]?.inProgress"
-            (click)="handleAssignment(task.id)"
-            [disabled]="taskProcessingState()[task.id]?.inProgress || task.isCompleted"
-          >
-            {{ taskProcessingState()[task.id]?.inProgress ? '处理中' : '处理' }}
-          </button>
-        </div>
+          <ng-container *ngIf="taskProcessingState()[task.id] as s; else noTaskActionState">
+            <button 
+              class="btn-primary"
+              [class.processing]="s.inProgress === true"
+              (click)="handleAssignment(task.id)"
+              [disabled]="(s.inProgress === true) || task.isCompleted"
+            >
+              {{ s.inProgress === true ? '处理中' : '处理' }}
+            </button>
+          </ng-container>
+          <ng-template #noTaskActionState>
+            <button class="btn-primary" (click)="handleAssignment(task.id)" [disabled]="task.isCompleted">处理</button>
+          </ng-template>
+          </div>
       </div>
     </div>
   </section>

+ 1 - 1
src/app/pages/customer-service/dashboard/dashboard.ts

@@ -27,7 +27,7 @@ export class Dashboard implements OnInit, OnDestroy {
   urgentTasks = signal<Task[]>([]);
 
   // 任务处理状态
-  taskProcessingState = signal<{[key: string]: {inProgress: boolean, progress: number}}>({});
+  taskProcessingState = signal<Partial<Record<string, { inProgress: boolean; progress: number }>>>({});
   
   // 项目动态流
   projectUpdates = signal<(Project | CustomerFeedback)[]>([]);

+ 4 - 0
src/app/pages/finance/reports/reports.html

@@ -180,6 +180,10 @@
         <h3>数据可视化</h3>
       </div>
       
+      <div class="role-warning" *ngIf="userRole() !== 'teamLead'">
+        出于权限控制,图表数值已隐藏;如需查看完整数据,请使用组长账号。
+      </div>
+      
       <!-- ECharts 图表容器 -->
       <div id="echarts-container" #chartContainer style="width: 100%; height: 400px;"></div>
       

+ 10 - 0
src/app/pages/finance/reports/reports.scss

@@ -289,6 +289,16 @@
   border-radius: 8px;
   padding: 20px;
   border: 1px solid #e9ecef;
+
+  .role-warning {
+    margin: 8px 0 12px;
+    padding: 10px 12px;
+    background: #fff7e6;
+    border: 1px solid #ffe7ba;
+    color: #ad6800;
+    border-radius: 6px;
+    font-size: 13px;
+  }
 }
 
 .chart-header {

+ 18 - 6
src/app/pages/finance/reports/reports.ts

@@ -1,4 +1,4 @@
-import { CommonModule } from '@angular/common';
+import { CommonModule, NgIf } from '@angular/common';
 import { FormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
 import { Component, signal, ElementRef, ViewChild, OnInit, AfterViewInit, effect } from '@angular/core';
@@ -50,7 +50,7 @@ export interface ReportData {
 
 @Component({
   selector: 'app-reports',
-  imports: [CommonModule, FormsModule, RouterModule],
+  imports: [CommonModule, NgIf, FormsModule, RouterModule],
   templateUrl: './reports.html',
   styleUrl: './reports.scss',
   standalone: true
@@ -131,10 +131,17 @@ export class Reports implements OnInit, AfterViewInit {
   constructor(private authService: AuthService) {
     // 创建effect监听报表数据变化
     effect(() => {
-      // 访问filteredReportData以确保它被计算
-      this.filteredReportData;
+      // 访问并保存 filteredReportData,触发依赖跟踪
+      const data = this.filteredReportData;
+
+      // 当报表数据生成后,模板中的 *ngIf 渲染出图表容器,此时再初始化图表
+      if (!this.chartInitialized && data && this.chartContainer?.nativeElement) {
+        // 使用微任务/宏任务确保DOM已完成渲染
+        setTimeout(() => this.initChart());
+      }
       
-      if (this.filteredReportData && this.chartInitialized) {
+      // 数据变化且图表已初始化时,更新图表
+      if (data && this.chartInitialized) {
         this.updateChart();
       }
     });
@@ -154,7 +161,7 @@ export class Reports implements OnInit, AfterViewInit {
 
   // 初始化echarts图表
   private initChart(): void {
-    if (this.chartContainer && this.chartContainer.nativeElement) {
+    if (this.chartContainer && this.chartContainer.nativeElement && !this.chartInitialized) {
       this.chartInstance = echarts.init(this.chartContainer.nativeElement);
       this.chartInitialized = true;
       
@@ -162,6 +169,11 @@ export class Reports implements OnInit, AfterViewInit {
       window.addEventListener('resize', () => {
         this.chartInstance?.resize();
       });
+
+      // 初始化完成后,如已有数据则立即渲染一次
+      if (this.filteredReportData) {
+        this.updateChart();
+      }
     }
   }