_cards.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /** 质检卡片 Demo · 共享卡片 HTML 片段 */
  2. ;(function () {
  3. const TASKS = [
  4. {
  5. name: 'HBV-DNA 定量',
  6. status: '进行中',
  7. statusClass: 'el-tag--warning',
  8. type: '实验室',
  9. typeClass: 'el-tag--success',
  10. conclusion: '待结论',
  11. conclusionClass: 'el-tag--info',
  12. code: 'RW202606120101',
  13. assignee: '张三',
  14. action: '填写结果'
  15. },
  16. {
  17. name: 'HIV 抗体筛查',
  18. status: '待执行',
  19. statusClass: 'el-tag--info',
  20. type: '第三方',
  21. typeClass: 'el-tag--primary',
  22. conclusion: '待结论',
  23. conclusionClass: 'el-tag--info',
  24. code: 'RW202606120102',
  25. assignee: '李四',
  26. action: '开始'
  27. },
  28. {
  29. name: '细胞活性检测',
  30. status: '已完成',
  31. statusClass: 'el-tag--success',
  32. type: '实验室',
  33. typeClass: 'el-tag--success',
  34. conclusion: '通过',
  35. conclusionClass: 'el-tag--success',
  36. code: 'RW202606120103',
  37. assignee: '王五',
  38. action: '查看'
  39. }
  40. ]
  41. const WORK_ORDERS = [
  42. {
  43. index: 1,
  44. no: 'ZJ202606120001',
  45. status: '已配置',
  46. statusClass: 'el-tag--warning',
  47. trigger: '样本接收',
  48. triggerClass: 'el-tag--primary',
  49. labCode: 'LAB-202506120001',
  50. sampleType: '脐带血',
  51. method: '实验室 / 第三方',
  52. time: '2026-06-12 09:35'
  53. },
  54. {
  55. index: 2,
  56. no: 'ZJ202606120015',
  57. status: '待配置',
  58. statusClass: 'el-tag--info',
  59. trigger: '生产过程',
  60. triggerClass: 'el-tag--warning',
  61. labCode: 'LAB-202506120002',
  62. sampleType: '脐带血',
  63. method: '实验室',
  64. time: '2026-06-12 14:20'
  65. },
  66. {
  67. index: 3,
  68. no: 'ZJ202606120028',
  69. status: '已完成',
  70. statusClass: 'el-tag--success',
  71. trigger: '样本接收',
  72. triggerClass: 'el-tag--primary',
  73. labCode: 'LAB-202506120003',
  74. sampleType: '胎盘组织',
  75. method: '第三方',
  76. time: '2026-06-11 16:48'
  77. }
  78. ]
  79. function renderTasks(mineMode) {
  80. return TASKS.map(function (t) {
  81. return (
  82. '<div class="qc-task-card qc-task-card--compact">' +
  83. '<div class="qc-task-card__line qc-task-card__line--top">' +
  84. '<span class="qc-task-card__name">' +
  85. t.name +
  86. '</span>' +
  87. '<div class="qc-task-card__tags">' +
  88. '<span class="el-tag ' +
  89. t.statusClass +
  90. '">' +
  91. t.status +
  92. '</span>' +
  93. '<span class="el-tag ' +
  94. t.typeClass +
  95. '">' +
  96. t.type +
  97. '</span>' +
  98. '<span class="el-tag ' +
  99. t.conclusionClass +
  100. '">' +
  101. t.conclusion +
  102. '</span>' +
  103. '</div></div>' +
  104. '<div class="qc-task-card__line qc-task-card__line--bottom">' +
  105. '<span class="qc-task-card__code">' +
  106. t.code +
  107. '</span>' +
  108. '<span class="qc-task-card__sep">·</span>' +
  109. '<span class="qc-task-card__assignees">' +
  110. t.assignee +
  111. '</span>' +
  112. '<div class="qc-work-order-task-sublist__ops">' +
  113. '<button class="btn-op-item primary sm">' +
  114. t.action +
  115. '</button>' +
  116. '<button class="btn-op-item sm">⋯</button>' +
  117. '</div></div></div>'
  118. )
  119. }).join('')
  120. }
  121. function renderWorkOrder(wo, mineMode) {
  122. const headBtn = mineMode
  123. ? '<button class="btn-op-item primary">查看</button>'
  124. : '<button class="btn-op-item primary">配置检测</button><button class="btn-op-item">⋯</button>'
  125. return (
  126. '<article class="qc-work-order-card">' +
  127. '<header class="qc-work-order-card__head">' +
  128. '<div class="qc-work-order-card__head-inner">' +
  129. '<div class="qc-work-order-card__head-main">' +
  130. '<div class="qc-work-order-card__title-row">' +
  131. '<span class="qc-work-order-card__index">' +
  132. wo.index +
  133. '</span>' +
  134. '<span class="qc-work-order-card__no">' +
  135. wo.no +
  136. '</span>' +
  137. '<span class="el-tag ' +
  138. wo.statusClass +
  139. '">' +
  140. wo.status +
  141. '</span>' +
  142. '<span class="el-tag ' +
  143. wo.triggerClass +
  144. '">' +
  145. wo.trigger +
  146. '</span>' +
  147. '</div>' +
  148. '<dl class="qc-work-order-card__meta">' +
  149. '<div class="qc-work-order-card__meta-item"><dt>实验室入库编码</dt><dd>' +
  150. wo.labCode +
  151. '</dd></div>' +
  152. '<div class="qc-work-order-card__meta-item"><dt>样本类型</dt><dd>' +
  153. wo.sampleType +
  154. '</dd></div>' +
  155. '<div class="qc-work-order-card__meta-item"><dt>检测方式</dt><dd>' +
  156. wo.method +
  157. '</dd></div>' +
  158. '<div class="qc-work-order-card__meta-item"><dt>创建时间</dt><dd>' +
  159. wo.time +
  160. '</dd></div>' +
  161. '</dl></div>' +
  162. '<div class="qc-work-order-card__ops">' +
  163. headBtn +
  164. '</div></div></header>' +
  165. '<section class="qc-work-order-card__tasks">' +
  166. '<div class="qc-work-order-task-sublist__head">' +
  167. '<div class="qc-work-order-task-sublist__head-title">质检任务</div>' +
  168. '<span class="qc-work-order-task-sublist__count">共 3 项任务</span>' +
  169. '</div>' +
  170. '<div class="qc-task-cards-grid">' +
  171. renderTasks(mineMode) +
  172. '</div></section></article>'
  173. )
  174. }
  175. window.QcCardDemo = {
  176. renderList: function (container, mineMode, limit) {
  177. if (!container) return
  178. const rows = typeof limit === 'number' ? WORK_ORDERS.slice(0, limit) : WORK_ORDERS
  179. container.innerHTML = rows
  180. .concat(
  181. typeof limit === 'number' && limit > WORK_ORDERS.length
  182. ? WORK_ORDERS.slice(0, limit - WORK_ORDERS.length).map(function (wo, i) {
  183. return Object.assign({}, wo, {
  184. index: WORK_ORDERS.length + i + 1,
  185. no: wo.no.replace(/\d+$/, function (n) {
  186. return String(Number(n) + WORK_ORDERS.length + i).padStart(3, '0')
  187. })
  188. })
  189. })
  190. : []
  191. )
  192. .map(function (wo) {
  193. return renderWorkOrder(wo, mineMode)
  194. })
  195. .join('')
  196. },
  197. renderSingleCard: function (container, mineMode) {
  198. if (!container) return
  199. container.innerHTML = renderWorkOrder(WORK_ORDERS[0], mineMode)
  200. },
  201. initModeTabs: function () {
  202. const tabs = document.querySelectorAll('[data-mode-tab]')
  203. const lists = document.querySelectorAll('[data-card-list]')
  204. tabs.forEach(function (tab) {
  205. tab.addEventListener('click', function () {
  206. const mode = tab.getAttribute('data-mode-tab')
  207. tabs.forEach(function (t) {
  208. t.classList.toggle('active', t === tab)
  209. })
  210. lists.forEach(function (list) {
  211. window.QcCardDemo.renderList(list, mode === 'mine')
  212. })
  213. document.querySelectorAll('[data-single-card]').forEach(function (el) {
  214. window.QcCardDemo.renderSingleCard(el, mode === 'mine')
  215. })
  216. })
  217. })
  218. }
  219. }
  220. document.addEventListener('DOMContentLoaded', function () {
  221. document.querySelectorAll('[data-card-list]').forEach(function (el) {
  222. window.QcCardDemo.renderList(el, false)
  223. })
  224. document.querySelectorAll('[data-single-card]').forEach(function (el) {
  225. window.QcCardDemo.renderSingleCard(el, false)
  226. })
  227. window.QcCardDemo.initModeTabs()
  228. })
  229. })()