瀏覽代碼

feat(mobile-oa-h5): add market status-tag registry mirror

Mirror Web status-tag-registry for market modules with resolveStatusTag and parity tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 2 周之前
父節點
當前提交
87f1e9a4eb
共有 2 個文件被更改,包括 183 次插入 和 0 次删除
  1. 122 0
      mobile-oa-h5/src/market/status-tag-registry.js
  2. 61 0
      mobile-oa-h5/src/market/status-tag-registry.test.js

+ 122 - 0
mobile-oa-h5/src/market/status-tag-registry.js

@@ -0,0 +1,122 @@
+// Mirror of web-admin/src/utils/status-tag-registry.ts (market scope). Keep in sync manually.
+
+function createRegistry(entries) {
+  return Object.freeze(
+    Object.fromEntries(
+      Object.entries(entries).map(([code, item]) => [code, Object.freeze({ ...item })])
+    )
+  )
+}
+
+/**
+ * @param {Record<string, { label: string, tagType: string }>} registry
+ * @param {string | null | undefined} code
+ * @param {Record<string, string>} [aliases]
+ * @returns {{ label: string, tagType: string }}
+ */
+export function resolveStatusTag(registry, code, aliases = {}) {
+  const raw = String(code ?? '').trim()
+  if (!raw) return { label: '—', tagType: 'info' }
+  const mapped = aliases[raw] || raw
+  const hit = registry[mapped]
+  if (hit) return { label: hit.label, tagType: hit.tagType }
+  if (/[\u4e00-\u9fff]/.test(raw)) return { label: raw, tagType: 'info' }
+  return { label: '未知', tagType: 'info' }
+}
+
+/** 样本缴费进度(勿与转账笔 payStatus / 期次 paymentScheduleStatus 混用) */
+export const samplePaymentProgress = createRegistry({
+  dfj: { label: '待缴费', tagType: 'info' },
+  bfyj: { label: '部分已缴', tagType: 'primary' },
+  yjq: { label: '已缴清', tagType: 'success' },
+  待缴费: { label: '待缴费', tagType: 'info' },
+  待缴清: { label: '待缴费', tagType: 'info' }, // progress-only alias
+  部分已缴: { label: '部分已缴', tagType: 'primary' },
+  部分缴费: { label: '部分已缴', tagType: 'primary' },
+  已缴清: { label: '已缴清', tagType: 'success' }
+})
+
+/** 应缴批次 scheduleStatus(open=待缴清;勿与 samplePaymentProgress.dfj=待缴费 混用) */
+export const paymentScheduleStatus = createRegistry({
+  open: { label: '待缴清', tagType: 'warning' },
+  cleared: { label: '已缴清', tagType: 'success' },
+  void: { label: '已作废', tagType: 'info' },
+  pending: { label: '待缴清', tagType: 'warning' }, // mobile-only alias → open
+  paid: { label: '已缴清', tagType: 'success' },
+  partial: { label: '部分到账', tagType: 'primary' },
+  closed: { label: '已关闭', tagType: 'info' }
+})
+
+export const protocolStatus = createRegistry({
+  dsx: { label: '待生效', tagType: 'info' },
+  sxz: { label: '生效中', tagType: 'primary' },
+  ygq: { label: '已过期', tagType: 'warning' },
+  yzf: { label: '已作废', tagType: 'danger' },
+  sdfq: { label: '属地废弃', tagType: 'danger' },
+  zky: { label: '转科研', tagType: 'primary' }
+})
+
+export const donationStatus = createRegistry({
+  dsx: { label: '待生效', tagType: 'info' },
+  sxz: { label: '生效中', tagType: 'primary' },
+  ygq: { label: '已过期', tagType: 'warning' },
+  yzf: { label: '已作废', tagType: 'danger' },
+  sdfq: { label: '属地废弃', tagType: 'danger' },
+  zckc: { label: '转细胞存储', tagType: 'primary' }
+})
+
+export const payMode = createRegistry({
+  dj: { label: '趸交', tagType: 'primary' },
+  fq: { label: '分期', tagType: 'warning' },
+  djfq: { label: '趸交+分期', tagType: 'warning' },
+  fgd: { label: '分改趸', tagType: 'warning' }
+})
+
+/** 转账笔 payStatus(dfj=已付款;勿与样本进度 dfj=待缴费 混用) */
+export const payStatus = createRegistry({
+  dfj: { label: '已付款', tagType: 'primary' },
+  jfqrz: { label: '付款确认中', tagType: 'warning' },
+  yjf: { label: '付款完成', tagType: 'success' },
+  tfqrz: { label: '退费确认中', tagType: 'warning' },
+  ytf: { label: '已退费', tagType: 'danger' }
+})
+
+export const paymentChaseStatus = createRegistry({
+  overdue: { label: '已逾期', tagType: 'danger' },
+  upcoming: { label: '即将到期', tagType: 'warning' }
+})
+
+export const auditStatus = createRegistry({
+  shtg: { label: '审核通过', tagType: 'success' },
+  shth: { label: '审核退回', tagType: 'danger' }
+})
+
+export const transportType = createRegistry({
+  kdys: { label: '快递运输', tagType: 'info' },
+  ryxd: { label: '人员携带', tagType: 'success' }
+})
+
+/** 本范围至少覆盖 cell_storage / research_donation;其余与 Web 一致 */
+export const receptionSource = createRegistry({
+  cell_storage: { label: '细胞存储', tagType: 'primary' },
+  research_donation: { label: '科研捐赠', tagType: 'warning' },
+  outbound: { label: '出库', tagType: 'primary' },
+  pilot_service: { label: '中试服务', tagType: 'primary' },
+  clinical_application: { label: '临床应用', tagType: 'warning' },
+  basic_experiment: { label: '基础实验', tagType: 'primary' }
+})
+
+export const presignOrderStatus = createRegistry({
+  draft: { label: '草稿', tagType: 'info' },
+  active: { label: '进行中', tagType: 'warning' },
+  converted: { label: '已转正式', tagType: 'success' },
+  void: { label: '已作废', tagType: 'danger' }
+})
+
+export const transferType = createRegistry({
+  wxzz: { label: '微信转账', tagType: 'success' },
+  zzbzz: { label: '支付宝转账', tagType: 'primary' },
+  yhkzz: { label: '银行卡转账', tagType: 'info' },
+  xj: { label: '现金', tagType: 'warning' },
+  lszz: { label: '乐刷', tagType: 'primary' }
+})

+ 61 - 0
mobile-oa-h5/src/market/status-tag-registry.test.js

@@ -0,0 +1,61 @@
+import test from 'node:test'
+import assert from 'node:assert/strict'
+import {
+  resolveStatusTag,
+  samplePaymentProgress,
+  paymentScheduleStatus,
+  payStatus,
+  payMode,
+  presignOrderStatus,
+  receptionSource,
+  transportType,
+  auditStatus
+} from './status-tag-registry.js'
+
+test('sample progress dfj is 待缴费/info not 待缴清', () => {
+  assert.deepEqual(resolveStatusTag(samplePaymentProgress, 'dfj'), {
+    label: '待缴费',
+    tagType: 'info'
+  })
+})
+
+test('schedule open is 待缴清/warning', () => {
+  assert.deepEqual(resolveStatusTag(paymentScheduleStatus, 'open'), {
+    label: '待缴清',
+    tagType: 'warning'
+  })
+})
+
+test('payStatus dfj is 已付款/primary', () => {
+  assert.deepEqual(resolveStatusTag(payStatus, 'dfj'), {
+    label: '已付款',
+    tagType: 'primary'
+  })
+})
+
+test('payMode covers djfq and fgd as warning', () => {
+  assert.equal(resolveStatusTag(payMode, 'dj').tagType, 'primary')
+  assert.equal(resolveStatusTag(payMode, 'djfq').tagType, 'warning')
+  assert.equal(resolveStatusTag(payMode, 'fgd').label, '分改趸')
+})
+
+test('presign draft uses info not default', () => {
+  assert.deepEqual(resolveStatusTag(presignOrderStatus, 'draft'), {
+    label: '草稿',
+    tagType: 'info'
+  })
+})
+
+test('freight source cell_storage is primary', () => {
+  assert.equal(resolveStatusTag(receptionSource, 'cell_storage').tagType, 'primary')
+  assert.equal(resolveStatusTag(transportType, 'kdys').tagType, 'info')
+  assert.equal(resolveStatusTag(transportType, 'ryxd').tagType, 'success')
+})
+
+test('audit shth is danger', () => {
+  assert.equal(resolveStatusTag(auditStatus, 'shth').tagType, 'danger')
+})
+
+test('progress alias 待缴清 normalizes to 待缴费', () => {
+  assert.equal(resolveStatusTag(samplePaymentProgress, '待缴清').label, '待缴费')
+})