demo-protocol-view-a.html 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240
  1. <!doctype html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>采集协议单查看弹窗 — 方案A:卡片分区+背景色块</title>
  7. <link rel="preconnect" href="https://fonts.googleapis.com" />
  8. <link
  9. href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&display=swap"
  10. rel="stylesheet"
  11. />
  12. <style>
  13. /* ===== Reset & Base ===== */
  14. *,
  15. *::before,
  16. *::after {
  17. margin: 0;
  18. padding: 0;
  19. box-sizing: border-box;
  20. }
  21. body {
  22. font-family:
  23. 'Noto Sans SC',
  24. -apple-system,
  25. BlinkMacSystemFont,
  26. 'Segoe UI',
  27. sans-serif;
  28. background: #0f172a;
  29. display: flex;
  30. align-items: center;
  31. justify-content: center;
  32. min-height: 100vh;
  33. color: #1e293b;
  34. -webkit-font-smoothing: antialiased;
  35. }
  36. /* ===== Modal Overlay ===== */
  37. .overlay {
  38. position: fixed;
  39. inset: 0;
  40. background: rgba(15, 23, 42, 0.6);
  41. backdrop-filter: blur(4px);
  42. display: flex;
  43. align-items: center;
  44. justify-content: center;
  45. z-index: 1000;
  46. animation: overlayIn 0.25s ease-out;
  47. }
  48. @keyframes overlayIn {
  49. from {
  50. opacity: 0;
  51. }
  52. to {
  53. opacity: 1;
  54. }
  55. }
  56. /* ===== Dialog Shell ===== */
  57. .dialog {
  58. width: 1200px;
  59. max-height: 85vh;
  60. background: #ffffff;
  61. border-radius: 16px;
  62. display: flex;
  63. flex-direction: column;
  64. box-shadow:
  65. 0 25px 50px -12px rgba(0, 0, 0, 0.25),
  66. 0 0 0 1px rgba(255, 255, 255, 0.05);
  67. animation: dialogIn 0.3s cubic-bezier(0.16, 1, 0.3, 1);
  68. overflow: hidden;
  69. }
  70. @keyframes dialogIn {
  71. from {
  72. opacity: 0;
  73. transform: translateY(24px) scale(0.97);
  74. }
  75. to {
  76. opacity: 1;
  77. transform: translateY(0) scale(1);
  78. }
  79. }
  80. /* ===== Dialog Header ===== */
  81. .dialog-header {
  82. display: flex;
  83. align-items: center;
  84. justify-content: space-between;
  85. padding: 20px 28px;
  86. border-bottom: 1px solid #e2e8f0;
  87. background: linear-gradient(135deg, #ecfdf5 0%, #ffffff 100%);
  88. flex-shrink: 0;
  89. }
  90. .dialog-title {
  91. font-size: 18px;
  92. font-weight: 600;
  93. color: #1e293b;
  94. display: flex;
  95. align-items: center;
  96. gap: 10px;
  97. }
  98. .dialog-title::before {
  99. content: '';
  100. display: inline-block;
  101. width: 4px;
  102. height: 20px;
  103. background: linear-gradient(180deg, #10b981, #059669);
  104. border-radius: 2px;
  105. }
  106. .dialog-title .protocol-id {
  107. font-weight: 400;
  108. color: #64748b;
  109. font-size: 15px;
  110. }
  111. .close-btn {
  112. width: 36px;
  113. height: 36px;
  114. border: none;
  115. background: #f1f5f9;
  116. border-radius: 10px;
  117. font-size: 20px;
  118. color: #64748b;
  119. cursor: pointer;
  120. display: flex;
  121. align-items: center;
  122. justify-content: center;
  123. transition: all 0.2s;
  124. }
  125. .close-btn:hover {
  126. background: #fee2e2;
  127. color: #ef4444;
  128. transform: rotate(90deg);
  129. }
  130. /* ===== Dialog Body (scrollable) ===== */
  131. .dialog-body {
  132. flex: 1;
  133. overflow-y: auto;
  134. padding: 0;
  135. scroll-behavior: smooth;
  136. }
  137. .dialog-body::-webkit-scrollbar {
  138. width: 6px;
  139. }
  140. .dialog-body::-webkit-scrollbar-track {
  141. background: transparent;
  142. }
  143. .dialog-body::-webkit-scrollbar-thumb {
  144. background: #cbd5e1;
  145. border-radius: 3px;
  146. }
  147. .dialog-body::-webkit-scrollbar-thumb:hover {
  148. background: #94a3b8;
  149. }
  150. /* ===== Sticky Tab Bar ===== */
  151. .tab-bar {
  152. position: sticky;
  153. top: 0;
  154. z-index: 10;
  155. background: #ffffff;
  156. padding: 16px 28px 0;
  157. display: flex;
  158. gap: 6px;
  159. border-bottom: 1px solid #f1f5f9;
  160. }
  161. .tab-bar::after {
  162. content: '';
  163. position: absolute;
  164. bottom: 0;
  165. left: 28px;
  166. right: 28px;
  167. height: 1px;
  168. background: #e2e8f0;
  169. }
  170. .tab-pill {
  171. padding: 8px 18px;
  172. border-radius: 8px 8px 0 0;
  173. font-size: 13.5px;
  174. font-weight: 500;
  175. color: #64748b;
  176. cursor: pointer;
  177. transition: all 0.2s;
  178. position: relative;
  179. background: transparent;
  180. border: 1px solid transparent;
  181. border-bottom: none;
  182. }
  183. .tab-pill:hover {
  184. color: #1e293b;
  185. background: #f8fafc;
  186. }
  187. .tab-pill.active {
  188. background: #ffffff;
  189. color: #10b981;
  190. font-weight: 600;
  191. border-color: #e2e8f0;
  192. box-shadow: 0 -2px 8px rgba(16, 185, 129, 0.08);
  193. }
  194. .tab-pill.active::after {
  195. content: '';
  196. position: absolute;
  197. bottom: -1px;
  198. left: 0;
  199. right: 0;
  200. height: 2px;
  201. background: #ffffff;
  202. }
  203. /* ===== Content Area ===== */
  204. .content-area {
  205. padding: 24px 28px 32px;
  206. }
  207. /* ===== Section ===== */
  208. .section {
  209. margin-bottom: 28px;
  210. }
  211. .section:last-child {
  212. margin-bottom: 0;
  213. }
  214. .section-header {
  215. display: flex;
  216. align-items: center;
  217. gap: 10px;
  218. margin-bottom: 18px;
  219. padding-left: 14px;
  220. position: relative;
  221. }
  222. .section-header::before {
  223. content: '';
  224. position: absolute;
  225. left: 0;
  226. top: 50%;
  227. transform: translateY(-50%);
  228. width: 3px;
  229. height: 18px;
  230. background: linear-gradient(180deg, #10b981, #059669);
  231. border-radius: 2px;
  232. }
  233. .section-title {
  234. font-size: 15px;
  235. font-weight: 600;
  236. color: #1e293b;
  237. }
  238. /* ===== KV Grid ===== */
  239. .kv-grid {
  240. display: grid;
  241. grid-template-columns: repeat(3, 1fr);
  242. gap: 0;
  243. }
  244. .kv-item {
  245. padding: 12px 16px;
  246. display: flex;
  247. flex-direction: column;
  248. gap: 4px;
  249. border-bottom: 1px solid #f1f5f9;
  250. }
  251. .kv-item:nth-child(3n + 1) {
  252. padding-left: 0;
  253. }
  254. .kv-item:nth-child(3n) {
  255. padding-right: 0;
  256. }
  257. .kv-item.span-full {
  258. grid-column: 1 / -1;
  259. padding-left: 0;
  260. padding-right: 0;
  261. }
  262. .kv-label {
  263. font-size: 12.5px;
  264. color: #94a3b8;
  265. font-weight: 400;
  266. line-height: 1;
  267. }
  268. .kv-value {
  269. font-size: 14px;
  270. color: #1e293b;
  271. font-weight: 500;
  272. line-height: 1.5;
  273. }
  274. .kv-value.empty {
  275. color: #cbd5e1;
  276. }
  277. /* ===== Status Badge ===== */
  278. .badge {
  279. display: inline-flex;
  280. align-items: center;
  281. gap: 5px;
  282. padding: 3px 12px;
  283. border-radius: 20px;
  284. font-size: 12.5px;
  285. font-weight: 500;
  286. }
  287. .badge-green {
  288. background: #ecfdf5;
  289. color: #059669;
  290. }
  291. .badge-green::before {
  292. content: '';
  293. width: 6px;
  294. height: 6px;
  295. border-radius: 50%;
  296. background: #10b981;
  297. animation: pulse 2s infinite;
  298. }
  299. @keyframes pulse {
  300. 0%,
  301. 100% {
  302. opacity: 1;
  303. }
  304. 50% {
  305. opacity: 0.4;
  306. }
  307. }
  308. .badge-blue {
  309. background: #eff6ff;
  310. color: #2563eb;
  311. }
  312. .badge-orange {
  313. background: #fff7ed;
  314. color: #ea580c;
  315. }
  316. /* ===== Sub-card (Card-in-Card) ===== */
  317. .sub-card {
  318. border-radius: 12px;
  319. padding: 20px;
  320. margin-bottom: 14px;
  321. transition: all 0.25s ease;
  322. position: relative;
  323. overflow: hidden;
  324. }
  325. .sub-card::before {
  326. content: '';
  327. position: absolute;
  328. top: 0;
  329. left: 0;
  330. right: 0;
  331. height: 3px;
  332. border-radius: 12px 12px 0 0;
  333. opacity: 0;
  334. transition: opacity 0.25s;
  335. }
  336. .sub-card:hover::before {
  337. opacity: 1;
  338. }
  339. .sub-card:hover {
  340. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
  341. transform: translateY(-1px);
  342. }
  343. .sub-card-green {
  344. background: #f0fdf4;
  345. border: 1px solid #dcfce7;
  346. }
  347. .sub-card-green::before {
  348. background: linear-gradient(90deg, #10b981, #34d399);
  349. }
  350. .sub-card-gray {
  351. background: #f8fafc;
  352. border: 1px solid #f1f5f9;
  353. }
  354. .sub-card-gray::before {
  355. background: linear-gradient(90deg, #64748b, #94a3b8);
  356. }
  357. .sub-card .card-title {
  358. font-size: 13.5px;
  359. font-weight: 600;
  360. color: #475569;
  361. margin-bottom: 14px;
  362. display: flex;
  363. align-items: center;
  364. gap: 7px;
  365. }
  366. .card-title-icon {
  367. width: 22px;
  368. height: 22px;
  369. border-radius: 6px;
  370. display: inline-flex;
  371. align-items: center;
  372. justify-content: center;
  373. font-size: 12px;
  374. color: #ffffff;
  375. flex-shrink: 0;
  376. }
  377. .icon-mom {
  378. background: linear-gradient(135deg, #f472b6, #ec4899);
  379. }
  380. .icon-dad {
  381. background: linear-gradient(135deg, #60a5fa, #3b82f6);
  382. }
  383. .icon-baby {
  384. background: linear-gradient(135deg, #fbbf24, #f59e0b);
  385. }
  386. /* ===== Wrap Card (for sections with bg) ===== */
  387. .wrap-card {
  388. background: #f8fafc;
  389. border: 1px solid #f1f5f9;
  390. border-radius: 12px;
  391. padding: 20px;
  392. }
  393. /* ===== Attachment Thumbnails ===== */
  394. .attachment-row {
  395. display: flex;
  396. gap: 12px;
  397. flex-wrap: wrap;
  398. margin-top: 14px;
  399. padding-top: 14px;
  400. border-top: 1px solid #f1f5f9;
  401. }
  402. .attachment-label {
  403. font-size: 12.5px;
  404. color: #94a3b8;
  405. margin-bottom: 8px;
  406. }
  407. .att-card {
  408. width: 100px;
  409. height: 80px;
  410. border-radius: 8px;
  411. border: 1px solid #e2e8f0;
  412. display: flex;
  413. flex-direction: column;
  414. align-items: center;
  415. justify-content: center;
  416. gap: 6px;
  417. background: #ffffff;
  418. cursor: pointer;
  419. transition: all 0.2s;
  420. position: relative;
  421. overflow: hidden;
  422. }
  423. .att-card:hover {
  424. border-color: #10b981;
  425. box-shadow: 0 2px 8px rgba(16, 185, 129, 0.15);
  426. transform: translateY(-2px);
  427. }
  428. .att-icon {
  429. font-size: 24px;
  430. line-height: 1;
  431. }
  432. .att-name {
  433. font-size: 10px;
  434. color: #64748b;
  435. text-align: center;
  436. line-height: 1.2;
  437. max-width: 88px;
  438. overflow: hidden;
  439. text-overflow: ellipsis;
  440. white-space: nowrap;
  441. }
  442. /* ===== Table ===== */
  443. .data-table {
  444. width: 100%;
  445. border-collapse: separate;
  446. border-spacing: 0;
  447. font-size: 13.5px;
  448. }
  449. .data-table thead th {
  450. background: #f8fafc;
  451. color: #64748b;
  452. font-weight: 500;
  453. font-size: 12.5px;
  454. padding: 10px 14px;
  455. text-align: left;
  456. border-bottom: 1px solid #e2e8f0;
  457. white-space: nowrap;
  458. }
  459. .data-table thead th:first-child {
  460. border-radius: 8px 0 0 0;
  461. }
  462. .data-table thead th:last-child {
  463. border-radius: 0 8px 0 0;
  464. }
  465. .data-table tbody td {
  466. padding: 12px 14px;
  467. border-bottom: 1px solid #f1f5f9;
  468. color: #1e293b;
  469. vertical-align: middle;
  470. }
  471. .data-table tbody tr {
  472. transition: background 0.15s;
  473. }
  474. .data-table tbody tr:hover {
  475. background: #f0fdf4;
  476. }
  477. .data-table tbody tr:last-child td {
  478. border-bottom: none;
  479. }
  480. .table-wrap {
  481. border: 1px solid #e2e8f0;
  482. border-radius: 10px;
  483. overflow: hidden;
  484. }
  485. /* ===== Payment Section ===== */
  486. .payment-summary {
  487. display: grid;
  488. grid-template-columns: repeat(4, 1fr);
  489. gap: 16px;
  490. margin-bottom: 18px;
  491. }
  492. .pay-stat {
  493. background: #ffffff;
  494. border: 1px solid #e2e8f0;
  495. border-radius: 10px;
  496. padding: 16px;
  497. text-align: center;
  498. transition: all 0.2s;
  499. }
  500. .pay-stat:hover {
  501. border-color: #10b981;
  502. box-shadow: 0 2px 8px rgba(16, 185, 129, 0.1);
  503. }
  504. .pay-stat-label {
  505. font-size: 12px;
  506. color: #94a3b8;
  507. margin-bottom: 6px;
  508. }
  509. .pay-stat-value {
  510. font-size: 18px;
  511. font-weight: 600;
  512. color: #1e293b;
  513. }
  514. .pay-stat-value.highlight {
  515. color: #10b981;
  516. }
  517. .payment-detail-card {
  518. background: #ffffff;
  519. border: 1px solid #e2e8f0;
  520. border-radius: 10px;
  521. padding: 18px 20px;
  522. margin-bottom: 18px;
  523. }
  524. .payment-detail-title {
  525. font-size: 13px;
  526. font-weight: 600;
  527. color: #475569;
  528. margin-bottom: 14px;
  529. display: flex;
  530. align-items: center;
  531. gap: 6px;
  532. }
  533. .payment-detail-grid {
  534. display: grid;
  535. grid-template-columns: repeat(5, 1fr);
  536. gap: 0;
  537. }
  538. .payment-detail-grid .kv-item {
  539. border-bottom: none;
  540. padding: 6px 12px;
  541. }
  542. .payment-detail-grid .kv-item:nth-child(5n + 1) {
  543. padding-left: 0;
  544. }
  545. .payment-detail-grid .kv-item:nth-child(5n) {
  546. padding-right: 0;
  547. }
  548. /* ===== Timeline / Flow Track ===== */
  549. .flow-track {
  550. display: flex;
  551. align-items: center;
  552. justify-content: center;
  553. gap: 0;
  554. padding: 20px 40px;
  555. position: relative;
  556. }
  557. .flow-step {
  558. display: flex;
  559. flex-direction: column;
  560. align-items: center;
  561. gap: 8px;
  562. position: relative;
  563. z-index: 1;
  564. flex: 0 0 auto;
  565. }
  566. .flow-circle {
  567. width: 36px;
  568. height: 36px;
  569. border-radius: 50%;
  570. display: flex;
  571. align-items: center;
  572. justify-content: center;
  573. font-size: 14px;
  574. font-weight: 600;
  575. transition: all 0.3s;
  576. }
  577. .flow-circle.done {
  578. background: linear-gradient(135deg, #10b981, #059669);
  579. color: #ffffff;
  580. box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
  581. }
  582. .flow-circle.current {
  583. background: #ffffff;
  584. border: 2px solid #10b981;
  585. color: #10b981;
  586. box-shadow: 0 2px 8px rgba(16, 185, 129, 0.15);
  587. animation: currentPulse 2s infinite;
  588. }
  589. @keyframes currentPulse {
  590. 0%,
  591. 100% {
  592. box-shadow: 0 2px 8px rgba(16, 185, 129, 0.15);
  593. }
  594. 50% {
  595. box-shadow: 0 2px 16px rgba(16, 185, 129, 0.3);
  596. }
  597. }
  598. .flow-circle.pending {
  599. background: #f8fafc;
  600. border: 2px solid #e2e8f0;
  601. color: #94a3b8;
  602. }
  603. .flow-label {
  604. font-size: 12.5px;
  605. color: #64748b;
  606. font-weight: 500;
  607. white-space: nowrap;
  608. }
  609. .flow-label.done {
  610. color: #059669;
  611. }
  612. .flow-label.current {
  613. color: #10b981;
  614. font-weight: 600;
  615. }
  616. .flow-connector {
  617. width: 80px;
  618. height: 2px;
  619. background: #e2e8f0;
  620. position: relative;
  621. flex-shrink: 0;
  622. }
  623. .flow-connector.done {
  624. background: linear-gradient(90deg, #10b981, #34d399);
  625. }
  626. .flow-connector.done::after {
  627. content: '';
  628. position: absolute;
  629. right: -3px;
  630. top: -3px;
  631. width: 8px;
  632. height: 8px;
  633. border-top: 2px solid #10b981;
  634. border-right: 2px solid #10b981;
  635. transform: rotate(45deg);
  636. }
  637. /* ===== Dialog Footer ===== */
  638. .dialog-footer {
  639. display: flex;
  640. align-items: center;
  641. justify-content: flex-end;
  642. padding: 16px 28px;
  643. border-top: 1px solid #e2e8f0;
  644. background: #fafafa;
  645. flex-shrink: 0;
  646. }
  647. .btn-close {
  648. padding: 9px 32px;
  649. border: 1px solid #e2e8f0;
  650. background: #ffffff;
  651. color: #475569;
  652. border-radius: 8px;
  653. font-size: 14px;
  654. font-weight: 500;
  655. cursor: pointer;
  656. transition: all 0.2s;
  657. font-family: inherit;
  658. }
  659. .btn-close:hover {
  660. border-color: #10b981;
  661. color: #10b981;
  662. box-shadow: 0 2px 8px rgba(16, 185, 129, 0.1);
  663. }
  664. /* ===== Remark Block ===== */
  665. .remark-block {
  666. background: #fffbeb;
  667. border: 1px solid #fef3c7;
  668. border-radius: 8px;
  669. padding: 12px 16px;
  670. margin-top: 14px;
  671. font-size: 13px;
  672. color: #92400e;
  673. line-height: 1.6;
  674. display: flex;
  675. align-items: flex-start;
  676. gap: 8px;
  677. }
  678. .remark-icon {
  679. font-size: 15px;
  680. flex-shrink: 0;
  681. margin-top: 1px;
  682. }
  683. /* ===== Utility ===== */
  684. .price {
  685. color: #059669;
  686. font-weight: 600;
  687. }
  688. .muted {
  689. color: #94a3b8;
  690. }
  691. </style>
  692. </head>
  693. <body>
  694. <div class="overlay">
  695. <div class="dialog">
  696. <!-- Header -->
  697. <div class="dialog-header">
  698. <div class="dialog-title">
  699. 查看协议单
  700. <span class="protocol-id">P2025-0501-001</span>
  701. </div>
  702. <button class="close-btn" title="关闭">×</button>
  703. </div>
  704. <!-- Body -->
  705. <div class="dialog-body">
  706. <!-- Sticky Tab Bar -->
  707. <div class="tab-bar">
  708. <div class="tab-pill active">基本信息</div>
  709. <div class="tab-pill">客户信息</div>
  710. <div class="tab-pill">采集信息</div>
  711. <div class="tab-pill">样本及运输信息</div>
  712. <div class="tab-pill">缴费信息</div>
  713. <div class="tab-pill">审核记录</div>
  714. </div>
  715. <div class="content-area">
  716. <!-- ===================== 基本信息 ===================== -->
  717. <div class="section">
  718. <div class="section-header">
  719. <span class="section-title">基本信息</span>
  720. </div>
  721. <div class="kv-grid">
  722. <div class="kv-item">
  723. <span class="kv-label">协议号</span>
  724. <span class="kv-value">P2025-0501-001</span>
  725. </div>
  726. <div class="kv-item">
  727. <span class="kv-label">协议状态</span>
  728. <span class="kv-value"><span class="badge badge-green">生效中</span></span>
  729. </div>
  730. <div class="kv-item">
  731. <span class="kv-label">登记日期</span>
  732. <span class="kv-value">2025-05-10</span>
  733. </div>
  734. <div class="kv-item">
  735. <span class="kv-label">采集专员</span>
  736. <span class="kv-value">李明</span>
  737. </div>
  738. <div class="kv-item">
  739. <span class="kv-label">创建时间</span>
  740. <span class="kv-value">2025-05-10 14:30:22</span>
  741. </div>
  742. <div class="kv-item">
  743. <span class="kv-label">协议附件</span>
  744. <span class="kv-value">
  745. <div
  746. class="attachment-row"
  747. style="margin-top: 0; padding-top: 0; border-top: none"
  748. >
  749. <div class="att-card">
  750. <span class="att-icon">🖼️</span>
  751. <span class="att-name">身份证正面.jpg</span>
  752. </div>
  753. <div class="att-card">
  754. <span class="att-icon">🖼️</span>
  755. <span class="att-name">身份证反面.jpg</span>
  756. </div>
  757. <div class="att-card">
  758. <span class="att-icon">📄</span>
  759. <span class="att-name">协议书.pdf</span>
  760. </div>
  761. </div>
  762. </span>
  763. </div>
  764. <div class="kv-item span-full">
  765. <span class="kv-label">备注</span>
  766. <div class="remark-block">
  767. <span class="remark-icon">💡</span>
  768. <span>客户要求加急处理,已与采集专员沟通确认</span>
  769. </div>
  770. </div>
  771. </div>
  772. </div>
  773. <!-- ===================== 客户信息 ===================== -->
  774. <div class="section">
  775. <div class="section-header">
  776. <span class="section-title">客户信息</span>
  777. </div>
  778. <!-- 母亲信息 -->
  779. <div class="sub-card sub-card-green">
  780. <div class="card-title">
  781. <span class="card-title-icon icon-mom">♀</span>
  782. 母亲信息
  783. </div>
  784. <div class="kv-grid">
  785. <div class="kv-item">
  786. <span class="kv-label">关联客户</span>
  787. <span class="kv-value empty">—</span>
  788. </div>
  789. <div class="kv-item">
  790. <span class="kv-label">母亲姓名</span>
  791. <span class="kv-value">王美丽</span>
  792. </div>
  793. <div class="kv-item">
  794. <span class="kv-label">母亲联系电话</span>
  795. <span class="kv-value">138****5678</span>
  796. </div>
  797. <div class="kv-item">
  798. <span class="kv-label">母亲身份证号</span>
  799. <span class="kv-value">3401**********1234</span>
  800. </div>
  801. <div class="kv-item">
  802. <span class="kv-label">母亲出生年月</span>
  803. <span class="kv-value">1992-06</span>
  804. </div>
  805. <div class="kv-item">
  806. <span class="kv-label">母亲民族</span>
  807. <span class="kv-value">汉族</span>
  808. </div>
  809. <div class="kv-item span-full">
  810. <span class="kv-label">母亲家庭住址</span>
  811. <span class="kv-value">安徽省合肥市蜀山区望江西路XX小区X栋X单元XXX室</span>
  812. </div>
  813. </div>
  814. </div>
  815. <!-- 父亲信息 -->
  816. <div class="sub-card sub-card-gray">
  817. <div class="card-title">
  818. <span class="card-title-icon icon-dad">♂</span>
  819. 父亲信息
  820. </div>
  821. <div class="kv-grid">
  822. <div class="kv-item">
  823. <span class="kv-label">父亲姓名</span>
  824. <span class="kv-value">张建国</span>
  825. </div>
  826. <div class="kv-item">
  827. <span class="kv-label">父亲电话</span>
  828. <span class="kv-value">139****8901</span>
  829. </div>
  830. <div class="kv-item">
  831. <span class="kv-label">父亲身份证号</span>
  832. <span class="kv-value">3401**********5678</span>
  833. </div>
  834. </div>
  835. </div>
  836. <!-- 新生儿信息 -->
  837. <div class="sub-card sub-card-green">
  838. <div class="card-title">
  839. <span class="card-title-icon icon-baby">👶</span>
  840. 新生儿信息
  841. </div>
  842. <div class="kv-grid">
  843. <div class="kv-item">
  844. <span class="kv-label">新生儿姓名</span>
  845. <span class="kv-value">张小明</span>
  846. </div>
  847. <div class="kv-item">
  848. <span class="kv-label">新生儿身份证</span>
  849. <span class="kv-value empty">—</span>
  850. </div>
  851. <div class="kv-item">
  852. <span class="kv-label">新生儿分娩时间</span>
  853. <span class="kv-value">2025-05-08 06:30</span>
  854. </div>
  855. <div class="kv-item">
  856. <span class="kv-label">新生儿性别</span>
  857. <span class="kv-value">男</span>
  858. </div>
  859. <div class="kv-item">
  860. <span class="kv-label">分娩方式</span>
  861. <span class="kv-value">剖宫产</span>
  862. </div>
  863. <div class="kv-item">
  864. <span class="kv-label">胎次</span>
  865. <span class="kv-value">1</span>
  866. </div>
  867. <div class="kv-item">
  868. <span class="kv-label">新生儿体重(克)</span>
  869. <span class="kv-value">3250</span>
  870. </div>
  871. <div class="kv-item">
  872. <span class="kv-label">新生儿评分1分钟</span>
  873. <span class="kv-value">9</span>
  874. </div>
  875. <div class="kv-item">
  876. <span class="kv-label">新生儿评分5分钟</span>
  877. <span class="kv-value">10</span>
  878. </div>
  879. </div>
  880. </div>
  881. </div>
  882. <!-- ===================== 采集信息 ===================== -->
  883. <div class="section">
  884. <div class="section-header">
  885. <span class="section-title">采集信息</span>
  886. </div>
  887. <div class="wrap-card">
  888. <div class="kv-grid">
  889. <div class="kv-item">
  890. <span class="kv-label">采集地区</span>
  891. <span class="kv-value">华东地区</span>
  892. </div>
  893. <div class="kv-item">
  894. <span class="kv-label">采集医院</span>
  895. <span class="kv-value">合肥市第一人民医院</span>
  896. </div>
  897. <div class="kv-item">
  898. <span class="kv-label">采集医护</span>
  899. <span class="kv-value">陈护士</span>
  900. </div>
  901. <div class="kv-item">
  902. <span class="kv-label">销售人员</span>
  903. <span class="kv-value">赵经理</span>
  904. </div>
  905. <div class="kv-item">
  906. <span class="kv-label">样本采集时间</span>
  907. <span class="kv-value">2025-05-08 07:15:00</span>
  908. </div>
  909. <div class="kv-item">
  910. <span class="kv-label">母血采集时间</span>
  911. <span class="kv-value">2025-05-08 07:20:00</span>
  912. </div>
  913. </div>
  914. </div>
  915. </div>
  916. <!-- ===================== 样本及运输信息 ===================== -->
  917. <div class="section">
  918. <div class="section-header">
  919. <span class="section-title">样本及运输信息</span>
  920. </div>
  921. <div class="table-wrap">
  922. <table class="data-table">
  923. <thead>
  924. <tr>
  925. <th>样本类型</th>
  926. <th>样本编码</th>
  927. <th>采集量</th>
  928. <th>单位</th>
  929. <th>价格</th>
  930. <th>存储年限</th>
  931. <th>样本状态</th>
  932. <th>运输类型</th>
  933. <th>目的站点</th>
  934. </tr>
  935. </thead>
  936. <tbody>
  937. <tr>
  938. <td>脐带血造血干细胞</td>
  939. <td style="font-family: monospace; font-size: 13px">SC20250508001</td>
  940. <td>100</td>
  941. <td>ml</td>
  942. <td class="price">¥25,000</td>
  943. <td>20年</td>
  944. <td><span class="badge badge-green">已入库</span></td>
  945. <td>快递运输</td>
  946. <td>合肥站</td>
  947. </tr>
  948. <tr>
  949. <td>脐带间充质干细胞</td>
  950. <td style="font-family: monospace; font-size: 13px">SC20250508002</td>
  951. <td>1</td>
  952. <td>份</td>
  953. <td class="price">¥15,000</td>
  954. <td>20年</td>
  955. <td><span class="badge badge-green">已入库</span></td>
  956. <td>快递运输</td>
  957. <td>合肥站</td>
  958. </tr>
  959. <tr>
  960. <td>胎盘干细胞</td>
  961. <td style="font-family: monospace; font-size: 13px">SC20250508003</td>
  962. <td>1</td>
  963. <td>份</td>
  964. <td class="price">¥8,000</td>
  965. <td>10年</td>
  966. <td><span class="badge badge-blue">运输中</span></td>
  967. <td>专人运输</td>
  968. <td>合肥站</td>
  969. </tr>
  970. <tr>
  971. <td>母血样本</td>
  972. <td style="font-family: monospace; font-size: 13px">SC20250508004</td>
  973. <td>10</td>
  974. <td>ml</td>
  975. <td class="price">¥500</td>
  976. <td>5年</td>
  977. <td><span class="badge badge-green">已入库</span></td>
  978. <td>快递运输</td>
  979. <td>合肥站</td>
  980. </tr>
  981. <tr>
  982. <td>脐带血常规检测</td>
  983. <td style="font-family: monospace; font-size: 13px">SC20250508005</td>
  984. <td>—</td>
  985. <td>—</td>
  986. <td class="price">¥1,500</td>
  987. <td>—</td>
  988. <td><span class="badge badge-orange">待检测</span></td>
  989. <td>—</td>
  990. <td>—</td>
  991. </tr>
  992. </tbody>
  993. </table>
  994. </div>
  995. </div>
  996. <!-- ===================== 缴费信息 ===================== -->
  997. <div class="section">
  998. <div class="section-header">
  999. <span class="section-title">缴费信息</span>
  1000. </div>
  1001. <!-- Summary Stats -->
  1002. <div class="payment-summary">
  1003. <div class="pay-stat">
  1004. <div class="pay-stat-label">缴费模式</div>
  1005. <div class="pay-stat-value">分期</div>
  1006. </div>
  1007. <div class="pay-stat">
  1008. <div class="pay-stat-label">合同金额</div>
  1009. <div class="pay-stat-value highlight">¥50,000</div>
  1010. </div>
  1011. <div class="pay-stat">
  1012. <div class="pay-stat-label">分期期数</div>
  1013. <div class="pay-stat-value">3 期</div>
  1014. </div>
  1015. <div class="pay-stat">
  1016. <div class="pay-stat-label">每期间隔</div>
  1017. <div class="pay-stat-value">6 月</div>
  1018. </div>
  1019. </div>
  1020. <!-- Payment Detail Card -->
  1021. <div class="payment-detail-card">
  1022. <div class="payment-detail-title">
  1023. <span style="color: #10b981">●</span>
  1024. 第 1 期缴费
  1025. </div>
  1026. <div class="payment-detail-grid">
  1027. <div class="kv-item">
  1028. <span class="kv-label">应缴费金额</span>
  1029. <span class="kv-value price">¥16,667</span>
  1030. </div>
  1031. <div class="kv-item">
  1032. <span class="kv-label">转账方式</span>
  1033. <span class="kv-value">微信</span>
  1034. </div>
  1035. <div class="kv-item">
  1036. <span class="kv-label">转账金额</span>
  1037. <span class="kv-value price">¥16,667</span>
  1038. </div>
  1039. <div class="kv-item">
  1040. <span class="kv-label">转账时间</span>
  1041. <span class="kv-value">2025-05-09</span>
  1042. </div>
  1043. <div class="kv-item">
  1044. <span class="kv-label">缴费状态</span>
  1045. <span class="kv-value"><span class="badge badge-green">已缴费</span></span>
  1046. </div>
  1047. </div>
  1048. </div>
  1049. <!-- Payment Flow Track -->
  1050. <div class="wrap-card">
  1051. <div
  1052. style="
  1053. text-align: center;
  1054. margin-bottom: 12px;
  1055. font-size: 13px;
  1056. color: #64748b;
  1057. font-weight: 500;
  1058. "
  1059. >缴费确认流程</div
  1060. >
  1061. <div class="flow-track">
  1062. <div class="flow-step">
  1063. <div class="flow-circle done">✓</div>
  1064. <div class="flow-label done">缴费确认</div>
  1065. </div>
  1066. <div class="flow-connector done"></div>
  1067. <div class="flow-step">
  1068. <div class="flow-circle current">2</div>
  1069. <div class="flow-label current">退费确认</div>
  1070. </div>
  1071. <div class="flow-connector"></div>
  1072. <div class="flow-step">
  1073. <div class="flow-circle pending">3</div>
  1074. <div class="flow-label">财务确认</div>
  1075. </div>
  1076. </div>
  1077. </div>
  1078. </div>
  1079. <!-- ===================== 审核记录 ===================== -->
  1080. <div class="section">
  1081. <div class="section-header">
  1082. <span class="section-title">审核记录</span>
  1083. </div>
  1084. <div class="table-wrap">
  1085. <table class="data-table">
  1086. <thead>
  1087. <tr>
  1088. <th style="width: 60px">序号</th>
  1089. <th>审核时间</th>
  1090. <th>审核状态</th>
  1091. <th>审核备注</th>
  1092. <th>审核人</th>
  1093. </tr>
  1094. </thead>
  1095. <tbody>
  1096. <tr>
  1097. <td style="text-align: center; color: #94a3b8">1</td>
  1098. <td>2025-05-10 15:20:00</td>
  1099. <td><span class="badge badge-green">审核通过</span></td>
  1100. <td>资料齐全,信息核对无误</td>
  1101. <td>张主管</td>
  1102. </tr>
  1103. <tr>
  1104. <td style="text-align: center; color: #94a3b8">2</td>
  1105. <td>2025-05-10 14:45:00</td>
  1106. <td><span class="badge badge-blue">已提交</span></td>
  1107. <td>采集专员提交协议单审核</td>
  1108. <td>李明</td>
  1109. </tr>
  1110. </tbody>
  1111. </table>
  1112. </div>
  1113. </div>
  1114. </div>
  1115. </div>
  1116. <!-- Footer -->
  1117. <div class="dialog-footer">
  1118. <button class="btn-close">关闭</button>
  1119. </div>
  1120. </div>
  1121. </div>
  1122. </body>
  1123. </html>