complaint-card.scss 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978
  1. @use '../../styles/_ios-theme.scss' as ios;
  2. :host { display: block; height: 100%; }
  3. // 企业微信监控样式
  4. .wechat-monitoring-section {
  5. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  6. border-radius: 12px;
  7. padding: 20px;
  8. margin-bottom: 20px;
  9. color: white;
  10. .monitoring-header {
  11. display: flex;
  12. justify-content: space-between;
  13. align-items: center;
  14. margin-bottom: 15px;
  15. h4 {
  16. margin: 0;
  17. font-size: 18px;
  18. font-weight: 600;
  19. }
  20. .monitoring-status {
  21. padding: 4px 12px;
  22. border-radius: 20px;
  23. font-size: 12px;
  24. font-weight: 500;
  25. &.status-idle {
  26. background: rgba(255, 255, 255, 0.2);
  27. }
  28. &.status-processing {
  29. background: #ffc107;
  30. color: #000;
  31. animation: pulse 2s infinite;
  32. }
  33. &.status-completed {
  34. background: #28a745;
  35. }
  36. }
  37. }
  38. .monitoring-controls {
  39. display: flex;
  40. align-items: center;
  41. gap: 15px;
  42. flex-wrap: wrap;
  43. .btn {
  44. padding: 8px 16px;
  45. border: none;
  46. border-radius: 6px;
  47. font-size: 14px;
  48. cursor: pointer;
  49. transition: all 0.3s ease;
  50. &.btn-primary {
  51. background: #007bff;
  52. color: white;
  53. &:hover:not(:disabled) {
  54. background: #0056b3;
  55. }
  56. &:disabled {
  57. background: rgba(255, 255, 255, 0.3);
  58. cursor: not-allowed;
  59. }
  60. }
  61. &.btn-secondary {
  62. background: rgba(255, 255, 255, 0.2);
  63. color: white;
  64. &:hover {
  65. background: rgba(255, 255, 255, 0.3);
  66. }
  67. }
  68. i {
  69. margin-right: 6px;
  70. }
  71. }
  72. .monitoring-stats {
  73. display: flex;
  74. gap: 20px;
  75. margin-left: auto;
  76. .stat-item {
  77. display: flex;
  78. align-items: center;
  79. font-size: 14px;
  80. i {
  81. margin-right: 6px;
  82. opacity: 0.8;
  83. }
  84. }
  85. }
  86. }
  87. }
  88. // 实时代办项样式
  89. .realtime-tasks-section {
  90. background: #fff;
  91. border: 1px solid #e9ecef;
  92. border-radius: 12px;
  93. padding: 20px;
  94. margin-bottom: 20px;
  95. .section-header {
  96. display: flex;
  97. justify-content: space-between;
  98. align-items: center;
  99. margin-bottom: 15px;
  100. h4 {
  101. margin: 0;
  102. color: #333;
  103. font-size: 18px;
  104. font-weight: 600;
  105. }
  106. .task-count {
  107. background: #dc3545;
  108. color: white;
  109. padding: 4px 12px;
  110. border-radius: 20px;
  111. font-size: 12px;
  112. font-weight: 500;
  113. }
  114. }
  115. .realtime-task-list {
  116. .task-item {
  117. display: flex;
  118. justify-content: space-between;
  119. align-items: center;
  120. padding: 15px;
  121. border: 1px solid #e9ecef;
  122. border-radius: 8px;
  123. margin-bottom: 10px;
  124. transition: all 0.3s ease;
  125. &:hover {
  126. border-color: #007bff;
  127. box-shadow: 0 2px 8px rgba(0, 123, 255, 0.1);
  128. }
  129. &.processing {
  130. border-color: #ffc107;
  131. background: #fff9c4;
  132. }
  133. .task-info {
  134. flex: 1;
  135. .task-title {
  136. font-weight: 500;
  137. color: #333;
  138. margin-bottom: 8px;
  139. font-size: 14px;
  140. }
  141. .task-meta {
  142. display: flex;
  143. gap: 15px;
  144. font-size: 12px;
  145. color: #666;
  146. .customer {
  147. font-weight: 500;
  148. }
  149. .urgency {
  150. padding: 2px 8px;
  151. border-radius: 12px;
  152. font-weight: 500;
  153. &.urgency-urgent {
  154. background: #ffc107;
  155. color: #000;
  156. }
  157. &.urgency-critical {
  158. background: #dc3545;
  159. color: white;
  160. }
  161. }
  162. }
  163. }
  164. .task-actions {
  165. display: flex;
  166. gap: 8px;
  167. .btn {
  168. padding: 6px 12px;
  169. border: none;
  170. border-radius: 4px;
  171. font-size: 12px;
  172. cursor: pointer;
  173. transition: all 0.3s ease;
  174. &.btn-primary {
  175. background: #007bff;
  176. color: white;
  177. &:hover:not(:disabled) {
  178. background: #0056b3;
  179. }
  180. &:disabled {
  181. background: #6c757d;
  182. cursor: not-allowed;
  183. }
  184. }
  185. &.btn-warning {
  186. background: #ffc107;
  187. color: #000;
  188. &:hover {
  189. background: #e0a800;
  190. }
  191. }
  192. i {
  193. margin-right: 4px;
  194. }
  195. }
  196. }
  197. }
  198. }
  199. }
  200. .complaint-card {
  201. padding: ios.$ios-spacing-md;
  202. background: ios.$ios-background;
  203. border-radius: 12px;
  204. border: 1px solid ios.$ios-border;
  205. // 统计数据概览
  206. .stats-overview {
  207. margin-bottom: ios.$ios-spacing-lg;
  208. h4 {
  209. margin: 0 0 ios.$ios-spacing-md 0;
  210. font-size: ios.$ios-font-size-lg;
  211. font-weight: ios.$ios-font-weight-semibold;
  212. color: ios.$ios-text-primary;
  213. }
  214. .stats-grid {
  215. display: grid;
  216. grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  217. gap: ios.$ios-spacing-md;
  218. .stat-item {
  219. text-align: center;
  220. padding: ios.$ios-spacing-md;
  221. background: ios.$ios-background-secondary;
  222. border-radius: ios.$ios-radius-md;
  223. border: 1px solid ios.$ios-border;
  224. .stat-value {
  225. font-size: ios.$ios-font-size-xl;
  226. font-weight: ios.$ios-font-weight-bold;
  227. color: ios.$ios-text-primary;
  228. margin-bottom: ios.$ios-spacing-xs;
  229. .time-suffix {
  230. font-size: ios.$ios-font-size-sm;
  231. color: ios.$ios-text-secondary;
  232. }
  233. }
  234. .stat-label {
  235. font-size: ios.$ios-font-size-xs;
  236. color: ios.$ios-text-secondary;
  237. }
  238. &.total .stat-value { color: ios.$ios-primary; }
  239. &.pending .stat-value { color: ios.$ios-warning; }
  240. &.processing .stat-value { color: #1890ff; }
  241. &.resolved .stat-value { color: ios.$ios-success; }
  242. &.high-priority .stat-value { color: ios.$ios-danger; }
  243. &.resolution-time .stat-value { color: #722ed1; }
  244. // 新增统计项样式
  245. &.wechat-count .stat-value { color: #52c41a; }
  246. &.auto-tagged .stat-value { color: #13c2c2; }
  247. &.overdue .stat-value { color: #ff4d4f; }
  248. &.follow-up .stat-value { color: #fa8c16; }
  249. }
  250. }
  251. }
  252. // 企业微信监控面板
  253. .wechat-monitoring-panel {
  254. margin-bottom: ios.$ios-spacing-lg;
  255. padding: ios.$ios-spacing-md;
  256. background: linear-gradient(135deg, #e6f7ff 0%, #f0f9ff 100%);
  257. border-radius: ios.$ios-radius-md;
  258. border: 1px solid #91d5ff;
  259. h4 {
  260. margin: 0 0 ios.$ios-spacing-md 0;
  261. font-size: ios.$ios-font-size-lg;
  262. font-weight: ios.$ios-font-weight-semibold;
  263. color: #1890ff;
  264. display: flex;
  265. align-items: center;
  266. gap: ios.$ios-spacing-sm;
  267. &::before {
  268. content: '📱';
  269. font-size: ios.$ios-font-size-lg;
  270. }
  271. }
  272. .monitoring-controls {
  273. display: flex;
  274. align-items: center;
  275. gap: ios.$ios-spacing-md;
  276. margin-bottom: ios.$ios-spacing-md;
  277. flex-wrap: wrap;
  278. .control-btn {
  279. display: flex;
  280. align-items: center;
  281. gap: ios.$ios-spacing-xs;
  282. padding: ios.$ios-spacing-sm ios.$ios-spacing-md;
  283. background: #1890ff;
  284. color: white;
  285. border: none;
  286. border-radius: ios.$ios-radius-sm;
  287. font-size: ios.$ios-font-size-sm;
  288. cursor: pointer;
  289. transition: all 0.3s ease;
  290. &:hover {
  291. background: #40a9ff;
  292. transform: translateY(-1px);
  293. }
  294. .btn-icon {
  295. font-size: ios.$ios-font-size-md;
  296. }
  297. &.setup-keywords {
  298. background: #52c41a;
  299. &:hover {
  300. background: #73d13d;
  301. }
  302. }
  303. }
  304. .monitoring-status {
  305. display: flex;
  306. align-items: center;
  307. gap: ios.$ios-spacing-xs;
  308. margin-left: auto;
  309. .status-label {
  310. font-size: ios.$ios-font-size-sm;
  311. color: ios.$ios-text-secondary;
  312. }
  313. .status-indicator {
  314. padding: 2px 8px;
  315. border-radius: 10px;
  316. font-size: ios.$ios-font-size-xs;
  317. font-weight: ios.$ios-font-weight-medium;
  318. &.active {
  319. background: #f6ffed;
  320. color: #52c41a;
  321. border: 1px solid #b7eb8f;
  322. }
  323. }
  324. }
  325. }
  326. .keyword-display {
  327. display: flex;
  328. align-items: center;
  329. gap: ios.$ios-spacing-sm;
  330. flex-wrap: wrap;
  331. .keyword-label {
  332. font-size: ios.$ios-font-size-sm;
  333. color: ios.$ios-text-secondary;
  334. white-space: nowrap;
  335. }
  336. .keyword-tags {
  337. display: flex;
  338. gap: ios.$ios-spacing-xs;
  339. flex-wrap: wrap;
  340. .keyword-tag {
  341. padding: 2px 8px;
  342. background: #fff2e8;
  343. color: #fa8c16;
  344. border: 1px solid #ffd591;
  345. border-radius: 10px;
  346. font-size: ios.$ios-font-size-xs;
  347. font-weight: ios.$ios-font-weight-medium;
  348. }
  349. }
  350. }
  351. }
  352. // 实时代办项状态
  353. .real-time-task-status {
  354. margin-bottom: ios.$ios-spacing-lg;
  355. padding: ios.$ios-spacing-md;
  356. background: linear-gradient(135deg, #fff7e6 0%, #fffbe6 100%);
  357. border-radius: ios.$ios-radius-md;
  358. border: 1px solid #ffd591;
  359. .task-status-header {
  360. display: flex;
  361. justify-content: space-between;
  362. align-items: center;
  363. margin-bottom: ios.$ios-spacing-sm;
  364. h5 {
  365. margin: 0;
  366. font-size: ios.$ios-font-size-md;
  367. font-weight: ios.$ios-font-weight-semibold;
  368. color: #fa8c16;
  369. }
  370. .task-status-badge {
  371. padding: 4px 12px;
  372. border-radius: ios.$ios-radius-sm;
  373. font-size: ios.$ios-font-size-xs;
  374. font-weight: ios.$ios-font-weight-medium;
  375. &.processing {
  376. background: #fff2e8;
  377. color: #fa8c16;
  378. border: 1px solid #ffd591;
  379. }
  380. &.completed {
  381. background: #f6ffed;
  382. color: #52c41a;
  383. border: 1px solid #b7eb8f;
  384. }
  385. }
  386. }
  387. .task-progress {
  388. .progress-bar {
  389. width: 100%;
  390. height: 6px;
  391. background: #fff7e6;
  392. border-radius: 3px;
  393. overflow: hidden;
  394. margin-bottom: ios.$ios-spacing-xs;
  395. .progress-fill {
  396. height: 100%;
  397. background: linear-gradient(90deg, #fa8c16, #ffa940);
  398. border-radius: 3px;
  399. animation: progress-animation 2s ease-in-out infinite;
  400. }
  401. }
  402. .progress-text {
  403. font-size: ios.$ios-font-size-xs;
  404. color: ios.$ios-text-secondary;
  405. }
  406. }
  407. }
  408. @keyframes progress-animation {
  409. 0% { width: 0%; }
  410. 50% { width: 70%; }
  411. 100% { width: 100%; }
  412. }
  413. // 优先级统计 - 小卡片样式
  414. .priority-stats {
  415. margin-bottom: ios.$ios-spacing-lg;
  416. padding: ios.$ios-spacing-md;
  417. background: ios.$ios-background-secondary;
  418. border-radius: ios.$ios-radius-md;
  419. border: 1px solid ios.$ios-border;
  420. h5 {
  421. margin: 0 0 ios.$ios-spacing-md 0;
  422. font-size: ios.$ios-font-size-md;
  423. font-weight: ios.$ios-font-weight-semibold;
  424. color: ios.$ios-text-primary;
  425. }
  426. .priority-cards-grid {
  427. display: grid;
  428. grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  429. gap: ios.$ios-spacing-md;
  430. .priority-card {
  431. background: ios.$ios-background;
  432. border-radius: ios.$ios-radius-md;
  433. border: 2px solid;
  434. overflow: hidden;
  435. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  436. transition: all 0.3s ease;
  437. &:hover {
  438. transform: translateY(-2px);
  439. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  440. }
  441. .priority-card-header {
  442. padding: ios.$ios-spacing-sm ios.$ios-spacing-md;
  443. color: white;
  444. text-align: center;
  445. .priority-card-label {
  446. font-size: ios.$ios-font-size-sm;
  447. font-weight: ios.$ios-font-weight-semibold;
  448. text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
  449. }
  450. }
  451. .priority-card-body {
  452. padding: ios.$ios-spacing-md;
  453. text-align: center;
  454. background: ios.$ios-background;
  455. .priority-card-count {
  456. font-size: 28px;
  457. font-weight: ios.$ios-font-weight-bold;
  458. color: ios.$ios-text-primary;
  459. line-height: 1;
  460. margin-bottom: 4px;
  461. }
  462. .priority-card-suffix {
  463. font-size: ios.$ios-font-size-xs;
  464. color: ios.$ios-text-secondary;
  465. font-weight: ios.$ios-font-weight-medium;
  466. }
  467. }
  468. }
  469. }
  470. }
  471. // 类型统计
  472. .type-stats {
  473. margin-bottom: ios.$ios-spacing-lg;
  474. padding: ios.$ios-spacing-md;
  475. background: ios.$ios-background-secondary;
  476. border-radius: ios.$ios-radius-md;
  477. border: 1px solid ios.$ios-border;
  478. h5 {
  479. margin: 0 0 ios.$ios-spacing-md 0;
  480. font-size: ios.$ios-font-size-md;
  481. font-weight: ios.$ios-font-weight-semibold;
  482. color: ios.$ios-text-primary;
  483. }
  484. .type-grid {
  485. display: grid;
  486. grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  487. gap: ios.$ios-spacing-sm;
  488. .type-item {
  489. display: flex;
  490. justify-content: space-between;
  491. align-items: center;
  492. padding: ios.$ios-spacing-sm;
  493. background: ios.$ios-background;
  494. border-radius: ios.$ios-radius-sm;
  495. border: 1px solid ios.$ios-border;
  496. .type-label {
  497. font-size: ios.$ios-font-size-xs;
  498. color: ios.$ios-text-secondary;
  499. }
  500. .type-count {
  501. font-size: ios.$ios-font-size-sm;
  502. font-weight: ios.$ios-font-weight-semibold;
  503. color: ios.$ios-primary;
  504. }
  505. }
  506. }
  507. }
  508. // 筛选区域
  509. .filter-section {
  510. margin-bottom: ios.$ios-spacing-lg;
  511. padding: ios.$ios-spacing-md;
  512. background: ios.$ios-background-secondary;
  513. border-radius: ios.$ios-radius-md;
  514. border: 1px solid ios.$ios-border;
  515. .search-row {
  516. margin-bottom: ios.$ios-spacing-md;
  517. .search-group {
  518. display: flex;
  519. align-items: center;
  520. gap: ios.$ios-spacing-sm;
  521. label {
  522. font-size: ios.$ios-font-size-sm;
  523. color: ios.$ios-text-secondary;
  524. white-space: nowrap;
  525. }
  526. .search-input {
  527. flex: 1;
  528. padding: ios.$ios-spacing-sm;
  529. border: 1px solid ios.$ios-border;
  530. border-radius: ios.$ios-radius-sm;
  531. background: ios.$ios-background;
  532. color: ios.$ios-text-primary;
  533. font-size: ios.$ios-font-size-sm;
  534. &:focus {
  535. outline: none;
  536. border-color: ios.$ios-primary;
  537. }
  538. &::placeholder {
  539. color: ios.$ios-text-secondary;
  540. }
  541. }
  542. }
  543. }
  544. .filter-row {
  545. display: flex;
  546. flex-wrap: wrap;
  547. gap: ios.$ios-spacing-md;
  548. margin-bottom: ios.$ios-spacing-md;
  549. &:last-child {
  550. margin-bottom: 0;
  551. }
  552. .filter-group {
  553. display: flex;
  554. align-items: center;
  555. gap: ios.$ios-spacing-sm;
  556. label {
  557. font-size: ios.$ios-font-size-sm;
  558. color: ios.$ios-text-secondary;
  559. white-space: nowrap;
  560. }
  561. .filter-buttons {
  562. display: flex;
  563. gap: ios.$ios-spacing-xs;
  564. .filter-btn {
  565. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  566. border: 1px solid ios.$ios-border;
  567. background: ios.$ios-background;
  568. color: ios.$ios-text-secondary;
  569. border-radius: ios.$ios-radius-sm;
  570. font-size: ios.$ios-font-size-xs;
  571. cursor: pointer;
  572. transition: all 0.2s ease;
  573. &:hover {
  574. background: ios.$ios-background-secondary;
  575. }
  576. &.active {
  577. background: ios.$ios-primary;
  578. color: white;
  579. border-color: ios.$ios-primary;
  580. }
  581. &.pending.active {
  582. background: ios.$ios-warning;
  583. border-color: ios.$ios-warning;
  584. }
  585. &.processing.active {
  586. background: #1890ff;
  587. border-color: #1890ff;
  588. }
  589. &.resolved.active {
  590. background: ios.$ios-success;
  591. border-color: ios.$ios-success;
  592. }
  593. }
  594. }
  595. .filter-select {
  596. padding: ios.$ios-spacing-xs ios.$ios-spacing-sm;
  597. border: 1px solid ios.$ios-border;
  598. border-radius: ios.$ios-radius-sm;
  599. background: ios.$ios-background;
  600. color: ios.$ios-text-primary;
  601. font-size: ios.$ios-font-size-xs;
  602. min-width: 120px;
  603. &:focus {
  604. outline: none;
  605. border-color: ios.$ios-primary;
  606. }
  607. }
  608. }
  609. }
  610. }
  611. // 投诉列表样式
  612. .complaints-list {
  613. margin-top: 20px;
  614. .complaints-grid {
  615. display: grid;
  616. grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  617. gap: 16px;
  618. padding: 0;
  619. }
  620. .complaint-card-item {
  621. background: #ffffff;
  622. border-radius: 12px;
  623. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  624. border: 1px solid #e8e8e8;
  625. overflow: hidden;
  626. transition: all 0.3s ease;
  627. display: flex;
  628. flex-direction: column;
  629. &:hover {
  630. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  631. transform: translateY(-2px);
  632. }
  633. &.overdue {
  634. border-left: 4px solid #ff4757;
  635. .card-header {
  636. background: linear-gradient(135deg, #fff5f5 0%, #ffffff 100%);
  637. }
  638. }
  639. // 卡片头部
  640. .card-header {
  641. padding: 12px 16px;
  642. background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);
  643. border-bottom: 1px solid #e9ecef;
  644. display: flex;
  645. justify-content: space-between;
  646. align-items: center;
  647. .header-left {
  648. display: flex;
  649. align-items: center;
  650. gap: 12px;
  651. flex: 1;
  652. .type-tag {
  653. background: #007bff;
  654. color: white;
  655. padding: 4px 12px;
  656. border-radius: 16px;
  657. font-size: 12px;
  658. font-weight: 500;
  659. white-space: nowrap;
  660. &.quality {
  661. background: #dc3545;
  662. }
  663. &.service {
  664. background: #28a745;
  665. }
  666. &.delivery {
  667. background: #ffc107;
  668. color: #212529;
  669. }
  670. &.other {
  671. background: #6c757d;
  672. }
  673. }
  674. .priority-badge {
  675. color: white;
  676. padding: 4px 10px;
  677. border-radius: 12px;
  678. font-size: 11px;
  679. font-weight: 500;
  680. white-space: nowrap;
  681. }
  682. // 新增标识样式
  683. .source-badge {
  684. padding: 4px 10px;
  685. border-radius: 12px;
  686. font-size: 11px;
  687. font-weight: 500;
  688. white-space: nowrap;
  689. &.manual {
  690. background: #f0f0f0;
  691. color: #666;
  692. border: 1px solid #d9d9d9;
  693. }
  694. &.wechat_auto {
  695. background: #e6f7ff;
  696. color: #1890ff;
  697. border: 1px solid #91d5ff;
  698. }
  699. &.keyword_monitor {
  700. background: #fff2e8;
  701. color: #fa8c16;
  702. border: 1px solid #ffd591;
  703. }
  704. }
  705. .urgency-badge {
  706. color: white;
  707. padding: 4px 10px;
  708. border-radius: 12px;
  709. font-size: 11px;
  710. font-weight: 500;
  711. white-space: nowrap;
  712. }
  713. .auto-tag-badge {
  714. background: #f6ffed;
  715. color: #52c41a;
  716. border: 1px solid #b7eb8f;
  717. padding: 2px 8px;
  718. border-radius: 10px;
  719. font-size: 10px;
  720. font-weight: 500;
  721. white-space: nowrap;
  722. }
  723. .escalation-badge {
  724. background: #fff1f0;
  725. color: #ff4d4f;
  726. border: 1px solid #ffccc7;
  727. padding: 2px 8px;
  728. border-radius: 10px;
  729. font-size: 10px;
  730. font-weight: 500;
  731. white-space: nowrap;
  732. }
  733. }
  734. .header-right {
  735. display: flex;
  736. align-items: center;
  737. gap: 8px;
  738. .status-badge {
  739. padding: 4px 12px;
  740. border-radius: 12px;
  741. font-size: 12px;
  742. font-weight: 500;
  743. white-space: nowrap;
  744. &.pending {
  745. background: #fff3cd;
  746. color: #856404;
  747. border: 1px solid #ffeaa7;
  748. }
  749. &.processing {
  750. background: #d1ecf1;
  751. color: #0c5460;
  752. border: 1px solid #bee5eb;
  753. }
  754. &.resolved {
  755. background: #d4edda;
  756. color: #155724;
  757. border: 1px solid #c3e6cb;
  758. }
  759. }
  760. .overdue-badge {
  761. background: #ff4757;
  762. color: white;
  763. padding: 2px 8px;
  764. border-radius: 10px;
  765. font-size: 10px;
  766. font-weight: 600;
  767. animation: pulse 2s infinite;
  768. }
  769. .follow-up-badge {
  770. background: #fff2e8;
  771. color: #fa8c16;
  772. border: 1px solid #ffd591;
  773. padding: 2px 8px;
  774. border-radius: 10px;
  775. font-size: 10px;
  776. font-weight: 500;
  777. white-space: nowrap;
  778. }
  779. }
  780. }
  781. // 卡片主体
  782. .card-body {
  783. padding: 16px;
  784. flex: 1;
  785. display: flex;
  786. flex-direction: column;
  787. gap: 12px;
  788. .customer-info {
  789. display: flex;
  790. align-items: center;
  791. padding: 8px 12px;
  792. background: #f8f9fa;
  793. border-radius: 8px;
  794. border-left: 3px solid #007bff;
  795. .customer-label {
  796. font-weight: 500;
  797. color: #495057;
  798. margin-right: 8px;
  799. }
  800. .customer-name {
  801. color: #007bff;
  802. font-weight: 600;
  803. }
  804. }
  805. // 新增信息区域样式
  806. .wechat-info {
  807. padding: 8px 12px;
  808. background: #e6f7ff;
  809. border-radius: 8px;
  810. border-left: 3px solid #1890ff;
  811. .wechat-label {
  812. font-weight: 500;
  813. color: #1890ff;
  814. margin-right: 8px;
  815. }
  816. .wechat-group {
  817. color: #1890ff;
  818. font-weight: 600;
  819. }
  820. .matched-keywords {
  821. margin-top: 6px;
  822. display: flex;
  823. align-items: center;
  824. gap: 6px;
  825. flex-wrap: wrap;
  826. .keyword-label {
  827. font-size: 12px;
  828. color: #666;
  829. }
  830. .matched-keyword {
  831. background: #fff2e8;
  832. color: #fa8c16;
  833. border: 1px solid #ffd591;
  834. padding: 2px 6px;
  835. border-radius: 8px;
  836. font-size: 11px;
  837. font-weight: 500;
  838. }
  839. }
  840. }
  841. .assignment-info {
  842. padding: 8px 12px;
  843. background: #f6ffed;
  844. border-radius: 8px;
  845. border-left: 3px solid #52c41a;
  846. .assignment-label {
  847. font-weight: 500;
  848. color: #52c41a;
  849. margin-right: 8px;
  850. }
  851. .assignee-name {
  852. color: #52c41a;
  853. font-weight: 600;
  854. }
  855. }
  856. .tags-section {
  857. padding: 8px 12px;
  858. background: #fff7e6;
  859. border-radius: 8px;
  860. border-left: 3px solid #fa8c16;
  861. .tags-label {
  862. font-weight: 500;
  863. color: #fa8c16;
  864. margin-right: 8px;
  865. }
  866. .tags-list {
  867. display: flex;
  868. gap: 6px;
  869. flex-wrap: wrap;
  870. margin-top: 6px;
  871. .complaint-tag {
  872. background: #fff2e8;
  873. color: #fa8c16;
  874. border: 1px solid #ffd591;
  875. padding: 2px 8px;
  876. border-radius: 10px;
  877. font-size: 11px;
  878. font-weight: 500;
  879. }
  880. }
  881. }
  882. .complaint-description {
  883. h4 {
  884. margin: 0 0 8px 0;
  885. font-size: 14px;
  886. font-weight: 600;
  887. color: #343a40;
  888. }
  889. p {
  890. margin: 0;
  891. color: #6c757d;
  892. line-height: 1.5;
  893. font-size: 14px;
  894. }
  895. }
  896. .complaint-images {
  897. h5 {
  898. margin: 0 0 8px 0;
  899. font-size: 13px;
  900. font-weight: 600;
  901. color: #495057;
  902. }
  903. .images-grid {
  904. display: grid;
  905. grid-template-columns: repeat(auto-fill, minmax(60px, 1fr));
  906. gap: 6px;
  907. max-width: 100%;
  908. }
  909. .complaint-image {
  910. width: 100%;
  911. height: 60px;
  912. object-fit: cover;
  913. border-radius: 4px;
  914. border: 1px solid #dee2e6;
  915. cursor: pointer;
  916. transition: transform 0.2s ease;
  917. &:hover {
  918. transform: scale(1.05);
  919. }
  920. }
  921. }
  922. .time-section {
  923. background: #f8f9fa;
  924. padding: 12px;
  925. border-radius: 8px;
  926. border: 1px solid #e9ecef;
  927. .time-item {
  928. display: flex;
  929. justify-content: space-between;
  930. align-items: center;
  931. margin-bottom: 6px;
  932. &:last-child {
  933. margin-bottom: 0;
  934. }
  935. .time-label {
  936. font-size: 13px;
  937. color: #6c757d;
  938. font-weight: 500;
  939. }
  940. .time-value {
  941. font-size: 13px;
  942. color: #495057;
  943. font-weight: 600;
  944. }
  945. }
  946. }
  947. .handler-section {
  948. background: #e3f2fd;
  949. padding: 12px;
  950. border-radius: 8px;
  951. border-left: 3px solid #2196f3;
  952. h5 {
  953. margin: 0 0 8px 0;
  954. font-size: 13px;
  955. font-weight: 600;
  956. color: #1976d2;
  957. }
  958. .handler-comment {
  959. margin: 0 0 8px 0;
  960. color: #424242;
  961. font-size: 13px;
  962. line-height: 1.4;
  963. }
  964. .handler-info {
  965. display: flex;
  966. align-items: center;
  967. .handler-label {
  968. font-size: 12px;
  969. color: #757575;
  970. margin-right: 6px;
  971. }
  972. .handler-name {
  973. font-size: 12px;
  974. color: #1976d2;
  975. font-weight: 600;
  976. }
  977. }
  978. }
  979. .solution-section {
  980. background: #e8f5e8;
  981. padding: 12px;
  982. border-radius: 8px;
  983. border-left: 3px solid #4caf50;
  984. h5 {
  985. margin: 0 0 8px 0;
  986. font-size: 13px;
  987. font-weight: 600;
  988. color: #388e3c;
  989. }
  990. .solution-text {
  991. margin: 0;
  992. color: #424242;
  993. font-size: 13px;
  994. line-height: 1.4;
  995. }
  996. }
  997. }
  998. // 卡片底部
  999. .card-footer {
  1000. padding: 12px 16px;
  1001. background: #f8f9fa;
  1002. border-top: 1px solid #e9ecef;
  1003. display: flex;
  1004. flex-wrap: wrap;
  1005. justify-content: flex-start;
  1006. align-items: center;
  1007. gap: 8px;
  1008. .action-btn {
  1009. display: flex;
  1010. align-items: center;
  1011. gap: 6px;
  1012. padding: 6px 12px;
  1013. border: none;
  1014. border-radius: 6px;
  1015. font-size: 13px;
  1016. font-weight: 500;
  1017. cursor: pointer;
  1018. transition: all 0.2s ease;
  1019. white-space: nowrap;
  1020. flex: 0 1 auto;
  1021. max-width: 100%;
  1022. .btn-icon {
  1023. font-size: 14px;
  1024. }
  1025. &.process-btn {
  1026. background: #007bff;
  1027. color: white;
  1028. &:hover {
  1029. background: #0056b3;
  1030. transform: translateY(-1px);
  1031. }
  1032. }
  1033. &.complete-btn {
  1034. background: #28a745;
  1035. color: white;
  1036. &:hover {
  1037. background: #1e7e34;
  1038. transform: translateY(-1px);
  1039. }
  1040. }
  1041. &.detail-btn {
  1042. background: #6c757d;
  1043. color: white;
  1044. &:hover {
  1045. background: #545b62;
  1046. transform: translateY(-1px);
  1047. }
  1048. }
  1049. // 新增操作按钮样式
  1050. &.task-btn {
  1051. background: #fa8c16;
  1052. color: white;
  1053. &:hover {
  1054. background: #d46b08;
  1055. transform: translateY(-1px);
  1056. }
  1057. }
  1058. &.escalate-btn {
  1059. background: #ff4d4f;
  1060. color: white;
  1061. &:hover {
  1062. background: #cf1322;
  1063. transform: translateY(-1px);
  1064. }
  1065. }
  1066. &.assign-btn {
  1067. background: #52c41a;
  1068. color: white;
  1069. &:hover {
  1070. background: #389e0d;
  1071. transform: translateY(-1px);
  1072. }
  1073. }
  1074. &.tag-btn {
  1075. background: #722ed1;
  1076. color: white;
  1077. &:hover {
  1078. background: #531dab;
  1079. transform: translateY(-1px);
  1080. }
  1081. }
  1082. &.follow-up-btn {
  1083. background: #13c2c2;
  1084. color: white;
  1085. &:hover {
  1086. background: #08979c;
  1087. transform: translateY(-1px);
  1088. }
  1089. &.active {
  1090. background: #52c41a;
  1091. &:hover {
  1092. background: #389e0d;
  1093. }
  1094. }
  1095. }
  1096. }
  1097. .completed-status {
  1098. display: flex;
  1099. align-items: center;
  1100. gap: 6px;
  1101. color: #28a745;
  1102. font-weight: 600;
  1103. font-size: 13px;
  1104. .completed-icon {
  1105. background: #28a745;
  1106. color: white;
  1107. width: 18px;
  1108. height: 18px;
  1109. border-radius: 50%;
  1110. display: flex;
  1111. align-items: center;
  1112. justify-content: center;
  1113. font-size: 12px;
  1114. }
  1115. }
  1116. }
  1117. }
  1118. // 空状态样式
  1119. .empty-state {
  1120. text-align: center;
  1121. padding: 60px 20px;
  1122. color: #6c757d;
  1123. .empty-icon {
  1124. font-size: 48px;
  1125. margin-bottom: 16px;
  1126. opacity: 0.5;
  1127. }
  1128. .empty-title {
  1129. font-size: 18px;
  1130. font-weight: 600;
  1131. margin-bottom: 8px;
  1132. color: #495057;
  1133. }
  1134. .empty-description {
  1135. font-size: 14px;
  1136. color: #6c757d;
  1137. }
  1138. }
  1139. }
  1140. // 响应式设计 - 中等屏幕
  1141. @media (max-width: 1024px) {
  1142. .complaints-list {
  1143. .complaints-grid {
  1144. grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  1145. gap: 14px;
  1146. }
  1147. }
  1148. }
  1149. // 响应式设计 - 小屏幕
  1150. @media (max-width: 768px) {
  1151. .complaints-list {
  1152. .complaints-grid {
  1153. grid-template-columns: 1fr;
  1154. gap: 12px;
  1155. }
  1156. .complaint-card-item {
  1157. .card-header {
  1158. padding: 10px 12px;
  1159. flex-direction: column;
  1160. align-items: flex-start;
  1161. gap: 6px;
  1162. .header-left {
  1163. width: 100%;
  1164. }
  1165. .header-right {
  1166. width: 100%;
  1167. justify-content: flex-end;
  1168. }
  1169. }
  1170. .card-body {
  1171. padding: 12px;
  1172. gap: 10px;
  1173. }
  1174. .card-footer {
  1175. padding: 10px 12px;
  1176. flex-direction: column;
  1177. gap: 6px;
  1178. .action-btn {
  1179. width: 100%;
  1180. justify-content: center;
  1181. }
  1182. }
  1183. }
  1184. }
  1185. }
  1186. // 响应式设计 - 超小屏幕
  1187. @media (max-width: 480px) {
  1188. .complaints-list {
  1189. .complaints-grid {
  1190. gap: 10px;
  1191. }
  1192. .complaint-card-item {
  1193. .card-header {
  1194. padding: 8px 10px;
  1195. }
  1196. .card-body {
  1197. padding: 10px;
  1198. gap: 8px;
  1199. .complaint-images .images-grid {
  1200. grid-template-columns: repeat(auto-fill, minmax(50px, 1fr));
  1201. gap: 4px;
  1202. }
  1203. .complaint-image {
  1204. height: 50px;
  1205. }
  1206. }
  1207. .card-footer {
  1208. padding: 8px 10px;
  1209. }
  1210. }
  1211. }
  1212. }
  1213. // 动画效果
  1214. @keyframes pulse {
  1215. 0% {
  1216. opacity: 1;
  1217. }
  1218. 50% {
  1219. opacity: 0.5;
  1220. }
  1221. 100% {
  1222. opacity: 1;
  1223. }
  1224. }
  1225. // 响应式设计
  1226. @media (max-width: 768px) {
  1227. .stats-grid {
  1228. grid-template-columns: repeat(2, 1fr);
  1229. gap: ios.$ios-spacing-sm;
  1230. }
  1231. .priority-stats .priority-grid,
  1232. .type-stats .type-grid {
  1233. grid-template-columns: 1fr;
  1234. }
  1235. .filter-section {
  1236. .search-row .search-group {
  1237. flex-direction: column;
  1238. align-items: stretch;
  1239. }
  1240. .filter-row {
  1241. flex-direction: column;
  1242. align-items: stretch;
  1243. .filter-group {
  1244. flex-direction: column;
  1245. align-items: stretch;
  1246. .filter-buttons {
  1247. justify-content: center;
  1248. }
  1249. }
  1250. }
  1251. }
  1252. .complaints-list .complaint-item .complaint-header {
  1253. flex-direction: column;
  1254. gap: ios.$ios-spacing-sm;
  1255. }
  1256. }
  1257. }
  1258. // ==================== 弹窗样式 ====================
  1259. // 弹窗遮罩层
  1260. .modal-overlay {
  1261. position: fixed;
  1262. top: 0;
  1263. left: 0;
  1264. right: 0;
  1265. bottom: 0;
  1266. background: rgba(0, 0, 0, 0.5);
  1267. display: flex;
  1268. align-items: center;
  1269. justify-content: center;
  1270. z-index: 9999;
  1271. padding: 20px;
  1272. animation: fadeIn 0.2s ease-out;
  1273. }
  1274. // 弹窗内容
  1275. .modal-content {
  1276. background: white;
  1277. border-radius: 12px;
  1278. box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
  1279. max-width: 800px;
  1280. width: 100%;
  1281. max-height: 90vh;
  1282. display: flex;
  1283. flex-direction: column;
  1284. animation: slideUp 0.3s ease-out;
  1285. &.complaint-detail-modal {
  1286. max-width: 900px;
  1287. }
  1288. &.tag-modal {
  1289. max-width: 600px;
  1290. }
  1291. }
  1292. // 弹窗头部
  1293. .modal-header {
  1294. display: flex;
  1295. justify-content: space-between;
  1296. align-items: center;
  1297. padding: 20px 24px;
  1298. border-bottom: 1px solid #e8e8e8;
  1299. h3 {
  1300. margin: 0;
  1301. font-size: 20px;
  1302. font-weight: 600;
  1303. color: #333;
  1304. }
  1305. .close-btn {
  1306. background: none;
  1307. border: none;
  1308. font-size: 24px;
  1309. color: #999;
  1310. cursor: pointer;
  1311. padding: 0;
  1312. width: 32px;
  1313. height: 32px;
  1314. display: flex;
  1315. align-items: center;
  1316. justify-content: center;
  1317. border-radius: 50%;
  1318. transition: all 0.2s;
  1319. &:hover {
  1320. background: #f5f5f5;
  1321. color: #333;
  1322. }
  1323. }
  1324. }
  1325. // 弹窗主体
  1326. .modal-body {
  1327. padding: 24px;
  1328. overflow-y: auto;
  1329. flex: 1;
  1330. }
  1331. // 弹窗底部
  1332. .modal-footer {
  1333. display: flex;
  1334. justify-content: flex-end;
  1335. gap: 12px;
  1336. padding: 16px 24px;
  1337. border-top: 1px solid #e8e8e8;
  1338. .btn {
  1339. padding: 8px 20px;
  1340. border-radius: 6px;
  1341. border: none;
  1342. font-size: 14px;
  1343. font-weight: 500;
  1344. cursor: pointer;
  1345. transition: all 0.2s;
  1346. &.btn-secondary {
  1347. background: #f5f5f5;
  1348. color: #666;
  1349. &:hover {
  1350. background: #e8e8e8;
  1351. }
  1352. }
  1353. &.btn-primary {
  1354. background: #1890ff;
  1355. color: white;
  1356. &:hover {
  1357. background: #40a9ff;
  1358. }
  1359. i {
  1360. margin-right: 6px;
  1361. }
  1362. }
  1363. }
  1364. }
  1365. // ==================== 投诉详情弹窗样式 ====================
  1366. .complaint-detail-modal {
  1367. .detail-section {
  1368. margin-bottom: 24px;
  1369. &:last-child {
  1370. margin-bottom: 0;
  1371. }
  1372. .section-title {
  1373. font-size: 16px;
  1374. font-weight: 600;
  1375. color: #333;
  1376. margin: 0 0 16px 0;
  1377. padding-bottom: 8px;
  1378. border-bottom: 2px solid #f0f0f0;
  1379. }
  1380. }
  1381. .info-grid {
  1382. display: grid;
  1383. grid-template-columns: repeat(2, 1fr);
  1384. gap: 16px;
  1385. .info-item {
  1386. display: flex;
  1387. align-items: flex-start;
  1388. gap: 8px;
  1389. &.full-width {
  1390. grid-column: 1 / -1;
  1391. }
  1392. .label {
  1393. font-weight: 500;
  1394. color: #666;
  1395. white-space: nowrap;
  1396. min-width: 80px;
  1397. }
  1398. .value {
  1399. color: #333;
  1400. flex: 1;
  1401. &.warning {
  1402. color: #ff4d4f;
  1403. font-weight: 600;
  1404. }
  1405. &.type-badge,
  1406. &.priority-badge,
  1407. &.status-badge,
  1408. &.source-badge {
  1409. padding: 4px 12px;
  1410. border-radius: 12px;
  1411. font-size: 12px;
  1412. font-weight: 500;
  1413. }
  1414. &.type-badge {
  1415. background: #e6f7ff;
  1416. color: #1890ff;
  1417. }
  1418. &.priority-badge {
  1419. color: white;
  1420. }
  1421. &.status-badge {
  1422. &.pending {
  1423. background: #fff7e6;
  1424. color: #fa8c16;
  1425. }
  1426. &.processing {
  1427. background: #e6f7ff;
  1428. color: #1890ff;
  1429. }
  1430. &.resolved {
  1431. background: #f6ffed;
  1432. color: #52c41a;
  1433. }
  1434. }
  1435. &.source-badge {
  1436. background: #f0f0f0;
  1437. color: #666;
  1438. }
  1439. }
  1440. }
  1441. }
  1442. .complaint-content-box,
  1443. .comment-box,
  1444. .solution-box {
  1445. background: #f9f9f9;
  1446. padding: 16px;
  1447. border-radius: 8px;
  1448. border-left: 4px solid #1890ff;
  1449. p {
  1450. margin: 0;
  1451. line-height: 1.6;
  1452. color: #333;
  1453. }
  1454. }
  1455. .comment-box {
  1456. border-left-color: #52c41a;
  1457. .comment-author {
  1458. margin-top: 12px;
  1459. text-align: right;
  1460. color: #999;
  1461. font-size: 14px;
  1462. font-style: italic;
  1463. }
  1464. }
  1465. .solution-box {
  1466. border-left-color: #52c41a;
  1467. background: #f6ffed;
  1468. }
  1469. .keyword-tags {
  1470. display: flex;
  1471. flex-wrap: wrap;
  1472. gap: 8px;
  1473. .keyword-tag {
  1474. background: #fff1f0;
  1475. color: #ff4d4f;
  1476. padding: 4px 10px;
  1477. border-radius: 12px;
  1478. font-size: 12px;
  1479. font-weight: 500;
  1480. }
  1481. }
  1482. .tags-display {
  1483. display: flex;
  1484. flex-wrap: wrap;
  1485. gap: 8px;
  1486. .tag-item {
  1487. background: #f0f0f0;
  1488. color: #333;
  1489. padding: 6px 12px;
  1490. border-radius: 16px;
  1491. font-size: 13px;
  1492. display: flex;
  1493. align-items: center;
  1494. gap: 6px;
  1495. .tag-remove {
  1496. background: none;
  1497. border: none;
  1498. color: #999;
  1499. cursor: pointer;
  1500. padding: 0;
  1501. width: 16px;
  1502. height: 16px;
  1503. display: flex;
  1504. align-items: center;
  1505. justify-content: center;
  1506. border-radius: 50%;
  1507. font-size: 16px;
  1508. line-height: 1;
  1509. transition: all 0.2s;
  1510. &:hover {
  1511. background: #d9d9d9;
  1512. color: #333;
  1513. }
  1514. }
  1515. }
  1516. }
  1517. .images-gallery {
  1518. display: grid;
  1519. grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  1520. gap: 12px;
  1521. .gallery-image {
  1522. width: 100%;
  1523. height: 150px;
  1524. object-fit: cover;
  1525. border-radius: 8px;
  1526. cursor: pointer;
  1527. transition: transform 0.2s;
  1528. &:hover {
  1529. transform: scale(1.05);
  1530. }
  1531. }
  1532. }
  1533. }
  1534. // ==================== 添加标签弹窗样式 ====================
  1535. .tag-modal {
  1536. .current-tags-section,
  1537. .preset-tags-section,
  1538. .custom-tag-section {
  1539. margin-bottom: 24px;
  1540. &:last-child {
  1541. margin-bottom: 0;
  1542. }
  1543. .section-title {
  1544. font-size: 14px;
  1545. font-weight: 600;
  1546. color: #333;
  1547. margin: 0 0 12px 0;
  1548. }
  1549. }
  1550. .current-tags {
  1551. display: flex;
  1552. flex-wrap: wrap;
  1553. gap: 8px;
  1554. padding: 12px;
  1555. background: #f9f9f9;
  1556. border-radius: 8px;
  1557. min-height: 50px;
  1558. .tag-item {
  1559. background: #1890ff;
  1560. color: white;
  1561. padding: 6px 12px;
  1562. border-radius: 16px;
  1563. font-size: 13px;
  1564. display: flex;
  1565. align-items: center;
  1566. gap: 6px;
  1567. .tag-remove {
  1568. background: rgba(255, 255, 255, 0.3);
  1569. border: none;
  1570. color: white;
  1571. cursor: pointer;
  1572. padding: 0;
  1573. width: 16px;
  1574. height: 16px;
  1575. display: flex;
  1576. align-items: center;
  1577. justify-content: center;
  1578. border-radius: 50%;
  1579. font-size: 16px;
  1580. line-height: 1;
  1581. transition: all 0.2s;
  1582. &:hover {
  1583. background: rgba(255, 255, 255, 0.5);
  1584. }
  1585. }
  1586. }
  1587. }
  1588. .preset-tags-grid {
  1589. display: grid;
  1590. grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  1591. gap: 8px;
  1592. .preset-tag-btn {
  1593. background: #f5f5f5;
  1594. border: 2px solid transparent;
  1595. color: #666;
  1596. padding: 8px 12px;
  1597. border-radius: 6px;
  1598. font-size: 13px;
  1599. cursor: pointer;
  1600. transition: all 0.2s;
  1601. &:hover {
  1602. background: #e8e8e8;
  1603. border-color: #d9d9d9;
  1604. }
  1605. &.selected {
  1606. background: #e6f7ff;
  1607. border-color: #1890ff;
  1608. color: #1890ff;
  1609. font-weight: 500;
  1610. }
  1611. }
  1612. }
  1613. .custom-tag-input-group {
  1614. display: flex;
  1615. gap: 8px;
  1616. .custom-tag-input {
  1617. flex: 1;
  1618. padding: 8px 12px;
  1619. border: 1px solid #d9d9d9;
  1620. border-radius: 6px;
  1621. font-size: 14px;
  1622. transition: all 0.2s;
  1623. &:focus {
  1624. outline: none;
  1625. border-color: #1890ff;
  1626. box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.1);
  1627. }
  1628. &::placeholder {
  1629. color: #bfbfbf;
  1630. }
  1631. }
  1632. }
  1633. }
  1634. // ==================== 动画 ====================
  1635. @keyframes fadeIn {
  1636. from {
  1637. opacity: 0;
  1638. }
  1639. to {
  1640. opacity: 1;
  1641. }
  1642. }
  1643. @keyframes slideUp {
  1644. from {
  1645. transform: translateY(20px);
  1646. opacity: 0;
  1647. }
  1648. to {
  1649. transform: translateY(0);
  1650. opacity: 1;
  1651. }
  1652. }
  1653. // ==================== 响应式 ====================
  1654. @media (max-width: 768px) {
  1655. .modal-content {
  1656. max-width: 100%;
  1657. max-height: 100vh;
  1658. border-radius: 0;
  1659. &.complaint-detail-modal,
  1660. &.tag-modal {
  1661. max-width: 100%;
  1662. }
  1663. }
  1664. .complaint-detail-modal {
  1665. .info-grid {
  1666. grid-template-columns: 1fr;
  1667. }
  1668. .images-gallery {
  1669. grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  1670. }
  1671. }
  1672. .tag-modal {
  1673. .preset-tags-grid {
  1674. grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  1675. }
  1676. }
  1677. }