complaint-card.scss 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. @use '../../styles/_ios-theme.scss' as ios;
  2. :host { display: block; height: 100%; }
  3. .complaint-card {
  4. padding: ios.$ios-spacing-md;
  5. background: ios.$ios-background;
  6. border-radius: 12px;
  7. border: 1px solid ios.$ios-border;
  8. // 统计数据概览
  9. .stats-overview {
  10. margin-bottom: ios.$ios-spacing-lg;
  11. h4 {
  12. margin: 0 0 ios.$ios-spacing-md 0;
  13. font-size: ios.$ios-font-size-lg;
  14. font-weight: ios.$ios-font-weight-semibold;
  15. color: ios.$ios-text-primary;
  16. }
  17. .stats-grid {
  18. display: grid;
  19. grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  20. gap: ios.$ios-spacing-md;
  21. .stat-item {
  22. text-align: center;
  23. padding: ios.$ios-spacing-md;
  24. background: ios.$ios-background-secondary;
  25. border-radius: ios.$ios-radius-md;
  26. border: 1px solid ios.$ios-border;
  27. .stat-value {
  28. font-size: ios.$ios-font-size-xl;
  29. font-weight: ios.$ios-font-weight-bold;
  30. color: ios.$ios-text-primary;
  31. margin-bottom: ios.$ios-spacing-xs;
  32. .time-suffix {
  33. font-size: ios.$ios-font-size-sm;
  34. color: ios.$ios-text-secondary;
  35. }
  36. }
  37. .stat-label {
  38. font-size: ios.$ios-font-size-xs;
  39. color: ios.$ios-text-secondary;
  40. }
  41. &.total .stat-value { color: ios.$ios-primary; }
  42. &.pending .stat-value { color: ios.$ios-warning; }
  43. &.processing .stat-value { color: #1890ff; }
  44. &.resolved .stat-value { color: ios.$ios-success; }
  45. &.high-priority .stat-value { color: ios.$ios-danger; }
  46. &.resolution-time .stat-value { color: #722ed1; }
  47. }
  48. }
  49. }
  50. // 优先级统计
  51. .priority-stats.complaint-trends {
  52. margin-bottom: ios.$ios-spacing-lg;
  53. padding: ios.$ios-spacing-md;
  54. background: ios.$ios-background-secondary;
  55. border-radius: ios.$ios-radius-md;
  56. border: 1px solid ios.$ios-border;
  57. h5 {
  58. margin: 0 0 ios.$ios-spacing-md 0;
  59. font-size: ios.$ios-font-size-md;
  60. font-weight: ios.$ios-font-weight-semibold;
  61. color: ios.$ios-text-primary;
  62. }
  63. .priority-grid {
  64. display: grid;
  65. grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  66. gap: ios.$ios-spacing-sm;
  67. .priority-item {
  68. display: flex;
  69. justify-content: space-between;
  70. align-items: center;
  71. padding: ios.$ios-spacing-sm;
  72. background: ios.$ios-background;
  73. border-radius: ios.$ios-radius-sm;
  74. border: 1px solid ios.$ios-border;
  75. border-left-width: 4px;
  76. .priority-label {
  77. font-size: ios.$ios-font-size-sm;
  78. color: ios.$ios-text-secondary;
  79. }
  80. .priority-count {
  81. font-size: ios.$ios-font-size-md;
  82. font-weight: ios.$ios-font-weight-semibold;
  83. color: ios.$ios-text-primary;
  84. }
  85. }
  86. }
  87. }
  88. // 类型统计
  89. .type-stats {
  90. margin-bottom: ios.$ios-spacing-lg;
  91. padding: ios.$ios-spacing-md;
  92. background: ios.$ios-background-secondary;
  93. border-radius: ios.$ios-radius-md;
  94. border: 1px solid ios.$ios-border;
  95. h5 {
  96. margin: 0 0 ios.$ios-spacing-md 0;
  97. font-size: ios.$ios-font-size-md;
  98. font-weight: ios.$ios-font-weight-semibold;
  99. color: ios.$ios-text-primary;
  100. }
  101. .type-grid {
  102. display: grid;
  103. grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  104. gap: ios.$ios-spacing-sm;
  105. .type-item {
  106. display: flex;
  107. justify-content: space-between;
  108. align-items: center;
  109. padding: ios.$ios-spacing-sm;
  110. background: ios.$ios-background;
  111. border-radius: ios.$ios-radius-sm;
  112. border: 1px solid ios.$ios-border;
  113. .type-label {
  114. font-size: ios.$ios-font-size-xs;
  115. color: ios.$ios-text-secondary;
  116. }
  117. .type-count {
  118. font-size: ios.$ios-font-size-sm;
  119. font-weight: ios.$ios-font-weight-semibold;
  120. color: ios.$ios-primary;
  121. }
  122. }
  123. }
  124. }
  125. // 筛选区域
  126. .filter-section {
  127. margin-bottom: ios.$ios-spacing-lg;
  128. padding: ios.$ios-spacing-md;
  129. background: ios.$ios-background-secondary;
  130. border-radius: ios.$ios-radius-md;
  131. border: 1px solid ios.$ios-border;
  132. .search-row {
  133. margin-bottom: ios.$ios-spacing-md;
  134. .search-group {
  135. display: flex;
  136. align-items: center;
  137. gap: ios.$ios-spacing-sm;
  138. label {
  139. font-size: ios.$ios-font-size-sm;
  140. color: ios.$ios-text-secondary;
  141. white-space: nowrap;
  142. }
  143. .search-input {
  144. flex: 1;
  145. padding: ios.$ios-spacing-sm;
  146. border: 1px solid ios.$ios-border;
  147. border-radius: ios.$ios-radius-sm;
  148. background: ios.$ios-background;
  149. color: ios.$ios-text-primary;
  150. font-size: ios.$ios-font-size-sm;
  151. &:focus {
  152. outline: none;
  153. border-color: ios.$ios-primary;
  154. }
  155. &::placeholder {
  156. color: ios.$ios-text-secondary;
  157. }
  158. }
  159. }
  160. }
  161. .filter-row {
  162. display: flex;
  163. flex-wrap: wrap;
  164. gap: ios.$ios-spacing-md;
  165. margin-bottom: ios.$ios-spacing-md;
  166. &:last-child {
  167. margin-bottom: 0;
  168. }
  169. .filter-group {
  170. display: flex;
  171. align-items: center;
  172. gap: ios.$ios-spacing-sm;
  173. label {
  174. font-size: ios.$ios-font-size-sm;
  175. color: ios.$ios-text-secondary;
  176. white-space: nowrap;
  177. }
  178. .filter-buttons {
  179. display: flex;
  180. gap: ios.$ios-spacing-xs;
  181. .filter-btn {
  182. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  183. border: 1px solid ios.$ios-border;
  184. background: ios.$ios-background;
  185. color: ios.$ios-text-secondary;
  186. border-radius: ios.$ios-radius-sm;
  187. font-size: ios.$ios-font-size-xs;
  188. cursor: pointer;
  189. transition: all 0.2s ease;
  190. &:hover {
  191. background: ios.$ios-background-secondary;
  192. }
  193. &.active {
  194. background: ios.$ios-primary;
  195. color: white;
  196. border-color: ios.$ios-primary;
  197. }
  198. &.pending.active {
  199. background: ios.$ios-warning;
  200. border-color: ios.$ios-warning;
  201. }
  202. &.processing.active {
  203. background: #1890ff;
  204. border-color: #1890ff;
  205. }
  206. &.resolved.active {
  207. background: ios.$ios-success;
  208. border-color: ios.$ios-success;
  209. }
  210. }
  211. }
  212. .filter-select {
  213. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  214. border: 1px solid ios.$ios-border;
  215. border-radius: ios.$ios-radius-sm;
  216. background: ios.$ios-background;
  217. color: ios.$ios-text-primary;
  218. font-size: ios.$ios-font-size-xs;
  219. min-width: 120px;
  220. &:focus {
  221. outline: none;
  222. border-color: ios.$ios-primary;
  223. }
  224. }
  225. }
  226. }
  227. }
  228. // 投诉列表
  229. .complaints-list {
  230. .list-body {
  231. .complaint-item {
  232. display: flex;
  233. align-items: center;
  234. gap: ios.$ios-spacing-md;
  235. padding: ios.$ios-spacing-md;
  236. background: ios.$ios-background;
  237. border: 1px solid ios.$ios-border;
  238. border-radius: ios.$ios-radius-md;
  239. transition: all 0.2s ease;
  240. &:hover {
  241. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  242. }
  243. &:last-child {
  244. margin-bottom: 0;
  245. }
  246. &.overdue {
  247. border-left: 4px solid ios.$ios-danger;
  248. background: rgba(ios.$ios-danger, 0.02);
  249. }
  250. .complaint-header {
  251. display: flex;
  252. justify-content: space-between;
  253. align-items: flex-start;
  254. margin-bottom: ios.$ios-spacing-md;
  255. .complaint-info {
  256. flex: 1;
  257. .complaint-title {
  258. display: flex;
  259. align-items: center;
  260. gap: ios.$ios-spacing-sm;
  261. margin-bottom: ios.$ios-spacing-xs;
  262. .type-tag {
  263. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  264. background: ios.$ios-primary;
  265. color: white;
  266. border-radius: ios.$ios-radius-sm;
  267. font-size: ios.$ios-font-size-xs;
  268. }
  269. .customer-name {
  270. font-size: ios.$ios-font-size-md;
  271. font-weight: ios.$ios-font-weight-semibold;
  272. color: ios.$ios-text-primary;
  273. }
  274. }
  275. .priority-badge {
  276. display: inline-block;
  277. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  278. color: white;
  279. border-radius: ios.$ios-radius-sm;
  280. font-size: ios.$ios-font-size-xs;
  281. font-weight: ios.$ios-font-weight-semibold;
  282. }
  283. }
  284. .complaint-meta {
  285. display: flex;
  286. align-items: center;
  287. gap: ios.$ios-spacing-sm;
  288. margin-bottom: ios.$ios-spacing-xs;
  289. .complaint-id {
  290. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  291. background: ios.$ios-primary;
  292. color: white;
  293. border-radius: ios.$ios-radius-sm;
  294. font-size: ios.$ios-font-size-xs;
  295. }
  296. .complaint-title {
  297. font-size: ios.$ios-font-size-md;
  298. font-weight: ios.$ios-font-weight-semibold;
  299. color: ios.$ios-text-primary;
  300. }
  301. }
  302. .complaint-status {
  303. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  304. color: white;
  305. border-radius: ios.$ios-radius-sm;
  306. font-size: ios.$ios-font-size-xs;
  307. font-weight: ios.$ios-font-weight-semibold;
  308. &.pending {
  309. background: rgba(ios.$ios-warning, 0.1);
  310. color: ios.$ios-warning;
  311. }
  312. &.processing {
  313. background: rgba(ios.$ios-info, 0.1);
  314. color: ios.$ios-info;
  315. }
  316. &.resolved {
  317. background: rgba(ios.$ios-success, 0.1);
  318. color: ios.$ios-success;
  319. }
  320. &.urgent {
  321. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  322. background: rgba(ios.$ios-danger, 0.1);
  323. color: ios.$ios-danger;
  324. border-radius: ios.$ios-radius-sm;
  325. font-size: ios.$ios-font-size-xs;
  326. font-weight: ios.$ios-font-weight-semibold;
  327. }
  328. }
  329. .complaint-content {
  330. margin-bottom: ios.$ios-spacing-md;
  331. .complaint-description {
  332. margin: 0 0 ios.$ios-spacing-sm 0;
  333. color: ios.$ios-text-primary;
  334. }
  335. .complaint-details {
  336. display: flex;
  337. flex-direction: column;
  338. gap: ios.$ios-spacing-sm;
  339. }
  340. .detail-item {
  341. display: flex;
  342. justify-content: space-between;
  343. padding: ios.$ios-spacing-xs;
  344. border-radius: ios.$ios-radius-sm;
  345. border: 1px solid ios.$ios-border;
  346. .detail-label {
  347. font-weight: 500;
  348. }
  349. .detail-value {
  350. display: flex;
  351. align-items: center;
  352. gap: ios.$ios-spacing-md;
  353. margin-bottom: ios.$ios-spacing-sm;
  354. .customer-info {
  355. display: flex;
  356. align-items: center;
  357. gap: ios.$ios-spacing-xs;
  358. .customer-name {
  359. font-size: ios.$ios-font-size-xs;
  360. color: ios.$ios-text-secondary;
  361. }
  362. .customer-id {
  363. color: ios.$ios-primary;
  364. font-weight: ios.$ios-font-weight-semibold;
  365. }
  366. .customer-level {
  367. color: ios.$ios-success;
  368. }
  369. }
  370. .complaint-actions {
  371. padding: ios.$ios-spacing-sm;
  372. background: rgba(ios.$ios-primary, 0.05);
  373. border-radius: ios.$ios-radius-sm;
  374. border-left: 3px solid ios.$ios-primary;
  375. margin-bottom: ios.$ios-spacing-sm;
  376. .action-title {
  377. color: ios.$ios-primary;
  378. font-size: ios.$ios-font-size-sm;
  379. }
  380. .action-description {
  381. margin: ios.$ios-spacing-xs 0;
  382. color: ios.$ios-text-secondary;
  383. font-size: ios.$ios-font-size-sm;
  384. }
  385. .action-timestamp {
  386. font-size: ios.$ios-font-size-xs;
  387. color: ios.$ios-text-secondary;
  388. }
  389. }
  390. .resolution-note {
  391. padding: ios.$ios-spacing-sm;
  392. background: rgba(ios.$ios-success, 0.05);
  393. border-radius: ios.$ios-radius-sm;
  394. border-left: 3px solid ios.$ios-success;
  395. .resolution-title {
  396. color: ios.$ios-success;
  397. font-size: ios.$ios-font-size-sm;
  398. }
  399. .resolution-content {
  400. margin: ios.$ios-spacing-xs 0 0 0;
  401. color: ios.$ios-text-secondary;
  402. font-size: ios.$ios-font-size-sm;
  403. }
  404. }
  405. }
  406. }
  407. }
  408. .complaint-footer {
  409. text-align: center;
  410. padding: ios.$ios-spacing-xl;
  411. color: ios.$ios-text-secondary;
  412. .no-complaints-message {
  413. margin-bottom: ios.$ios-spacing-md;
  414. }
  415. .no-complaints-title {
  416. font-size: ios.$ios-font-size-lg;
  417. font-weight: ios.$ios-font-weight-semibold;
  418. color: ios.$ios-text-primary;
  419. margin-bottom: ios.$ios-spacing-sm;
  420. }
  421. .no-complaints-description {
  422. font-size: ios.$ios-font-size-sm;
  423. color: ios.$ios-text-secondary;
  424. }
  425. }
  426. }
  427. }
  428. }
  429. .empty-state {
  430. text-align: center;
  431. padding: ios.$ios-spacing-xl;
  432. color: ios.$ios-text-secondary;
  433. .empty-icon {
  434. font-size: 48px;
  435. margin-bottom: ios.$ios-spacing-md;
  436. }
  437. .empty-title {
  438. font-size: ios.$ios-font-size-lg;
  439. font-weight: ios.$ios-font-weight-semibold;
  440. color: ios.$ios-text-primary;
  441. margin-bottom: ios.$ios-spacing-sm;
  442. }
  443. .empty-desc {
  444. font-size: ios.$ios-font-size-sm;
  445. color: ios.$ios-text-secondary;
  446. }
  447. }
  448. }
  449. // 响应式设计
  450. @media (max-width: 768px) {
  451. .stats-grid {
  452. grid-template-columns: repeat(2, 1fr);
  453. gap: ios.$ios-spacing-sm;
  454. }
  455. .priority-stats .priority-grid,
  456. .type-stats .type-grid {
  457. grid-template-columns: 1fr;
  458. }
  459. .filter-section {
  460. .search-row .search-group {
  461. flex-direction: column;
  462. align-items: stretch;
  463. }
  464. .filter-row {
  465. flex-direction: column;
  466. align-items: stretch;
  467. .filter-group {
  468. flex-direction: column;
  469. align-items: stretch;
  470. .filter-buttons {
  471. justify-content: center;
  472. }
  473. }
  474. }
  475. }
  476. .complaints-list .complaint-item .complaint-header {
  477. flex-direction: column;
  478. gap: ios.$ios-spacing-sm;
  479. }
  480. }
  481. }