vue3-element-plus-app-chu 0.0.32 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,7 +38,7 @@ pnpm dev:backend # 只启动 verce-vue-test/backend 后端
38
38
 
39
39
  页面通过公共请求层读取 TAM 的 `head/body`,统一响应的解包与兼容处理由 `src/utils/request.ts` 负责。指定后端用于替代前端 mock;数字人民币核销、修改和撤销核销按顺序直接更新数据库,单机 MongoDB 即可使用。`head.consumerSeqNo` 可选,传入时支持相同请求重试;原金额和状态快照校验仍保留。注资发起只保存 `PENDING` / `NOT_SENT` 待处理记录,不调整账户余额;预报导入当前返回 `501`。业务校验、数据保存和导入导出均以指定后端的实时文档及实现为准。
40
40
 
41
- 数字人民币页面的业务类型使用 `201/202/203` 字典,新增预报不提交 `predName`;核销预报方向使用 `1/2`,待核销查询包含状态 `1/3`,展示交易对手账号;流水可按业务类型筛选并读取 `tranStatus`;注资明细支持起止交易日期;授权页展示业务类型中文名称。匡算明细展示部分核销状态。字段及页面接口映射见 [数字人民币接口摘录](docs/digital-rmb-apis.md),当前接口约束以实时文档为准。
41
+ 数字人民币页面的业务类型使用 `201/202/203` 字典,新增预报不提交 `predName`;项目内预报收支方向统一使用 `1` 收入、`2` 支出,流水统一使用 `I` 收入、`O` 支出,查询、请求和结果展示均按各自编码处理。核销预报待核销查询包含状态 `1/3`,展示交易对手账号;流水可按业务类型筛选并读取 `tranStatus`;注资明细支持起止交易日期;授权页展示业务类型中文名称。匡算明细展示部分核销状态。字段及页面接口映射见 [数字人民币接口摘录](docs/digital-rmb-apis.md),当前接口约束以实时文档为准。
42
42
 
43
43
  独立页面 `/flow-query` 的普通查询、初次加载、分页和刷新与核销页面的流水信息共用 `/TAM/0001/140502002`,参数保持一致:交易日期 `tranDate` 必填且默认取共用业务日期,可按业务类型、我方机构、付款人、收款人、收支方向、金额范围和核销状态筛选,未填写的可选条件不提交。列表读取 `resultList` 和字符串类型的 `totalCount`,字段沿用核销流水模型。「查询」「实时查询流水」与「重置」按钮并排放在查询条件区末尾。「实时查询流水」单独调用 `/TAM/0001/140504002`,只携带公共分页参数 `pageIndex: 1`、`pageSize: 1`,业务请求体为空;成功提示“操作成功”,失败仅记录控制台,不更新列表。
44
44
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue3-element-plus-app-chu",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
@@ -20,11 +20,11 @@
20
20
 
21
21
  接口统一使用 `/Users/bombingpig/WebstormProjects/verce-vue-test/backend`,以 [Scalar 文档](http://localhost:3011/oms/docs) 和 [OpenAPI JSON](http://localhost:3011/oms/openapi.json) 为准。服务前缀为 `/oms`,前端开发代理将 `/TAM`、`/api`、`/nacos` 转发到 `http://localhost:3011/oms`。本项目已移除原 `backend/`;仓库内 `docs/digital-rmb.openapi.json` 为字段摘录。
22
22
 
23
- 预报新增必填 `busiType`、`predAmt`、`tranDate`、`payDirec`,业务类型字典为 `201` 兑回、`202` 兑出、`203` 付现;新增和修改不提交 `predName`、`billNo`、`billDate`。客户和机构等字段选填,`payChannel` 缺省为 `8`,`predDate` 缺省为后端当天日期。核销预报查询使用方向 `1/2`,待核销传 `verifyStatusList: ['1', '3']`,已核销传 `['2']`;预报管理和流水方向保持各自原协议。核销页流水查询使用 `busiType`,读取 `tranStatus`(`S/P/F`),展示核销状态 `3` 部分核销。注资明细提供 `txnDtStart`、`txnDtEnd` 筛选。字段摘录及页面接口映射见 `docs/digital-rmb-apis.md`,业务校验与保存行为由指定后端负责。
23
+ 预报新增必填 `busiType`、`predAmt`、`tranDate`、`payDirec`,业务类型字典为 `201` 兑回、`202` 兑出、`203` 付现;新增和修改不提交 `predName`、`billNo`、`billDate`。客户和机构等字段选填,`payChannel` 缺省为 `8`,`predDate` 缺省为后端当天日期。项目内预报收支方向统一为 `1` 收入、`2` 支出,流水统一为 `I` 收入、`O` 支出;预报管理、核销预报和匡算预报明细按 `1/2` 处理,流水查询、核销流水和匡算流水明细按 `I/O` 处理。核销预报待核销传 `verifyStatusList: ['1', '3']`,已核销传 `['2']`。核销页流水查询使用 `busiType`,读取 `tranStatus`(`S/P/F`),展示核销状态 `3` 部分核销。注资明细提供 `txnDtStart`、`txnDtEnd` 筛选。字段摘录及页面接口映射见 `docs/digital-rmb-apis.md`,业务校验与保存行为由指定后端负责。
24
24
 
25
- 当前核销预报 API 将页面 `1/2` 方向与后端实现的 `I/O` 双向转换;核销写操作提交公共 `consumerSeqNo`、原状态和原金额快照。后端作为替代前端 mock 的本地测试服务,核销、修改和撤销核销按顺序直接更新数据库,各种 MongoDB 部署模式均不启动事务。`consumerSeqNo` 可选,缺省时后端生成,传入时支持相同请求重试;快照校验和关联撤回逻辑仍保留。注资明细使用服务端分页;发起注资只保存 `PENDING` / `NOT_SENT` 记录,不改变余额。参数接口当前由 `swaggerStub` 返回静态兼容数据,不持久化参数增删改。
25
+ 核销预报 API 按 `1/2` 原值提交并读取方向,流水 API 按 `I/O` 原值提交并读取方向;核销写操作提交公共 `consumerSeqNo`、原状态和原金额快照。后端作为替代前端 mock 的本地测试服务,核销、修改和撤销核销按顺序直接更新数据库,各种 MongoDB 部署模式均不启动事务。`consumerSeqNo` 可选,缺省时后端生成,传入时支持相同请求重试;快照校验和关联撤回逻辑仍保留。注资明细使用服务端分页;发起注资只保存 `PENDING` / `NOT_SENT` 记录,不改变余额。参数接口当前由 `swaggerStub` 返回静态兼容数据,不持久化参数增删改。
26
26
 
27
- 独立流水查询页面 `/flow-query` 的普通查询、初次加载、分页和刷新复用核销页的 `queryFlowApi`(`140502002`)与流水模型,读取 `resultList` 和字符串类型的 `totalCount`。查询参数与核销页流水信息保持一致:`tranDate` 必填,默认取 `dcpsRuntime.date`;可选条件为 `busiType`、`orgName`、`payerName`、`payeeName`、`payDirec`(I/O)、`startTransAmt`、`endTransAmt` 和 `verifyStatus`(1/2),空条件不发送;分页放在公共请求头。「查询」「实时查询流水」与「重置」按钮并排放在查询条件区末尾。「实时查询流水」通过独立的 `queryRealtimeFlowApi` 调用 `140504002`,只传公共分页 `pageIndex: 1`、`pageSize: 1`,业务请求体为空;成功提示“操作成功”,失败仅记录控制台,不改变表格和分页。
27
+ 独立流水查询页面 `/flow-query` 的普通查询、初次加载、分页和刷新复用核销页的 `queryFlowApi`(`140502002`)与流水模型,读取 `resultList` 和字符串类型的 `totalCount`。查询参数与核销页流水信息保持一致:`tranDate` 必填,默认取 `dcpsRuntime.date`;可选条件为 `busiType`、`orgName`、`payerName`、`payeeName`、`payDirec`(`I` 收入、`O` 支出)、`startTransAmt`、`endTransAmt` 和 `verifyStatus`(1/2),空条件不发送;分页放在公共请求头。「查询」「实时查询流水」与「重置」按钮并排放在查询条件区末尾。「实时查询流水」通过独立的 `queryRealtimeFlowApi` 调用 `140504002`,只传公共分页 `pageIndex: 1`、`pageSize: 1`,业务请求体为空;成功提示“操作成功”,失败仅记录控制台,不改变表格和分页。
28
28
 
29
29
  ## 命名约定
30
30
 
@@ -21,11 +21,11 @@ const tableSize = 'small'
21
21
  // 单击可查看明细的金额单元格按位置编码查询详情(140503003)。
22
22
 
23
23
  // 金额字段编码与图中报表位置的对应关系:
24
- // C3 数币账户昨日余额;C6/D6 报备金额;C7/D7 未核销金额;
24
+ // C3 数字人民币账户昨日余额;C6/D6 报备金额;C7/D7 未核销金额;
25
25
  // C8/D8 未核销业务流水;C9 日初可用资金(前端计算:C3 + C6 - D6 + C8 - D8);
26
26
  // C11/D11 今日预计调拨金额(查询条件输入框,不查详情);
27
- // C12 数币账户预留金额(前端计算:C9 + C11 - D11);
28
- // B15 当日实时余额。C3、C9、C12、B15 仅展示金额,不提供明细弹窗。
27
+ // C12 数字人民币账户预留金额(前端计算:C9 + C11 - D11);
28
+ // B15 当日实时余额。C3、C9、C12、B15 仅展示金额,不提供明细查看。
29
29
  // 轧差列由前端按「收入减支出」计算:结果行随查询结果更新,
30
30
  // 调拨行随输入实时更新;两条空行按原型占位留空。
31
31
 
@@ -80,13 +80,9 @@ const formatAmount = (value?: string): string => {
80
80
  return `${negative ? '-' : ''}${grouped}.${fraction.padEnd(2, '0')}`
81
81
  }
82
82
 
83
- /**
84
- * 按各项系数精确计算金额合计;任一金额无法解析时返回空字符串。
85
- * emptyAsZero 为 true 时空文本按 0 参与计算(用于输入框的实时轧差)。
86
- */
87
- const calcTotalAmount = (terms: Array<[string, 1 | -1]>, emptyAsZero = false): string => {
83
+ /** 按各项系数精确计算金额合计;任一金额为空或无法解析时返回空字符串。 */
84
+ const calcTotalAmount = (terms: Array<[string, 1 | -1]>): string => {
88
85
  const parse = (value: string) => {
89
- if (!value?.trim() && emptyAsZero) value = '0'
90
86
  const normalized = normalizeAmount(value)
91
87
  if (!normalized) return null
92
88
  const negative = normalized.startsWith('-')
@@ -113,11 +109,13 @@ const calcTotalAmount = (terms: Array<[string, 1 | -1]>, emptyAsZero = false): s
113
109
  }
114
110
 
115
111
  /** 计算轧差(收入减支出),与报表合计共用精确金额运算。 */
116
- const calcGapAmount = (inAmt: string, outAmt: string, emptyAsZero = false): string =>
117
- calcTotalAmount([[inAmt, 1], [outAmt, -1]], emptyAsZero)
112
+ const calcGapAmount = (inAmt: string, outAmt: string): string =>
113
+ calcTotalAmount([[inAmt, 1], [outAmt, -1]])
118
114
 
119
- /** 收支方向字典:I 来账、O 往账。 */
120
- const payDirecLabels: Record<string, string> = { I: '来账', O: '往账' }
115
+ /** 预报收支方向:1 收入、2 支出。 */
116
+ const forecastPayDirecLabels: Record<string, string> = { '1': '收入', '2': '支出' }
117
+ /** 流水收支方向:I 收入、O 支出。 */
118
+ const flowPayDirecLabels: Record<string, string> = { I: '收入', O: '支出' }
121
119
  /** 支付渠道:预报与流水的数字人民币分别为 8、5;其余渠道保留原文。 */
122
120
  const payChannelLabels: Record<string, string> = { '5': '数字人民币', '8': '数字人民币' }
123
121
  /** 与核销页面统一展示核销状态;部分核销记录仍可能出现在匡算明细中。 */
@@ -149,7 +147,7 @@ const amountText = (position: string): string => {
149
147
  return value ? formatAmount(value) : ''
150
148
  }
151
149
 
152
- /** 组装单元格对象供详情弹窗使用:位置编码、展示名称与当前金额一起带入。 */
150
+ /** 组装单元格对象供详情页使用:位置编码、展示名称与当前金额一起带入。 */
153
151
  const cellOf = (position: string): EstimationCell => ({
154
152
  position,
155
153
  label: cellLabels[position] ?? position,
@@ -195,19 +193,20 @@ const gapText = (inPosition: string, outPosition: string): string => {
195
193
  return calcGapAmount(amountOf(inPosition), amountOf(outPosition))
196
194
  }
197
195
 
198
- /** 今日预计调拨金额行的实时轧差:随输入即时计算,空输入按 0 参与计算。 */
196
+ /** 今日预计调拨金额行的实时轧差:随输入即时计算,任一输入为空时留空。 */
199
197
  const inputGapText = computed(() =>
200
- calcGapAmount(queryForm.predictAllotInAmt, queryForm.predictAllotOutAmt, true))
198
+ calcGapAmount(queryForm.predictAllotInAmt, queryForm.predictAllotOutAmt))
201
199
 
202
- /** 数币账户预留金额 C12 = C3 + C6 - D6 + C8 - D8 + (C11 - D11),随调拨输入实时更新。 */
200
+ /** 数字人民币账户预留金额 C12 = C3 + C6 - D6 + C8 - D8 + (C11 - D11),随调拨输入实时更新。 */
203
201
  const reservedBalanceText = computed(() =>
204
202
  calcTotalAmount([[openingBalanceText.value, 1], [inputGapText.value, 1]]))
205
203
 
206
- /** 校验金额文本:须为不小于 0、最多两位小数的十进制金额;返回错误提示文本。 */
204
+ /** 提交时校验金额:不能为空,允许负数,最多保留两位小数。 */
207
205
  const checkAmount = (value: string): string => {
206
+ if (!value.trim()) return '请输入预计调拨金额'
208
207
  const normalized = normalizeAmount(value)
209
- if (!normalized || normalized.startsWith('-') || (normalized.split('.')[1]?.length || 0) > 2) {
210
- return '须为不小于 0 的金额,最多保留两位小数'
208
+ if (!normalized || (normalized.split('.')[1]?.length || 0) > 2) {
209
+ return '请输入有效金额,允许负数,最多保留两位小数'
211
210
  }
212
211
  return ''
213
212
  }
@@ -294,11 +293,14 @@ const submitExport = () => {
294
293
  console.log('[导出数字人民币头寸匡算参数]', params)
295
294
  }
296
295
 
297
- // ---------- 单元格明细弹窗 ----------
296
+ // ---------- 单元格明细页 ----------
298
297
 
299
- // 弹窗状态:cell 为被单击的报表单元格;明细请求在弹窗打开时发起。
298
+ // 在当前组件内切换报表与明细视图,保留报表查询条件和结果,不新增路由。
300
299
  const detailVisible = ref(false)
301
300
  const detailCell = ref<EstimationCell | null>(null)
301
+ // 报备金额、未核销金额仅展示预报;未核销业务流水仅展示流水。
302
+ const showPredDetail = computed(() => ['C6', 'C7', 'D6', 'D7'].includes(detailCell.value?.position || ''))
303
+ const showTranDetail = computed(() => ['C8', 'D8'].includes(detailCell.value?.position || ''))
302
304
  const detailPredList = ref<EstimationPredRow[]>([])
303
305
  const detailTranList = ref<EstimationTranRow[]>([])
304
306
  const detailTotalCount = ref('')
@@ -332,27 +334,31 @@ const loadDetailInfo = async () => {
332
334
  }
333
335
  }
334
336
 
335
- /** 关闭弹窗:重置明细并让未完成的请求失效。 */
337
+ /** 返回匡算报表:重置明细并让未完成的请求失效。 */
336
338
  const closeDetail = () => {
337
339
  detailVisible.value = false
338
340
  detailRequestId += 1
341
+ detailCell.value = null
339
342
  detailPredList.value = []
340
343
  detailTranList.value = []
341
344
  detailTotalCount.value = ''
342
345
  detailLoading.value = false
343
346
  }
344
347
 
345
- /** 打开单元格明细弹窗;结果就绪前其余单元格为占位横线,不发起详情查询。 */
348
+ /** 打开单元格明细页并查询;结果未就绪时不切换视图或发起请求。 */
346
349
  const openDetail = (cell?: EstimationCell) => {
347
350
  if (!cell || !resultReady.value) return
348
351
  detailCell.value = cell
349
352
  detailVisible.value = true
353
+ void loadDetailInfo()
350
354
  }
351
355
 
352
- /** 合并预报、流水列表得到明细总条数;接口 totalCount 缺失时按列表长度兜底展示。 */
356
+ /** 明细总条数优先使用接口 totalCount,缺失时仅统计当前展示的列表。 */
353
357
  const resolveTotal = () => {
354
358
  if (/^\d+$/.test(detailTotalCount.value)) return detailTotalCount.value
355
- return String(detailPredList.value.length + detailTranList.value.length)
359
+ if (showPredDetail.value) return String(detailPredList.value.length)
360
+ if (showTranDetail.value) return String(detailTranList.value.length)
361
+ return '0'
356
362
  }
357
363
 
358
364
  // 页面首次显示时按默认日期预填预计调拨收支金额。
@@ -369,7 +375,7 @@ onBeforeUnmount(() => {
369
375
  <ElConfigProvider :size="tableSize">
370
376
  <main class="dcps-page">
371
377
  <!-- 顶部操作区:交易日期选择与导出、查询入口(收支金额在下方表格内填写)。 -->
372
- <el-card class="estimation-header" shadow="never" :body-style="{ padding: '10px 14px' }">
378
+ <el-card v-show="!detailVisible" class="estimation-header" shadow="never" :body-style="{ padding: '10px 14px' }">
373
379
  <div class="estimation-heading">
374
380
  <div class="filter-field">
375
381
  <label>交易日期</label>
@@ -388,7 +394,7 @@ onBeforeUnmount(() => {
388
394
  </el-card>
389
395
 
390
396
  <!-- 匡算报表:合并单元格的头寸匡算表,与业务原型一致;表格常显,结果就绪前金额显示占位。 -->
391
- <el-card class="estimation-report" shadow="never" :body-style="{ padding: '12px 14px' }">
397
+ <el-card v-show="!detailVisible" class="estimation-report" shadow="never" :body-style="{ padding: '12px 14px' }">
392
398
  <div class="report-scroll">
393
399
  <table class="report-table" :class="{ 'is-ready': resultReady }">
394
400
  <!-- 列:两个左侧标签列、收入、支付、轧差。 -->
@@ -402,7 +408,7 @@ onBeforeUnmount(() => {
402
408
  </tr>
403
409
  <!-- 前一日余额:C3 横跨收入、支付两列,右侧标注单位。 -->
404
410
  <tr>
405
- <td colspan="2" class="report-label">数币账户昨日余额</td>
411
+ <td colspan="2" class="report-label">数字人民币账户昨日余额</td>
406
412
  <td colspan="2" class="report-data">
407
413
  <div class="report-value report-value--static">
408
414
  <span class="report-amount">{{ amountText('C3') }}</span>
@@ -490,7 +496,6 @@ onBeforeUnmount(() => {
490
496
  <el-input
491
497
  v-model="queryForm.predictAllotInAmt"
492
498
  class="report-input"
493
- inputmode="decimal"
494
499
  placeholder="输入调拨收入金额"
495
500
  :maxlength="40"
496
501
  @input="formError.predictAllotInAmt = ''"
@@ -501,7 +506,6 @@ onBeforeUnmount(() => {
501
506
  <el-input
502
507
  v-model="queryForm.predictAllotOutAmt"
503
508
  class="report-input"
504
- inputmode="decimal"
505
509
  placeholder="输入调拨支出金额"
506
510
  :maxlength="40"
507
511
  @input="formError.predictAllotOutAmt = ''"
@@ -510,9 +514,9 @@ onBeforeUnmount(() => {
510
514
  </td>
511
515
  <td class="report-gap" title="轧差 = 收入 − 支出(前端计算)">{{ inputGapText }}</td>
512
516
  </tr>
513
- <!-- 数币账户预留金额:C12 = C9 + C11 - D11,横跨收入、支付、轧差三列。 -->
517
+ <!-- 数字人民币账户预留金额:C12 = C9 + C11 - D11,横跨收入、支付、轧差三列。 -->
514
518
  <tr>
515
- <td colspan="2" class="report-label">数币账户预留金额</td>
519
+ <td colspan="2" class="report-label">数字人民币账户预留金额</td>
516
520
  <td colspan="3" class="report-data">
517
521
  <div class="report-value report-value--static">
518
522
  <span class="report-amount">{{ reservedBalanceText }}</span>
@@ -543,17 +547,20 @@ onBeforeUnmount(() => {
543
547
  </div>
544
548
  </el-card>
545
549
 
546
- <!-- 单元格明细弹窗:按位置编码查询预报与流水列表。 -->
547
- <el-dialog
548
- v-model="detailVisible"
549
- :title="detailCell ? `匡算明细 - ${detailCell.label}` : '匡算明细'"
550
- width="min(1080px, calc(100vw - 32px))"
551
- top="16px"
552
- append-to-body
553
- destroy-on-close
554
- @open="loadDetailInfo"
555
- @closed="closeDetail"
556
- >
550
+ <!-- 单元格明细页:顶部返回报表,内容区展示对应的预报或流水列表。 -->
551
+ <template v-if="detailVisible">
552
+ <el-card class="estimation-header" shadow="never" :body-style="{ padding: '10px 14px' }">
553
+ <div class="detail-heading">
554
+ <el-button @click="closeDetail">
555
+ <svg class="detail-back-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
556
+ <path d="M14 5l-7 7 7 7" />
557
+ </svg>
558
+ 返回匡算
559
+ </el-button>
560
+ <h1 class="detail-title">{{ detailCell ? `匡算明细 - ${detailCell.label}` : '匡算明细' }}</h1>
561
+ </div>
562
+ </el-card>
563
+ <el-card class="detail-card" shadow="never" :body-style="{ padding: '12px 14px', height: '100%', boxSizing: 'border-box' }">
557
564
  <el-scrollbar class="detail-scrollbar">
558
565
  <div class="detail-content">
559
566
  <!-- 上下文摘要:被点击单元格的位置、金额与详情查询的交易日期。 -->
@@ -577,9 +584,9 @@ onBeforeUnmount(() => {
577
584
  </header>
578
585
 
579
586
  <div v-loading="detailLoading" class="detail-tables">
580
- <!-- 预报信息明细;列表为空时展示统一空态。 -->
581
- <div class="dialog-section-title">预报信息</div>
582
- <el-table :data="detailPredList" :size="tableSize" border max-height="240px" empty-text="暂无预报信息">
587
+ <!-- C6/C7/D6/D7 仅展示预报信息;列表为空时展示统一空态。 -->
588
+ <div v-if="showPredDetail" class="detail-section-title">预报信息</div>
589
+ <el-table v-if="showPredDetail" :data="detailPredList" :size="tableSize" border empty-text="暂无预报信息">
583
590
  <el-table-column label="预报流水号" min-width="150" show-overflow-tooltip>
584
591
  <template #default="{ row }">{{ displayText(row.predRefNo) }}</template>
585
592
  </el-table-column>
@@ -593,7 +600,7 @@ onBeforeUnmount(() => {
593
600
  <template #default="{ row }">{{ displayText(row.competName) }}</template>
594
601
  </el-table-column>
595
602
  <el-table-column label="收支方向" width="80" align="center">
596
- <template #default="{ row }">{{ dictLabel(payDirecLabels, row.payDirec) }}</template>
603
+ <template #default="{ row }">{{ dictLabel(forecastPayDirecLabels, row.payDirec) }}</template>
597
604
  </el-table-column>
598
605
  <el-table-column label="支付渠道" width="110" align="center">
599
606
  <template #default="{ row }">{{ dictLabel(payChannelLabels, row.payChannel) }}</template>
@@ -615,9 +622,9 @@ onBeforeUnmount(() => {
615
622
  </el-table-column>
616
623
  </el-table>
617
624
 
618
- <!-- 流水信息明细;失败的详情可重新打开弹窗重试。 -->
619
- <div class="dialog-section-title">流水信息</div>
620
- <el-table :data="detailTranList" :size="tableSize" border max-height="240px" empty-text="暂无流水信息">
625
+ <!-- C8/D8 仅展示流水信息;失败的详情可返回后重新打开重试。 -->
626
+ <div v-if="showTranDetail" class="detail-section-title">流水信息</div>
627
+ <el-table v-if="showTranDetail" :data="detailTranList" :size="tableSize" border empty-text="暂无流水信息">
621
628
  <el-table-column label="交易参考号" min-width="150" show-overflow-tooltip>
622
629
  <template #default="{ row }">{{ displayText(row.refNo) }}</template>
623
630
  </el-table-column>
@@ -631,7 +638,7 @@ onBeforeUnmount(() => {
631
638
  <template #default="{ row }">{{ displayText(row.payeeName) }}</template>
632
639
  </el-table-column>
633
640
  <el-table-column label="收支方向" width="80" align="center">
634
- <template #default="{ row }">{{ dictLabel(payDirecLabels, row.payDirec) }}</template>
641
+ <template #default="{ row }">{{ dictLabel(flowPayDirecLabels, row.payDirec) }}</template>
635
642
  </el-table-column>
636
643
  <el-table-column label="支付渠道" width="110" align="center">
637
644
  <template #default="{ row }">{{ dictLabel(payChannelLabels, row.payChannel) }}</template>
@@ -653,10 +660,8 @@ onBeforeUnmount(() => {
653
660
  </div>
654
661
  </div>
655
662
  </el-scrollbar>
656
- <template #footer>
657
- <el-button @click="closeDetail">关闭</el-button>
658
- </template>
659
- </el-dialog>
663
+ </el-card>
664
+ </template>
660
665
  </main>
661
666
  </ElConfigProvider>
662
667
  </template>
@@ -789,8 +794,12 @@ td.report-data--input { padding: 5px 8px; }
789
794
  letter-spacing: 0.02em;
790
795
  }
791
796
 
792
- /* ---------- 单元格明细弹窗 ---------- */
793
- .detail-scrollbar { max-height: calc(100vh - 240px); }
797
+ /* ---------- 单元格明细页 ---------- */
798
+ .detail-heading { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 12px; }
799
+ .detail-back-icon { width: 15px; height: 15px; margin-right: 4px; }
800
+ .detail-title { margin: 0; color: var(--el-text-color-primary); font-size: 16px; font-weight: 600; line-height: 22px; }
801
+ .detail-card { flex: 1; min-height: 0; min-width: 0; overflow: hidden; }
802
+ .detail-scrollbar { height: 100%; }
794
803
  .detail-content { padding: 2px 4px 4px; }
795
804
 
796
805
  /* 摘要区:位置编码、金额、日期放在一行,便于确认明细上下文。 */
@@ -810,10 +819,10 @@ td.report-data--input { padding: 5px 8px; }
810
819
  .detail-reference { margin-left: auto; }
811
820
  .detail-reference strong { font-weight: 600; }
812
821
 
813
- .dialog-section-title { margin: 12px 0 6px; color: var(--el-text-color-regular); font-size: 13px; font-weight: 600; }
822
+ .detail-section-title { margin: 12px 0 6px; color: var(--el-text-color-regular); font-size: 13px; font-weight: 600; }
814
823
  .detail-tables .el-table + .el-table { margin-top: 2px; }
815
824
  .detail-tables { min-height: 160px; }
816
- .detail-tables .dialog-section-title:first-child { margin-top: 0; }
825
+ .detail-tables .detail-section-title:first-child { margin-top: 0; }
817
826
  .amount-cell { color: var(--el-text-color-primary); font-variant-numeric: tabular-nums; }
818
827
  .detail-retry { margin-top: 10px; color: var(--el-color-danger); font-size: 12px; text-align: center; }
819
828
  </style>
@@ -83,7 +83,7 @@ export interface Tam140503003OutBodyPredList {
83
83
  groundBranch?: string
84
84
  /** 支付渠道 */
85
85
  payChannel?: string
86
- /** 收支方向 */
86
+ /** 预报收支方向:1 收入、2 支出。 */
87
87
  payDirec?: string
88
88
  /** 预报金额 */
89
89
  predAmt?: string
@@ -107,7 +107,7 @@ export interface Tam140503003OutBodyTranList {
107
107
  groundBranch?: string
108
108
  /** 支付渠道 */
109
109
  payChannel?: string
110
- /** 收支方向 */
110
+ /** 流水收支方向:I 收入、O 支出。 */
111
111
  payDirec?: string
112
112
  /** 收款人名称 */
113
113
  payeeName?: string
@@ -98,8 +98,8 @@ const validAmount = (value: string) => {
98
98
 
99
99
  /** 业务类型字典:201 兑回、202 兑出、203 付现。 */
100
100
  const busiTypeLabels: Record<string, string> = { '201': '兑回', '202': '兑出', '203': '付现' }
101
- /** 收支方向字典:I 来账、O 往账。 */
102
- const payDirecLabels: Record<string, string> = { I: '来账', O: '往账' }
101
+ /** 流水收支方向字典:I 收入、O 支出。 */
102
+ const payDirecLabels: Record<string, string> = { I: '收入', O: '支出' }
103
103
  /** 流水查询筛选只提供未核销和已核销,部分核销仅在结果中展示。 */
104
104
  const verifyStatusLabels: Record<string, string> = { '1': '未核销', '2': '已核销', '3': '部分核销' }
105
105
 
@@ -1,4 +1,4 @@
1
- /** 普通流水查询与核销页面共用 140502002 的请求、筛选及响应类型。 */
1
+ /** 普通流水查询与核销页面共用 140502002 的请求、筛选及响应类型;收支方向为 I 收入、O 支出。 */
2
2
  export type {
3
3
  FlowFilters,
4
4
  FlowQueryParams,
@@ -159,6 +159,7 @@ const validateForm = (values: ForecastFormValues, mode: 'create' | 'edit' = 'cre
159
159
  }
160
160
  if (values.busiType && !Object.hasOwn(busiTypeLabels, values.busiType)) return '请选择有效的业务类型'
161
161
  if (values.payDirec && !Object.hasOwn(payDirecLabels, values.payDirec)) return '请选择有效的收支方向'
162
+ if (values.payChannel && !Object.hasOwn(payChannelLabels, values.payChannel)) return '请选择有效的支付渠道'
162
163
  for (const [key, label] of [['tranDate', '交易日期'], ['predDate', '预报日期']] as const) {
163
164
  const date = values[key].trim()
164
165
  if ((date || (mode === 'create' && key === 'tranDate')) && !isValidDate(date)) return `${label}须为有效日期,格式为 YYYYMMDD`
@@ -203,20 +204,39 @@ const createFilters = (): ForecastFilters => ({
203
204
  })
204
205
  const listFilters = ref(createFilters())
205
206
  let listAppliedQuery: ForecastFilters = { ...listFilters.value }
206
- // 重复输入项共用一份配置,依次为字段、名称;输入框较窄,占位文案统一使用简短提示。
207
- const listTextFilters = [
208
- ['clientName', '客户名称'],
209
- ['competName', '交易对手名称'],
210
- ['payChannel', '支付渠道'],
211
- ['groundBranch', '落地机构'],
212
- ['predStatus', '预报状态'],
213
- ['verifyStatus', '核销状态'],
214
- ] as const
215
207
  /** 新接口明确给出的业务类型;未登记代码保留接口原值。 */
216
208
  const busiTypeLabels: Record<string, string> = { '201': '兑回', '202': '兑出', '203': '付现' }
217
209
  const busiTypeOptions = Object.entries(busiTypeLabels).map(([value, label]) => ({ value, label }))
218
- const payDirecLabels: Record<string, string> = { I: '收入', O: '支出' }
210
+ /** 预报页面按业务字典展示中文,查询和编辑提交对应的字符串代码。 */
211
+ const payDirecLabels: Record<string, string> = { '1': '收入', '2': '支出' }
219
212
  const payDirecOptions = Object.entries(payDirecLabels).map(([value, label]) => ({ value, label }))
213
+ const payChannelLabels: Record<string, string> = { '8': '数字人民币' }
214
+ const payChannelOptions = Object.entries(payChannelLabels).map(([value, label]) => ({ value, label }))
215
+ const predStatusLabels: Record<string, string> = {
216
+ '1': '正常预报',
217
+ '2': '延迟预报',
218
+ '3': '正常预报正常删除',
219
+ '4': '正常预报延迟删除',
220
+ '5': '延迟预报延时删除',
221
+ '7': '正常预报新增超时',
222
+ '8': '延迟预报新增超时',
223
+ }
224
+ const predStatusOptions = Object.entries(predStatusLabels).map(([value, label]) => ({ value, label }))
225
+ const verifyStatusLabels: Record<string, string> = { '1': '未核销', '2': '已核销', '3': '部分核销' }
226
+ const verifyStatusOptions = Object.entries(verifyStatusLabels).map(([value, label]) => ({ value, label }))
227
+ // 已提供字典的筛选项使用下拉框,其余字段保留文本输入。
228
+ const listAdditionalFilters: {
229
+ key: 'clientName' | 'competName' | 'payChannel' | 'groundBranch' | 'predStatus' | 'verifyStatus'
230
+ label: string
231
+ options?: { value: string; label: string }[]
232
+ }[] = [
233
+ { key: 'clientName', label: '客户名称' },
234
+ { key: 'competName', label: '交易对手名称' },
235
+ { key: 'payChannel', label: '支付渠道', options: payChannelOptions },
236
+ { key: 'groundBranch', label: '落地机构' },
237
+ { key: 'predStatus', label: '预报状态', options: predStatusOptions },
238
+ { key: 'verifyStatus', label: '核销状态', options: verifyStatusOptions },
239
+ ]
220
240
  const sortRuleOptions = [
221
241
  { value: '1', label: '预报日期降序' },
222
242
  { value: '2', label: '预报日期升序' },
@@ -247,7 +267,7 @@ const isDetail = computed(() => detailDialogVisible.value)
247
267
 
248
268
  const listHasReference = (row: ForecastRow) => Boolean(row.predRefNo?.trim())
249
269
  const canChangeRecord = (row: ForecastRow) => listHasReference(row)
250
- && row.predStatus !== '3' && row.verifyStatus === '1'
270
+ && !['3', '4', '5'].includes(row.predStatus ?? '') && row.verifyStatus === '1'
251
271
  && !!normalizeAmount(row.verifyAmt ?? '') && compareAmounts(row.verifyAmt ?? '', '0') === 0
252
272
  const listTextColumn = (prop: keyof ForecastRow, label: string, width: number, visible = true): ColumnOption<ForecastRow> => ({
253
273
  prop, label, width, visible, showOverflowTooltip: true,
@@ -261,13 +281,13 @@ const listColumns: ColumnOption<ForecastRow>[] = [
261
281
  listTextColumn('clientName', '客户名称', 180),
262
282
  { ...listTextColumn('payDirec', '收支方向', 95), formatter: (row) => payDirecLabels[row.payDirec ?? ''] ?? row.payDirec ?? '—' },
263
283
  { ...listTextColumn('busiType', '业务类型', 110), formatter: (row) => busiTypeLabels[row.busiType ?? ''] ?? row.busiType ?? '—' },
264
- listTextColumn('payChannel', '支付渠道', 110),
284
+ { ...listTextColumn('payChannel', '支付渠道', 110), formatter: (row) => payChannelLabels[row.payChannel ?? ''] ?? row.payChannel ?? '—' },
265
285
  { prop: 'predAmt', label: '预报金额(元)', width: 180, align: 'right', useSlot: true, slotName: 'amount', ...localSort('predAmt', 'amount') },
266
286
  { prop: 'verifyAmt', label: '已核销金额(元)', width: 180, align: 'right', useSlot: true, slotName: 'verifiedAmount', ...localSort('verifyAmt', 'amount') },
267
287
  listTextColumn('competName', '交易对手名称', 180),
268
288
  listTextColumn('groundBranch', '落地机构', 160),
269
- listTextColumn('predStatus', '预报状态', 100),
270
- listTextColumn('verifyStatus', '核销状态', 100),
289
+ { ...listTextColumn('predStatus', '预报状态', 180), formatter: (row) => predStatusLabels[row.predStatus ?? ''] ?? row.predStatus ?? '—' },
290
+ { ...listTextColumn('verifyStatus', '核销状态', 100), formatter: (row) => verifyStatusLabels[row.verifyStatus ?? ''] ?? row.verifyStatus ?? '—' },
271
291
  listTextColumn('competAcct', '交易对手账号', 190, false),
272
292
  listTextColumn('clientType', '客户类型', 100, false),
273
293
  listTextColumn('groundBranchCode', '落地机构代码', 150, false),
@@ -433,7 +453,7 @@ type FieldKey = keyof ForecastFormValues
433
453
  type EditorField = {
434
454
  key: FieldKey
435
455
  label: string
436
- kind?: 'date' | 'amount' | 'textarea' | 'businessType' | 'direction'
456
+ kind?: 'date' | 'amount' | 'textarea' | 'businessType' | 'direction' | 'paymentChannel'
437
457
  placeholder?: string
438
458
  createOnly?: boolean
439
459
  }
@@ -457,7 +477,7 @@ const fieldGroups: { title: string; fields: EditorField[] }[] = [
457
477
  { key: 'predAmt', label: '预报金额(元)', kind: 'amount', placeholder: '请输入金额,最多两位小数' },
458
478
  { key: 'payDirec', label: '收支方向', kind: 'direction' },
459
479
  { key: 'busiType', label: '业务类型', kind: 'businessType' },
460
- { key: 'payChannel', label: '支付渠道代码', placeholder: '请输入支付渠道代码' },
480
+ { key: 'payChannel', label: '支付渠道', kind: 'paymentChannel' },
461
481
  { key: 'clientName', label: '客户名称' },
462
482
  { key: 'clientType', label: '客户类型代码', placeholder: '请输入客户类型代码' },
463
483
  ],
@@ -665,8 +685,8 @@ const detailGroups: { title: string; fields: DetailField[] }[] = [
665
685
  { key: 'tranDate', label: '交易日期', kind: 'date' },
666
686
  { key: 'predAmt', label: '预报金额(元)', kind: 'amount' },
667
687
  { key: 'standardName', label: '标准名称' },
668
- { key: 'predStatus', label: '预报状态代码', kind: 'status' },
669
- { key: 'verifyStatus', label: '核销状态代码', kind: 'status' },
688
+ { key: 'predStatus', label: '预报状态', kind: 'status' },
689
+ { key: 'verifyStatus', label: '核销状态', kind: 'status' },
670
690
  { key: 'verifyAmt', label: '已核销金额(元)', kind: 'amount' },
671
691
  { key: 'edusFlag', label: '释放状态代码', kind: 'status' },
672
692
  ],
@@ -676,7 +696,7 @@ const detailGroups: { title: string; fields: DetailField[] }[] = [
676
696
  fields: [
677
697
  { key: 'busiType', label: '业务类型代码' },
678
698
  { key: 'payDirec', label: '收支方向' },
679
- { key: 'payChannel', label: '支付渠道代码' },
699
+ { key: 'payChannel', label: '支付渠道' },
680
700
  { key: 'clientName', label: '客户名称' },
681
701
  { key: 'competName', label: '交易对手名称' },
682
702
  { key: 'competAcct', label: '交易对手账号' },
@@ -712,6 +732,9 @@ const displayValue = (field: DetailField) => {
712
732
  if (field.kind === 'date') return formatDate(value)
713
733
  if (field.key === 'busiType') return busiTypeLabels[value] ?? value
714
734
  if (field.key === 'payDirec') return payDirecLabels[value] ?? value
735
+ if (field.key === 'payChannel') return payChannelLabels[value] ?? value
736
+ if (field.key === 'predStatus') return predStatusLabels[value] ?? value
737
+ if (field.key === 'verifyStatus') return verifyStatusLabels[value] ?? value
715
738
  return String(value)
716
739
  }
717
740
 
@@ -805,6 +828,14 @@ watch([detailDialogVisible, detailDialogPredRefNo], ([visible]) => {
805
828
  >
806
829
  <el-option v-for="option in payDirecOptions" :key="option.value" :label="option.label" :value="option.value" />
807
830
  </el-select>
831
+ <el-select
832
+ v-else-if="field.kind === 'paymentChannel'"
833
+ v-model="form.payChannel"
834
+ placeholder="请选择支付渠道"
835
+ clearable
836
+ >
837
+ <el-option v-for="option in payChannelOptions" :key="option.value" :label="option.label" :value="option.value" />
838
+ </el-select>
808
839
  <el-input
809
840
  v-else-if="field.kind === 'textarea'"
810
841
  v-model="form[field.key]"
@@ -896,9 +927,11 @@ watch([detailDialogVisible, detailDialogPredRefNo], ([visible]) => {
896
927
  <el-option v-for="option in payDirecOptions" :key="option.value" :label="option.label" :value="option.value" />
897
928
  </el-select>
898
929
  </el-form-item>
899
- <!-- label 为查询字段名称,输入框较窄,占位文案统一为简短提示。 -->
900
- <el-form-item v-for="[key, label] in listTextFilters" :key="key" :label="label">
901
- <el-input v-model="listFilters[key]" placeholder="请输入" :maxlength="200" clearable />
930
+ <el-form-item v-for="filter in listAdditionalFilters" :key="filter.key" :label="filter.label">
931
+ <el-select v-if="filter.options" v-model="listFilters[filter.key]" placeholder="全部" clearable>
932
+ <el-option v-for="option in filter.options" :key="option.value" :label="option.label" :value="option.value" />
933
+ </el-select>
934
+ <el-input v-else v-model="listFilters[filter.key]" placeholder="请输入" :maxlength="200" clearable />
902
935
  </el-form-item>
903
936
  <el-form-item label="排序规则">
904
937
  <el-select v-model="listFilters.sortRule" clearable placeholder="默认排序">
@@ -23,9 +23,9 @@ export interface Tam120501001InBody {
23
23
  groundBranchName?: string
24
24
  /** 联系人 */
25
25
  linkMan?: string
26
- /** 支付渠道 */
26
+ /** 支付渠道:8 数字人民币。 */
27
27
  payChannel?: string
28
- /** 收支方向 */
28
+ /** 收支方向:1 收入、2 支出。 */
29
29
  payDirec: string
30
30
  /** 联系电话 */
31
31
  phoneNo?: string
@@ -63,9 +63,9 @@ export interface Tam120501002InBody {
63
63
  groundBranchName?: string
64
64
  /** 联系人 */
65
65
  linkMan?: string
66
- /** 支付渠道 */
66
+ /** 支付渠道:8 数字人民币。 */
67
67
  payChannel?: string
68
- /** 收支方向 */
68
+ /** 收支方向:1 收入、2 支出。 */
69
69
  payDirec?: string
70
70
  /** 联系电话 */
71
71
  phoneNo?: string
@@ -101,11 +101,11 @@ export interface Tam140501001InBody {
101
101
  endTransAmt?: string
102
102
  /** 落地机构 */
103
103
  groundBranch?: string
104
- /** 支付渠道 */
104
+ /** 支付渠道:8 数字人民币。 */
105
105
  payChannel?: string
106
- /** 收支方向 */
106
+ /** 收支方向:1 收入、2 支出。 */
107
107
  payDirec?: string
108
- /** 预报状态 */
108
+ /** 预报状态:1 正常预报、2 延迟预报、3 正常预报正常删除、4 正常预报延迟删除、5 延迟预报延时删除、7 正常预报新增超时、8 延迟预报新增超时。 */
109
109
  predStatus?: string
110
110
  /** 排序 */
111
111
  sortRule?: string
@@ -113,7 +113,7 @@ export interface Tam140501001InBody {
113
113
  startTransAmt?: string
114
114
  /** 交易时间 */
115
115
  tranDate: string
116
- /** 核销状态 */
116
+ /** 核销状态:1 未核销、2 已核销、3 部分核销。 */
117
117
  verifyStatus?: string
118
118
  }
119
119
 
@@ -145,9 +145,9 @@ export interface Tam140501001OutBodyResultList {
145
145
  groundBranch?: string
146
146
  /** 机构代码 */
147
147
  groundBranchCode?: string
148
- /** 支付渠道 */
148
+ /** 支付渠道:8 数字人民币。 */
149
149
  payChannel?: string
150
- /** 收支方向 */
150
+ /** 收支方向:1 收入、2 支出。 */
151
151
  payDirec?: string
152
152
  /** 预报金额 */
153
153
  predAmt?: string
@@ -157,7 +157,7 @@ export interface Tam140501001OutBodyResultList {
157
157
  predDate?: string
158
158
  /** 预报流水号 */
159
159
  predRefNo?: string
160
- /** 预报状态 */
160
+ /** 预报状态:1 正常预报、2 延迟预报、3 正常预报正常删除、4 正常预报延迟删除、5 延迟预报延时删除、7 正常预报新增超时、8 延迟预报新增超时。 */
161
161
  predStatus?: string
162
162
  /** 标准名称 */
163
163
  standardName?: string
@@ -165,7 +165,7 @@ export interface Tam140501001OutBodyResultList {
165
165
  tranDate?: string
166
166
  /** 已核销金额 */
167
167
  verifyAmt?: string
168
- /** 核销状态 */
168
+ /** 核销状态:1 未核销、2 已核销、3 部分核销。 */
169
169
  verifyStatus?: string
170
170
  }
171
171
 
@@ -189,15 +189,15 @@ export interface Tam140501002OutBody {
189
189
  edusFlag?: string
190
190
  /** 落地机构名称 */
191
191
  groundBranchName?: string
192
- /** 支付渠道 */
192
+ /** 支付渠道:8 数字人民币。 */
193
193
  payChannel?: string
194
- /** 收支方向 */
194
+ /** 收支方向:1 收入、2 支出。 */
195
195
  payDirec?: string
196
196
  /** 预报金额 */
197
197
  predAmt?: string
198
198
  /** 预报流水号 */
199
199
  predRefNo?: string
200
- /** 预报状态 */
200
+ /** 预报状态:1 正常预报、2 延迟预报、3 正常预报正常删除、4 正常预报延迟删除、5 延迟预报延时删除、7 正常预报新增超时、8 延迟预报新增超时。 */
201
201
  predStatus?: string
202
202
  /** 标准名称 */
203
203
  standardName?: string
@@ -205,7 +205,7 @@ export interface Tam140501002OutBody {
205
205
  tranDate?: string
206
206
  /** 已核销金额 */
207
207
  verifyAmt?: string
208
- /** 核销状态 */
208
+ /** 核销状态:1 未核销、2 已核销、3 部分核销。 */
209
209
  verifyStatus?: string
210
210
  }
211
211
 
@@ -4,7 +4,6 @@ import type {
4
4
  ForecastQueryParams,
5
5
  Tam120502002InBody,
6
6
  Tam120502003InBody,
7
- Tam140502001OutBody,
8
7
  } from './typs'
9
8
 
10
9
  // 同一操作的相同请求失败后复用流水号,避免响应丢失后重试导致重复记账。
@@ -51,33 +50,14 @@ export default {
51
50
  * clientName 为客户名称,competName 为交易对手名称,payDirec 为收支方向(1 收入、2 支出),
52
51
  * startTransAmt、endTransAmt 为金额范围,verifyStatusList 待核销传 [1,3]、已核销传 [2]。
53
52
  */
54
- queryForecastApi: async (params: ForecastQueryParams) => {
55
- // 文档/页面的核销预报方向为 1/2,当前后端实际使用 I/O;只在 API 边界转换。
56
- const requestDirections: Record<string, string> = { '1': 'I', '2': 'O' }
57
- const responseDirections: Record<string, string> = { I: '1', O: '2' }
58
- const response = await baseHttpClient.post<any>('/TAM/0001/140502001', {
59
- ...params,
60
- payDirec: params.payDirec ? requestDirections[params.payDirec] ?? params.payDirec : undefined,
61
- })
62
- const body: Tam140502001OutBody | null = response.body
63
- if (!body || !Array.isArray(body.resultList)) return response
64
- return {
65
- ...response,
66
- body: {
67
- ...body,
68
- resultList: body.resultList.map((row) => ({
69
- ...row,
70
- payDirec: row.payDirec ? responseDirections[row.payDirec] ?? row.payDirec : row.payDirec,
71
- })),
72
- },
73
- }
74
- },
53
+ queryForecastApi: (params: ForecastQueryParams) =>
54
+ baseHttpClient.post<any>('/TAM/0001/140502001', params),
75
55
  /**
76
56
  * 分页查询核销流水信息。
77
57
  * @param params 查询参数:tranDate 为交易日期(必填,YYYYMMDD);pageIndex、pageSize 为页码和每页条数。
78
58
  * 业务筛选:busiType 为业务类型(201 兑回、202 兑出、203 付现),orgName 为我方机构,
79
59
  * payerName、payeeName 为付款人和收款人名称,
80
- * payDirec 为收支方向,startTransAmt、endTransAmt 为金额范围,verifyStatus 为核销状态。
60
+ * payDirec 为收支方向(I 收入、O 支出),startTransAmt、endTransAmt 为金额范围,verifyStatus 为核销状态。
81
61
  */
82
62
  queryFlowApi: (params: unknown) => baseHttpClient.post<any>("/TAM/0001/140502002", params)
83
63
  }
@@ -118,9 +118,9 @@ const compareAmounts = (left: string, right: string): number => {
118
118
 
119
119
  /** 业务类型字典:201 兑回、202 兑出、203 付现;超出字典的值保留原文。 */
120
120
  const busiTypeLabels: Record<string, string> = { '201': '兑回', '202': '兑出', '203': '付现' }
121
- /** 界面保留预报 1/2,API 层转换当前后端的 I/O;流水直接使用 I/O。 */
121
+ /** 预报使用 1 收入、2 支出;流水使用 I 收入、O 支出,查询按各自编码提交。 */
122
122
  const forecastPayDirecLabels: Record<string, string> = { '1': '收入', '2': '支出' }
123
- const flowPayDirecLabels: Record<string, string> = { I: '来账', O: '往账' }
123
+ const flowPayDirecLabels: Record<string, string> = { I: '收入', O: '支出' }
124
124
  /** 支付渠道:核销预报为 8、流水为 5,均表示数字人民币;其余渠道保留原文。 */
125
125
  const payChannelLabels: Record<string, string> = { '5': '数字人民币', '8': '数字人民币' }
126
126
  /** 响应核销状态字典;流水筛选仍按请求协议仅提供 1、2。 */
@@ -607,7 +607,7 @@ type FlowAppliedQuery = {
607
607
  busiType?: string // 业务类型:201 兑回、202 兑出、203 付现。
608
608
  payerName?: string // 付款人名称。
609
609
  payeeName?: string // 收款人名称。
610
- payDirec?: string // 收支方向:I 来账、O 往账。
610
+ payDirec?: string // 收支方向:I 收入、O 支出。
611
611
  startTransAmt?: string // 起始金额,查询提交时已由万元转换为元。
612
612
  endTransAmt?: string // 截止金额,查询提交时已由万元转换为元。
613
613
  verifyStatus?: string // 核销状态:1 未核销、2 已核销。
@@ -637,7 +637,7 @@ const flowTextFilters = [
637
637
 
638
638
  // 列表、分页与请求状态;请求序号防止旧响应覆盖新结果。
639
639
  const flowRows = ref<FlowRow[]>([])
640
- /** 只计算勾选流水的轧差:来账收入减去往账支出,未勾选时为 0.00。 */
640
+ /** 只计算勾选流水的轧差:收入减去支出,未勾选时为 0.00。 */
641
641
  const selectedFlowNetAmount = computed(() => formatCents(flowSelection.value.reduce((total, row) => {
642
642
  const direction = row.payDirec?.trim()
643
643
  if (direction === 'I') return total + amountToCents(row.tranAmt)
@@ -152,7 +152,7 @@ export interface Tam140502002InBody {
152
152
  endTransAmt?: string
153
153
  /** 我方机构 */
154
154
  orgName?: string
155
- /** 收支方向 */
155
+ /** 收支方向:I 收入、O 支出。 */
156
156
  payDirec?: string
157
157
  /** 收款人名称 */
158
158
  payeeName?: string
@@ -198,7 +198,7 @@ export interface Tam140502002OutBodyResultList {
198
198
  payBankNo?: string
199
199
  /** 支付渠道,5:数字人民币 */
200
200
  payChannel?: string
201
- /** 收支方向,I=来账 O=往账 */
201
+ /** 收支方向:I 收入、O 支出。 */
202
202
  payDirec?: string
203
203
  /** 付款钱包ID */
204
204
  payWltId?: string