complaint-card.scss 13 KB

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