settlement-card.html 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <div class="settlement-card">
  2. <!-- 统计数据概览 -->
  3. <div class="stats-overview">
  4. <h4>尾款结算概览</h4>
  5. <div class="stats-grid">
  6. <div class="stat-item total">
  7. <div class="stat-value">{{ formatAmount(stats().totalAmount) }}</div>
  8. <div class="stat-label">总金额 ({{ stats().totalCount }}项)</div>
  9. </div>
  10. <div class="stat-item pending">
  11. <div class="stat-value">{{ formatAmount(stats().pendingAmount) }}</div>
  12. <div class="stat-label">待收款 ({{ stats().pendingCount }}项)</div>
  13. </div>
  14. <div class="stat-item overdue">
  15. <div class="stat-value">{{ formatAmount(stats().overdueAmount) }}</div>
  16. <div class="stat-label">逾期尾款 ({{ stats().overdueCount }}项)</div>
  17. </div>
  18. <div class="stat-item completed">
  19. <div class="stat-value">{{ formatAmount(stats().completedAmount) }}</div>
  20. <div class="stat-label">已收款 ({{ stats().completedCount }}项)</div>
  21. </div>
  22. </div>
  23. </div>
  24. <!-- 筛选和搜索 -->
  25. <div class="filter-section">
  26. <div class="search-bar">
  27. <input
  28. type="text"
  29. placeholder="搜索项目名称或阶段..."
  30. [value]="searchKeyword()"
  31. (input)="updateSearchKeyword($event.target.value)"
  32. class="search-input">
  33. </div>
  34. <div class="filter-buttons">
  35. <button
  36. class="filter-btn"
  37. [class.active]="statusFilter() === 'all'"
  38. (click)="updateStatusFilter('all')">
  39. 全部
  40. </button>
  41. <button
  42. class="filter-btn pending"
  43. [class.active]="statusFilter() === '待结算'"
  44. (click)="updateStatusFilter('待结算')">
  45. 待结算
  46. </button>
  47. <button
  48. class="filter-btn overdue"
  49. [class.active]="statusFilter() === 'overdue'"
  50. (click)="updateStatusFilter('overdue')">
  51. 逾期
  52. </button>
  53. <button
  54. class="filter-btn completed"
  55. [class.active]="statusFilter() === '已结算'"
  56. (click)="updateStatusFilter('已结算')">
  57. 已结算
  58. </button>
  59. </div>
  60. </div>
  61. <!-- 结算列表 -->
  62. <div class="settlements-list">
  63. @if (filteredSettlements() && filteredSettlements().length > 0) {
  64. <div class="list-header">
  65. <span class="col-project">项目信息</span>
  66. <span class="col-amount">金额</span>
  67. <span class="col-status">状态</span>
  68. <span class="col-date">日期</span>
  69. </div>
  70. <div class="list-body">
  71. @for (settlement of filteredSettlements(); track settlement.id) {
  72. <div class="settlement-item" [class]="getStatusClass(settlement)">
  73. <div class="col-project">
  74. <div class="project-name">{{ settlement.projectName || '结算项' }}</div>
  75. <div class="stage-name">{{ settlement.stage || '阶段' }}</div>
  76. </div>
  77. <div class="col-amount">
  78. <div class="amount">{{ formatAmount(settlement.amount || 0) }}</div>
  79. <div class="percentage">{{ settlement.percentage }}%</div>
  80. </div>
  81. <div class="col-status">
  82. <span class="status-badge" [class]="getStatusClass(settlement)">
  83. {{ settlement.status }}
  84. </span>
  85. @if (isOverdue(settlement)) {
  86. <div class="overdue-days">逾期 {{ getDaysOverdue(settlement) }} 天</div>
  87. }
  88. </div>
  89. <div class="col-date">
  90. @if (settlement.settledAt) {
  91. <div class="settled-date">{{ settlement.settledAt | date:'yyyy-MM-dd' }}</div>
  92. <div class="date-label">结算日期</div>
  93. } @else {
  94. <div class="due-date">{{ settlement.createdAt | date:'yyyy-MM-dd' }}</div>
  95. <div class="date-label">创建日期</div>
  96. }
  97. </div>
  98. </div>
  99. }
  100. </div>
  101. } @else {
  102. <div class="empty-state">
  103. <div class="empty-icon">💰</div>
  104. <div class="empty-title">暂无结算信息</div>
  105. <div class="empty-desc">当前筛选条件下没有找到相关的结算记录</div>
  106. </div>
  107. }
  108. </div>
  109. </div>