05-current-baseline.html 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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>05 现状基线(优化版)· 登记未用完 Demo</title>
  7. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
  8. <link rel="stylesheet" href="_shared.css" />
  9. <style>
  10. /* 接近 QcMaterialStockCheckTab 现状,但做了分区与尺寸优化 */
  11. .baseline-list {
  12. display: flex;
  13. flex-direction: column;
  14. gap: 10px;
  15. max-height: 520px;
  16. overflow-y: auto;
  17. }
  18. .baseline-card {
  19. border: 1px solid var(--border);
  20. border-radius: var(--radius-sm);
  21. overflow: hidden;
  22. background: var(--surface);
  23. }
  24. .baseline-card:nth-child(even) {
  25. background: #fafafa;
  26. }
  27. .baseline-card__head {
  28. display: flex;
  29. align-items: center;
  30. justify-content: space-between;
  31. padding: 8px 12px;
  32. background: #f8fafc;
  33. border-bottom: 1px solid var(--border);
  34. }
  35. .baseline-card__head-left {
  36. display: flex;
  37. align-items: center;
  38. gap: 10px;
  39. }
  40. .baseline-card__title {
  41. font-size: 13px;
  42. font-weight: 600;
  43. }
  44. .baseline-card__body {
  45. padding: 12px;
  46. }
  47. .zone-label {
  48. font-size: 11px;
  49. font-weight: 600;
  50. color: var(--text-muted);
  51. text-transform: uppercase;
  52. letter-spacing: 0.04em;
  53. margin-bottom: 8px;
  54. padding-bottom: 4px;
  55. border-bottom: 1px dashed var(--border);
  56. }
  57. .zone-label--edit {
  58. color: var(--primary-dark);
  59. border-bottom-color: #a7f3d0;
  60. }
  61. .baseline-grid {
  62. display: grid;
  63. grid-template-columns: repeat(5, minmax(0, 1fr));
  64. gap: 8px 12px;
  65. margin-bottom: 12px;
  66. }
  67. .baseline-grid:last-child {
  68. margin-bottom: 0;
  69. }
  70. .baseline-col-span-2 {
  71. grid-column: span 2;
  72. }
  73. .baseline-col-span-5 {
  74. grid-column: 1 / -1;
  75. }
  76. .baseline-card .input,
  77. .baseline-card .select {
  78. height: 32px;
  79. font-size: 13px;
  80. }
  81. .compare-tag {
  82. display: inline-block;
  83. margin-left: 8px;
  84. padding: 2px 8px;
  85. border-radius: 6px;
  86. font-size: 11px;
  87. background: var(--danger-bg);
  88. color: var(--danger);
  89. font-weight: 600;
  90. }
  91. </style>
  92. </head>
  93. <body>
  94. <header class="demo-banner">
  95. <div>
  96. <h1><span class="demo-badge">05 现状基线</span> 登记未用完物料 <span class="compare-tag">对照组</span></h1>
  97. <p>保留卡片 + 多列栅格结构,优化分区与控件尺寸(对比当前 28px / 无分区)</p>
  98. </div>
  99. <div class="demo-banner__actions">
  100. <a href="index.html">← 选型索引</a>
  101. <a href="01-inline-table.html">01 表格</a>
  102. <a class="is-current" href="05-current-baseline.html">05 现状</a>
  103. </div>
  104. </header>
  105. <div class="page-wrap">
  106. <div class="dialog-backdrop">
  107. <div class="dialog dialog--wide" role="dialog">
  108. <div class="dialog__head">
  109. <h2 class="dialog__title">登记未用完物料</h2>
  110. <button type="button" class="dialog__close">×</button>
  111. </div>
  112. <div class="dialog__body">
  113. <div class="section-head">
  114. <div class="section-head__left">
  115. <div class="section-title">未用完明细</div>
  116. <div class="section-hint">
  117. 当前实现:每行一张卡片、5 列栅格、17 字段、28px 控件 — 多条时纵向很长且 label 仅 11px。
  118. </div>
  119. </div>
  120. <div class="section-tools">
  121. <span class="stat-pill">共 <strong id="line-count">0</strong> 项</span>
  122. <button type="button" class="btn btn-sm">+ 新增一行</button>
  123. </div>
  124. </div>
  125. <div class="baseline-list" id="list"></div>
  126. </div>
  127. <div class="dialog__foot">
  128. <button type="button" class="btn btn-ghost">取消</button>
  129. <button type="button" class="btn btn-primary">保存</button>
  130. </div>
  131. </div>
  132. </div>
  133. <p class="style-note">
  134. <strong>现状问题(供选型参考):</strong>
  135. <ul>
  136. <li>10 条 × 每张卡片 ~120px 高 ≈ 1200px,需大量滚动</li>
  137. <li>批次只读字段与可编辑字段混在同一栅格,视觉权重相同</li>
  138. <li>28px 控件 + 11px label,密集且易点错</li>
  139. <li>本 Demo 的「优化版」仅加卡片头、分区标题、32px 控件 — 仍不如 01/02/03 高效</li>
  140. </ul>
  141. </p>
  142. </div>
  143. <script src="_demo-data.js"></script>
  144. <script>
  145. const list = document.getElementById('list')
  146. const rows = DEMO_UNUSED_LINES.slice(0, 4) // 只展示 4 条说明问题,避免页面过长
  147. list.innerHTML = rows
  148. .map(
  149. (row, i) => `<article class="baseline-card">
  150. <div class="baseline-card__head">
  151. <div class="baseline-card__head-left">
  152. <span class="row-index">${i + 1}</span>
  153. <span class="baseline-card__title">${row.materialName}</span>
  154. <span class="tag ${row.fromBatch ? 'tag--success' : 'tag--warn'}">${row.fromBatch ? '批次' : '手工'}</span>
  155. </div>
  156. <button type="button" class="btn btn-danger-link btn-sm">删除</button>
  157. </div>
  158. <div class="baseline-card__body">
  159. <div class="zone-label">批次检索 & 关联信息</div>
  160. <div class="baseline-grid">
  161. <div class="baseline-col-span-2"><label class="field-label">批次检索</label><select class="select" ${row.fromBatch ? 'disabled' : ''}><option>${row.fromBatch ? row.stockInNo + ' · ' + row.materialName : '检索批次'}</option></select></div>
  162. <div><label class="field-label">入库编号</label><input class="input input--readonly" readonly value="${row.stockInNo || ''}" /></div>
  163. <div><label class="field-label">入库日期</label><input class="input input--readonly" readonly value="${row.stockInDate || ''}" /></div>
  164. <div><label class="field-label">过期日期</label><input class="input input--readonly" readonly value="${row.expireDate || ''}" /></div>
  165. <div><label class="field-label">物料编码</label><input class="input input--readonly" readonly value="${row.materialCode || ''}" /></div>
  166. <div><label class="field-label">物料名称</label><input class="input input--readonly" readonly value="${row.materialName || ''}" /></div>
  167. <div><label class="field-label">规格型号</label><input class="input input--readonly" readonly value="${row.specModel || ''}" /></div>
  168. <div><label class="field-label">单位</label><input class="input input--readonly" readonly value="${row.unit || ''}" /></div>
  169. <div><label class="field-label">货号</label><input class="input input--readonly" readonly value="${row.catalogNo || ''}" /></div>
  170. <div><label class="field-label">批号</label><input class="input input--readonly" readonly value="${row.batchNo || ''}" /></div>
  171. <div><label class="field-label">厂家</label><input class="input input--readonly" readonly value="${row.manufacturer || ''}" /></div>
  172. <div><label class="field-label">单价(元)</label><input class="input input--readonly" readonly value="${formatMoney(row.unitPrice)}" /></div>
  173. </div>
  174. <div class="zone-label zone-label--edit">登记信息(重点填写)</div>
  175. <div class="baseline-grid">
  176. <div><label class="field-label">未用完数量</label><input class="input input-num" type="number" value="${row.unusedQty}" /></div>
  177. <div><label class="field-label">剩余金额(元)</label><input class="input input--readonly" readonly value="${formatMoney(calcAmount(row.unitPrice, row.unusedQty))}" /></div>
  178. <div><label class="field-label">持有人</label><input class="input" value="${row.holder || ''}" /></div>
  179. <div class="baseline-col-span-2"><label class="field-label">备注</label><input class="input" value="${row.remark || ''}" /></div>
  180. </div>
  181. </div>
  182. </article>`
  183. )
  184. .join('')
  185. document.getElementById('line-count').textContent = rows.length + '(Demo 仅展示 4 条说明密度)'
  186. </script>
  187. </body>
  188. </html>