vue3-element-plus-app-chu 0.0.19 → 0.0.21
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 +4 -0
- package/package.json +1 -1
- package/src/components/table/ArtTableHeader.vue +29 -6
- package/src/router/index.ts +7 -0
- package/src/router/menus.ts +1 -0
- package/src/view/dcps/README.md +3 -1
- package/src/view/dcps/auth/index.vue +13 -13
- package/src/view/dcps/city-clearing/parameters/api.ts +36 -0
- package/src/view/dcps/city-clearing/parameters/typs.ts +82 -0
- package/src/view/dcps/estimation/index.vue +9 -5
- package/src/view/dcps/forecast/index.vue +13 -11
- package/src/view/dcps/funding/balance/api.ts +3 -3
- package/src/view/dcps/funding/balance/index.vue +2 -2
- package/src/view/dcps/funding/injection/index.vue +3 -1
- package/src/view/dcps/parameters/api.ts +26 -0
- package/src/view/dcps/parameters/index.vue +506 -0
- package/src/view/dcps/parameters/typs.ts +18 -0
- package/src/view/dcps/runtime.ts +11 -30
- package/src/view/dcps/write-off/index.vue +17 -10
package/README.md
CHANGED
|
@@ -31,3 +31,7 @@ pnpm dev:backend # 只启动后端(backend/ 目录,tsx watch)
|
|
|
31
31
|
- 新增、修改、详情页面每行四列展示,窗口变窄后依次降为三列、两列、一列。
|
|
32
32
|
|
|
33
33
|
本地后端的预报接口当前使用通用模拟响应,写入成功响应不代表真实持久化。
|
|
34
|
+
|
|
35
|
+
## 城银清头寸参数接口
|
|
36
|
+
|
|
37
|
+
新增、修改、删除、查询、详情五个接口的封装及类型位于 `src/view/dcps/city-clearing/parameters/`,本次仅提供接口层。城银清查询与详情使用 `moduleCode: '3'`。本地后端提供符合字段契约的模拟响应及参数校验,写操作不持久化;接口字段和示例见 [城银清头寸参数接口说明](docs/city-clearing-parameters-apis.md),Scalar 文档入口为后端 `/docs`。
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="art-table-header">
|
|
2
|
+
<div class="art-table-header" :class="`art-table-header--${localSettings.size}`">
|
|
3
3
|
<div class="art-table-header__left">
|
|
4
4
|
<slot name="title">
|
|
5
5
|
<span v-if="title" class="art-table-header__title">{{ title }}</span>
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
<ElDropdown
|
|
38
38
|
v-if="shouldShow('size')"
|
|
39
|
+
:size="localSettings.size"
|
|
39
40
|
trigger="click"
|
|
40
41
|
:teleported="false"
|
|
41
42
|
@command="changeSize"
|
|
@@ -121,6 +122,7 @@
|
|
|
121
122
|
|
|
122
123
|
<ElCheckbox
|
|
123
124
|
class="art-table-header__column-check"
|
|
125
|
+
:size="localSettings.size"
|
|
124
126
|
:model-value="getColumnVisibility(column)"
|
|
125
127
|
:disabled="column.disabled"
|
|
126
128
|
@update:model-value="changeVisibility(index, $event)"
|
|
@@ -177,6 +179,7 @@
|
|
|
177
179
|
<div class="art-table-header__settings">
|
|
178
180
|
<ElCheckbox
|
|
179
181
|
v-if="showZebra"
|
|
182
|
+
:size="localSettings.size"
|
|
180
183
|
:model-value="localSettings.stripe"
|
|
181
184
|
@update:model-value="changeBooleanSetting('stripe', $event)"
|
|
182
185
|
>
|
|
@@ -184,6 +187,7 @@
|
|
|
184
187
|
</ElCheckbox>
|
|
185
188
|
<ElCheckbox
|
|
186
189
|
v-if="showBorder"
|
|
190
|
+
:size="localSettings.size"
|
|
187
191
|
:model-value="localSettings.border"
|
|
188
192
|
@update:model-value="changeBooleanSetting('border', $event)"
|
|
189
193
|
>
|
|
@@ -191,6 +195,7 @@
|
|
|
191
195
|
</ElCheckbox>
|
|
192
196
|
<ElCheckbox
|
|
193
197
|
v-if="showHeaderBackground"
|
|
198
|
+
:size="localSettings.size"
|
|
194
199
|
:model-value="localSettings.headerBackground"
|
|
195
200
|
@update:model-value="changeBooleanSetting('headerBackground', $event)"
|
|
196
201
|
>
|
|
@@ -400,6 +405,10 @@ function clearDrag() {
|
|
|
400
405
|
|
|
401
406
|
<style scoped>
|
|
402
407
|
.art-table-header {
|
|
408
|
+
--art-table-control-size: 32px;
|
|
409
|
+
--art-table-move-width: 26px;
|
|
410
|
+
--art-table-move-height: 28px;
|
|
411
|
+
--art-table-column-height: 34px;
|
|
403
412
|
display: flex;
|
|
404
413
|
align-items: center;
|
|
405
414
|
justify-content: space-between;
|
|
@@ -409,6 +418,20 @@ function clearDrag() {
|
|
|
409
418
|
color: var(--art-table-text-color, var(--el-text-color-primary, #303133));
|
|
410
419
|
}
|
|
411
420
|
|
|
421
|
+
.art-table-header--small {
|
|
422
|
+
--art-table-control-size: 24px;
|
|
423
|
+
--art-table-move-width: 22px;
|
|
424
|
+
--art-table-move-height: 24px;
|
|
425
|
+
--art-table-column-height: 26px;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.art-table-header--large {
|
|
429
|
+
--art-table-control-size: 40px;
|
|
430
|
+
--art-table-move-width: 30px;
|
|
431
|
+
--art-table-move-height: 32px;
|
|
432
|
+
--art-table-column-height: 42px;
|
|
433
|
+
}
|
|
434
|
+
|
|
412
435
|
.art-table-header__left,
|
|
413
436
|
.art-table-header__right {
|
|
414
437
|
display: flex;
|
|
@@ -435,8 +458,8 @@ function clearDrag() {
|
|
|
435
458
|
align-items: center;
|
|
436
459
|
justify-content: center;
|
|
437
460
|
flex-shrink: 0;
|
|
438
|
-
width:
|
|
439
|
-
height:
|
|
461
|
+
width: var(--art-table-control-size);
|
|
462
|
+
height: var(--art-table-control-size);
|
|
440
463
|
padding: 0;
|
|
441
464
|
border: 0;
|
|
442
465
|
border-radius: var(--art-table-toolbar-radius, 6px);
|
|
@@ -479,7 +502,7 @@ function clearDrag() {
|
|
|
479
502
|
display: flex;
|
|
480
503
|
align-items: center;
|
|
481
504
|
gap: 8px;
|
|
482
|
-
min-height:
|
|
505
|
+
min-height: var(--art-table-column-height);
|
|
483
506
|
padding: 0 4px;
|
|
484
507
|
border-radius: 4px;
|
|
485
508
|
background: transparent;
|
|
@@ -523,8 +546,8 @@ function clearDrag() {
|
|
|
523
546
|
}
|
|
524
547
|
|
|
525
548
|
.art-table-header__move {
|
|
526
|
-
width:
|
|
527
|
-
height:
|
|
549
|
+
width: var(--art-table-move-width);
|
|
550
|
+
height: var(--art-table-move-height);
|
|
528
551
|
border-radius: 4px;
|
|
529
552
|
background: transparent;
|
|
530
553
|
}
|
package/src/router/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ import DigitalRmbForecast from '@/view/dcps/forecast/index.vue'
|
|
|
6
6
|
import DigitalRmbInjection from '@/view/dcps/funding/injection/index.vue'
|
|
7
7
|
import DigitalRmbWriteOff from '@/view/dcps/write-off/index.vue'
|
|
8
8
|
import DigitalRmbPositionEstimation from '@/view/dcps/estimation/index.vue'
|
|
9
|
+
import DigitalRmbParameters from '@/view/dcps/parameters/index.vue'
|
|
9
10
|
|
|
10
11
|
declare module 'vue-router' {
|
|
11
12
|
interface RouteMeta {
|
|
@@ -98,6 +99,12 @@ const routes: RouteRecordRaw[] = [
|
|
|
98
99
|
component: DigitalRmbWriteOff,
|
|
99
100
|
meta: { menu: 'write-off', title: '数字人民币核销' },
|
|
100
101
|
},
|
|
102
|
+
{
|
|
103
|
+
path: 'parameters',
|
|
104
|
+
name: 'parameters',
|
|
105
|
+
component: DigitalRmbParameters,
|
|
106
|
+
meta: { menu: 'parameters', title: '数字人民币参数管理' },
|
|
107
|
+
},
|
|
101
108
|
],
|
|
102
109
|
},
|
|
103
110
|
{ path: '/:pathMatch(.*)*', redirect: { name: 'forecast' } },
|
package/src/router/menus.ts
CHANGED
package/src/view/dcps/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`src/view/dcps` 下每个业务页面统一保持三个文件,不再拆分子组件、工具文件:
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
跨页面共用的运行时配置统一放在 `src/view/dcps/runtime.ts`,仅默认导出一个对象,包含 `date`(共用业务日期,格式为 `YYYYMMDD`)、`approverId`(工号)和 `approverName`(姓名)。日期在模块加载时按上海时区生成一次,预报、匡算、核销及授权查询的默认日期均使用同一个 `date`;授权日期范围的开始和结束默认都取该值。页面通过 `import dcpsRuntime from '../runtime'`(分组子页面为 `../../runtime`)引入,不再单独导出日期工具或模块配置。
|
|
6
6
|
|
|
7
7
|
一级菜单为分组时,页面放在该分组目录下。例如“注资/预注资管理”的两个页面分别位于 `funding/injection/` 和 `funding/balance/`,各自保留下面三个文件。
|
|
8
8
|
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
| `/funding/balance` | `balance` | `funding/balance/index.vue` | 页面 | 数字人民币账户行余额查询申请 |
|
|
38
38
|
| `/auth` | `auth` | `auth/index.vue` | 页面 | 数字人民币授权 |
|
|
39
39
|
| `/write-off` | `write-off` | `write-off/index.vue` | 页面 | 数字人民币核销 |
|
|
40
|
+
| `/parameters` | `parameters` | `parameters/index.vue` | 列表、详情、新增和修改弹窗 | 数字人民币参数管理 |
|
|
40
41
|
| `/` | — | 重定向到 `forecast` | — | — |
|
|
41
42
|
| `/:pathMatch(.*)*` | — | 重定向到 `forecast`(404 兜底) | — | — |
|
|
42
43
|
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
- `forecast/index.vue` 顶部使用一个普通 `<script>` 块保存列表记录缓存,跳转修改或详情前暂存列表行,用于补齐详情接口未返回的字段。
|
|
47
48
|
- 侧边菜单配置在 `src/router/menus.ts`,其中 `name` 必须与对应路由的 `name` 保持一致;分组菜单通过 `children` 配置二级页面,页面的 `meta.menu` 指向自己的菜单项。
|
|
48
49
|
- “注资/预注资管理”对应 `funding` 分组,包含注资明细查询和账户行余额查询申请两个页面;访问子页面时自动展开父菜单。旧地址 `/injection`、`/balance` 保留为对应页面的别名。
|
|
50
|
+
- 数字人民币参数管理为末尾的独立菜单,页面文件为 `parameters/index.vue`、`parameters/api.ts`、`parameters/typs.ts`。页面复用“城银清算头寸管理-头寸参数”的五个接口,查询、详情及新增固定传 `moduleCode: '5'`。本次用户确认以 `paraName` 定位修改和删除:修改时锁定原参数名称、参数标志只读;删除使用由参数名称组成的 `sysParaList` 数组。当前本地后端仍返回模拟结果,不保存参数。
|
|
49
51
|
- `src/layout/index.vue` 使用 `<KeepAlive include="DcpsForecastPage">` 缓存头寸预报页面;新增、修改、详情按路由 `key` 分别缓存,返回列表时自动重新查询。
|
|
50
52
|
|
|
51
53
|
## 新增页面检查清单
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue'
|
|
3
|
-
import { ElMessage } from 'element-plus'
|
|
3
|
+
import { ElConfigProvider, ElMessage } from 'element-plus'
|
|
4
4
|
import { ArtDataTable, type ColumnOption, type PaginationOptions, type TableSettings } from '@/components/table'
|
|
5
5
|
import API from './api'
|
|
6
|
-
import {
|
|
6
|
+
import { dcpsRuntime } from '../runtime'
|
|
7
7
|
import type { AuthorizationFilters, AuthorizationQueryParams, AuthorizationTask } from './typs'
|
|
8
8
|
|
|
9
9
|
defineOptions({ name: 'DcpsAuthPage' })
|
|
@@ -21,8 +21,8 @@ const defaultFilters: AuthorizationFilters = {
|
|
|
21
21
|
}
|
|
22
22
|
// 默认创建日期范围:[开始日期, 结束日期],格式为 YYYYMMDD,查询重置时使用。
|
|
23
23
|
const defaultDates: [string, string] = [
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
dcpsRuntime.date,
|
|
25
|
+
dcpsRuntime.date,
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
// 重复输入项共用一份配置,依次为字段、名称和长度限制。
|
|
@@ -270,8 +270,8 @@ const getQueryFilters = () => ({
|
|
|
270
270
|
payeeName: filters.value.payeeName.trim(), // 收款人名称。
|
|
271
271
|
platfSeqNo: filters.value.platfSeqNo.trim(), // 平台流水号。
|
|
272
272
|
taskSts: filters.value.taskSts, // 任务状态,空值表示全部。
|
|
273
|
-
createTmBegin: dateRange.value?.[0] ||
|
|
274
|
-
createTmEnd: dateRange.value?.[1] || dateRange.value?.[0] ||
|
|
273
|
+
createTmBegin: dateRange.value?.[0] || dcpsRuntime.date, // 创建开始日期,格式为 YYYYMMDD,未选择时取默认值。
|
|
274
|
+
createTmEnd: dateRange.value?.[1] || dateRange.value?.[0] || dcpsRuntime.date, // 创建结束日期,格式为 YYYYMMDD,缺失时回退到开始日期或默认值。
|
|
275
275
|
})
|
|
276
276
|
// 仅查询、重置时更新;翻页和刷新沿用这份条件。
|
|
277
277
|
let appliedQuery = getQueryFilters()
|
|
@@ -355,8 +355,8 @@ const openDecisionDialog = (task: any) => {
|
|
|
355
355
|
const submitDecision = async (decision: Decision) => {
|
|
356
356
|
const platfSeqNo = selectedTask.value?.platfSeqNo?.trim() // 本次审批任务的平台流水号,用于唯一定位任务。
|
|
357
357
|
if (!canApprove(selectedTask.value) || !platfSeqNo || pendingDecision.value || loading.value) return
|
|
358
|
-
const approverId =
|
|
359
|
-
const approverName =
|
|
358
|
+
const approverId = dcpsRuntime.approverId.trim() // 本次提交的审批人工号,同时作为公共用户标识。
|
|
359
|
+
const approverName = dcpsRuntime.approverName.trim() // 本次提交的审批人姓名。
|
|
360
360
|
const remarkText = remark.value.trim() // 去除首尾空白后的备注或拒绝原因。
|
|
361
361
|
if (!approverId || !approverName) {
|
|
362
362
|
ElMessage.warning('审批人信息未设置')
|
|
@@ -406,6 +406,7 @@ onBeforeUnmount(() => {
|
|
|
406
406
|
</script>
|
|
407
407
|
|
|
408
408
|
<template>
|
|
409
|
+
<ElConfigProvider :size="tableSettings.size">
|
|
409
410
|
<main class="dcps-page">
|
|
410
411
|
<!-- 查询条件:控件尺寸跟随表格设置,卡片内边距为 10px,点击查询生效。 -->
|
|
411
412
|
<el-card v-show="showSearchBar" class="authorization-search" shadow="never" :body-style="{ padding: '10px' }">
|
|
@@ -474,7 +475,6 @@ onBeforeUnmount(() => {
|
|
|
474
475
|
<el-button
|
|
475
476
|
text
|
|
476
477
|
bg
|
|
477
|
-
size="small"
|
|
478
478
|
type="primary"
|
|
479
479
|
:disabled="!canApprove(row) || loading || !!pendingDecision"
|
|
480
480
|
@click.stop="openDecisionDialog(row)"
|
|
@@ -535,9 +535,8 @@ onBeforeUnmount(() => {
|
|
|
535
535
|
</el-scrollbar>
|
|
536
536
|
|
|
537
537
|
<template #footer>
|
|
538
|
-
<el-button
|
|
538
|
+
<el-button @click="detailDialogVisible = false">关闭</el-button>
|
|
539
539
|
<el-button
|
|
540
|
-
size="small"
|
|
541
540
|
type="primary"
|
|
542
541
|
:disabled="loading || !!pendingDecision || !canApprove(detailTask)"
|
|
543
542
|
@click="openDecisionDialog(detailTask)"
|
|
@@ -571,12 +570,12 @@ onBeforeUnmount(() => {
|
|
|
571
570
|
<el-row :gutter="14">
|
|
572
571
|
<el-col :xs="24" :sm="12">
|
|
573
572
|
<el-form-item label="审批人工号">
|
|
574
|
-
<el-input :model-value="
|
|
573
|
+
<el-input :model-value="dcpsRuntime.approverId" disabled />
|
|
575
574
|
</el-form-item>
|
|
576
575
|
</el-col>
|
|
577
576
|
<el-col :xs="24" :sm="12">
|
|
578
577
|
<el-form-item label="审批人姓名">
|
|
579
|
-
<el-input :model-value="
|
|
578
|
+
<el-input :model-value="dcpsRuntime.approverName" readonly />
|
|
580
579
|
</el-form-item>
|
|
581
580
|
</el-col>
|
|
582
581
|
</el-row>
|
|
@@ -608,6 +607,7 @@ onBeforeUnmount(() => {
|
|
|
608
607
|
</template>
|
|
609
608
|
</el-dialog>
|
|
610
609
|
</main>
|
|
610
|
+
</ElConfigProvider>
|
|
611
611
|
</template>
|
|
612
612
|
|
|
613
613
|
<style scoped>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import baseHttpClient, { type ApiResponse } from '@chic/http'
|
|
2
|
+
import type {
|
|
3
|
+
CityClearingParameterParams,
|
|
4
|
+
Tam120305001InBody,
|
|
5
|
+
Tam120305001OutBody,
|
|
6
|
+
Tam120305002InBody,
|
|
7
|
+
Tam120305002OutBody,
|
|
8
|
+
Tam120305003InBody,
|
|
9
|
+
Tam120305003OutBody,
|
|
10
|
+
Tam140305001InBody,
|
|
11
|
+
Tam140305001OutBody,
|
|
12
|
+
Tam140305002InBody,
|
|
13
|
+
Tam140305002OutBody,
|
|
14
|
+
} from './typs'
|
|
15
|
+
|
|
16
|
+
export default {
|
|
17
|
+
/** 查询头寸参数;城银清 moduleCode 为 3,分页放在公共 head 中。 */
|
|
18
|
+
queryListApi: (params: CityClearingParameterParams<Tam140305001InBody>) =>
|
|
19
|
+
baseHttpClient.post<ApiResponse<Tam140305001OutBody>>('/TAM/0001/140305001', params),
|
|
20
|
+
|
|
21
|
+
/** 查询参数详情;附件未声明 paraName 的唯一性或必填规则。 */
|
|
22
|
+
getDetailApi: (params: CityClearingParameterParams<Tam140305002InBody>) =>
|
|
23
|
+
baseHttpClient.post<ApiResponse<Tam140305002OutBody>>('/TAM/0001/140305002', params),
|
|
24
|
+
|
|
25
|
+
/** 新增头寸参数;当前本地接口仅返回模拟响应,不保存参数。 */
|
|
26
|
+
addApi: (params: CityClearingParameterParams<Tam120305002InBody>) =>
|
|
27
|
+
baseHttpClient.post<ApiResponse<Tam120305002OutBody>>('/TAM/0001/120305002', params),
|
|
28
|
+
|
|
29
|
+
/** 修改头寸参数;附件未提供明确的记录定位规则。 */
|
|
30
|
+
editApi: (params: CityClearingParameterParams<Tam120305003InBody>) =>
|
|
31
|
+
baseHttpClient.post<ApiResponse<Tam120305003OutBody>>('/TAM/0001/120305003', params),
|
|
32
|
+
|
|
33
|
+
/** 删除头寸参数;sysParaList 数组项的标识含义尚未定义。 */
|
|
34
|
+
deleteApi: (params: CityClearingParameterParams<Tam120305001InBody>) =>
|
|
35
|
+
baseHttpClient.post<ApiResponse<Tam120305001OutBody>>('/TAM/0001/120305001', params),
|
|
36
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { DigitalRmbHead } from '@/utils/digital-rmb-request'
|
|
2
|
+
|
|
3
|
+
/** 城银清算头寸参数接口类型,字段及可选性对应附件原始 schema。 */
|
|
4
|
+
export interface CityClearingParameter {
|
|
5
|
+
/** 参数描述 */
|
|
6
|
+
paraDesc?: string
|
|
7
|
+
/** 参数标志;附件未声明取值或枚举。 */
|
|
8
|
+
paraMark?: string
|
|
9
|
+
/** 参数名称;附件未声明唯一性。 */
|
|
10
|
+
paraName?: string
|
|
11
|
+
/** 参数类型;附件未声明取值或枚举。 */
|
|
12
|
+
paraType?: string
|
|
13
|
+
/** 参数值,保留原始字符串。 */
|
|
14
|
+
paraValue?: string
|
|
15
|
+
/** 备注 */
|
|
16
|
+
remark?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Tam120305001In.Body:删除;数组项对应的标识含义尚未声明。 */
|
|
20
|
+
export interface Tam120305001InBody {
|
|
21
|
+
sysParaList?: string[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Tam120305002In.Body:新增;原始 schema 未声明必填字段。 */
|
|
25
|
+
export interface Tam120305002InBody extends CityClearingParameter {
|
|
26
|
+
/** 模块代码:1 人民币、2 外币、3 城银清、4 跨境、5 数币。 */
|
|
27
|
+
moduleCode?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Tam120305003In.Body:修改;附件没有模块代码、原始参数名称或独立标识字段。 */
|
|
31
|
+
export interface Tam120305003InBody {
|
|
32
|
+
/** 参数说明 */
|
|
33
|
+
paraDesc?: string
|
|
34
|
+
/** 参数名称,不能据此推断唯一定位规则。 */
|
|
35
|
+
paraName?: string
|
|
36
|
+
/** 原始字段说明为“备注”,字段名仍为 paraType。 */
|
|
37
|
+
paraType?: string
|
|
38
|
+
/** 参数值 */
|
|
39
|
+
paraValue?: string
|
|
40
|
+
/** 备注 */
|
|
41
|
+
remark?: string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Tam140305001In.Body:列表查询,仅 moduleCode 在原始 schema 中必填。 */
|
|
45
|
+
export interface Tam140305001InBody {
|
|
46
|
+
/** 查询关键字 */
|
|
47
|
+
keywords?: string
|
|
48
|
+
/** 模块代码;城银清使用 3。 */
|
|
49
|
+
moduleCode: string
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Tam140305002In.Body:详情查询,仅 moduleCode 在原始 schema 中必填。 */
|
|
53
|
+
export interface Tam140305002InBody {
|
|
54
|
+
/** 模块代码;城银清使用 3。 */
|
|
55
|
+
moduleCode: string
|
|
56
|
+
/** 参数名称;原始 schema 未声明必填或唯一性。 */
|
|
57
|
+
paraName?: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 三个写接口的原始响应 body 均未声明业务字段。 */
|
|
61
|
+
export type Tam120305001OutBody = Record<string, never>
|
|
62
|
+
export type Tam120305002OutBody = Record<string, never>
|
|
63
|
+
export type Tam120305003OutBody = Record<string, never>
|
|
64
|
+
|
|
65
|
+
/** Tam140305001Out.Body */
|
|
66
|
+
export interface Tam140305001OutBody {
|
|
67
|
+
resultList?: CityClearingParameter[]
|
|
68
|
+
/** 总条数,按契约保留字符串。 */
|
|
69
|
+
totalCount?: string
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** 与列表行使用相同的六个参数字段,原始 schema 均未声明必填。 */
|
|
73
|
+
export type Tam140305002OutBody = CityClearingParameter
|
|
74
|
+
|
|
75
|
+
/** 复用现有公共头类型,支持显式 TAM 信封或业务字段平铺。 */
|
|
76
|
+
export type CityClearingParameterParams<T> =
|
|
77
|
+
| {
|
|
78
|
+
body: T
|
|
79
|
+
head?: DigitalRmbHead
|
|
80
|
+
appHead?: { ip?: string; opType?: string }
|
|
81
|
+
}
|
|
82
|
+
| (T & Omit<DigitalRmbHead, 'tranDate'> & { ip?: string; opType?: string })
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue'
|
|
3
|
-
import { ElMessage } from 'element-plus'
|
|
3
|
+
import { ElConfigProvider, ElMessage } from 'element-plus'
|
|
4
4
|
import API from './api'
|
|
5
|
-
import {
|
|
5
|
+
import { dcpsRuntime } from '../runtime'
|
|
6
6
|
import type {
|
|
7
7
|
EstimationAmounts, EstimationCell, EstimationPredRow, EstimationQueryParams, EstimationTranRow,
|
|
8
8
|
} from './typs'
|
|
9
9
|
|
|
10
10
|
defineOptions({ name: 'DcpsEstimationPage' })
|
|
11
11
|
|
|
12
|
+
const tableSize = 'small'
|
|
13
|
+
|
|
12
14
|
// 数字人民币头寸匡算页面:
|
|
13
15
|
// 查询条件为交易日期加上今日预计调拨收入、支出金额;交易日期变化后调用
|
|
14
16
|
// 历史预计调拨金额接口(140503004)预填金额,允许手工调整后重新匡算。
|
|
@@ -150,7 +152,7 @@ const cellOf = (position: string): EstimationCell => ({
|
|
|
150
152
|
})
|
|
151
153
|
|
|
152
154
|
// 查询条件:日期默认当天;预计调拨收支金额由历史接口预填。
|
|
153
|
-
const queryForm = reactive({ tranDate:
|
|
155
|
+
const queryForm = reactive({ tranDate: dcpsRuntime.date, predictAllotInAmt: '', predictAllotOutAmt: '' })
|
|
154
156
|
// 各金额输入的校验提示,空字符串表示没有错误。
|
|
155
157
|
const formError = reactive({ predictAllotInAmt: '', predictAllotOutAmt: '' })
|
|
156
158
|
|
|
@@ -340,6 +342,7 @@ onBeforeUnmount(() => {
|
|
|
340
342
|
</script>
|
|
341
343
|
|
|
342
344
|
<template>
|
|
345
|
+
<ElConfigProvider :size="tableSize">
|
|
343
346
|
<main class="dcps-page">
|
|
344
347
|
<!-- 顶部操作区:交易日期选择与导出、查询入口(收支金额在下方表格内填写)。 -->
|
|
345
348
|
<el-card class="estimation-header" shadow="never" :body-style="{ padding: '10px 14px' }">
|
|
@@ -542,7 +545,7 @@ onBeforeUnmount(() => {
|
|
|
542
545
|
<div v-loading="detailLoading" class="detail-tables">
|
|
543
546
|
<!-- 预报信息明细;列表为空时展示统一空态。 -->
|
|
544
547
|
<div class="dialog-section-title">预报信息</div>
|
|
545
|
-
<el-table :data="detailPredList" size="
|
|
548
|
+
<el-table :data="detailPredList" :size="tableSize" border max-height="240px" empty-text="暂无预报信息">
|
|
546
549
|
<el-table-column label="预报流水号" min-width="150" show-overflow-tooltip>
|
|
547
550
|
<template #default="{ row }">{{ displayText(row.predRefNo) }}</template>
|
|
548
551
|
</el-table-column>
|
|
@@ -580,7 +583,7 @@ onBeforeUnmount(() => {
|
|
|
580
583
|
|
|
581
584
|
<!-- 流水信息明细;失败的详情可重新打开弹窗重试。 -->
|
|
582
585
|
<div class="dialog-section-title">流水信息</div>
|
|
583
|
-
<el-table :data="detailTranList" size="
|
|
586
|
+
<el-table :data="detailTranList" :size="tableSize" border max-height="240px" empty-text="暂无流水信息">
|
|
584
587
|
<el-table-column label="交易参考号" min-width="150" show-overflow-tooltip>
|
|
585
588
|
<template #default="{ row }">{{ displayText(row.refNo) }}</template>
|
|
586
589
|
</el-table-column>
|
|
@@ -622,6 +625,7 @@ onBeforeUnmount(() => {
|
|
|
622
625
|
</template>
|
|
623
626
|
</el-dialog>
|
|
624
627
|
</main>
|
|
628
|
+
</ElConfigProvider>
|
|
625
629
|
</template>
|
|
626
630
|
|
|
627
631
|
<style scoped>
|
|
@@ -22,9 +22,9 @@ const recallForecastRow = (predRefNo?: string): ForecastRowType | null => {
|
|
|
22
22
|
<script setup lang="ts">
|
|
23
23
|
import { computed, onActivated, onBeforeUnmount, reactive, ref, watch } from 'vue'
|
|
24
24
|
import { useRouter } from 'vue-router'
|
|
25
|
-
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
25
|
+
import { ElConfigProvider, ElMessage, ElMessageBox } from 'element-plus'
|
|
26
26
|
import API from './api'
|
|
27
|
-
import {
|
|
27
|
+
import { dcpsRuntime } from '../runtime'
|
|
28
28
|
import { ArtDataTable, type ColumnOption, type PaginationOptions, type TableSettings } from '@/components/table'
|
|
29
29
|
import type {
|
|
30
30
|
ForecastCreateBody,
|
|
@@ -145,14 +145,13 @@ const compareAmounts = (left: string, right: string): number => {
|
|
|
145
145
|
return aValue < bValue ? -1 : aValue > bValue ? 1 : 0
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
/**
|
|
148
|
+
/** 新增和导入使用的表单初始值;日期取共用运行时配置。 */
|
|
149
149
|
const createFormValues = (): ForecastFormValues => {
|
|
150
|
-
const today = getToday()
|
|
151
150
|
return {
|
|
152
151
|
billDate: '', billNo: '', busiType: '', clientName: '', clientType: '',
|
|
153
152
|
competAcct: '', competName: '', custInfoSeq: '', groundBranch: '', groundBranchName: '',
|
|
154
|
-
linkMan: '', payChannel: '', payDirec: '', phoneNo: '', predAmt: '', predDate:
|
|
155
|
-
predName: '', predOrgName: '', purpose: '', remark: '', tranDate:
|
|
153
|
+
linkMan: '', payChannel: '', payDirec: '', phoneNo: '', predAmt: '', predDate: dcpsRuntime.date,
|
|
154
|
+
predName: '', predOrgName: '', purpose: '', remark: '', tranDate: dcpsRuntime.date,
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
157
|
|
|
@@ -214,7 +213,7 @@ onBeforeUnmount(() => { disposed = true })
|
|
|
214
213
|
|
|
215
214
|
type ListMutation = 'delete' | null
|
|
216
215
|
const createFilters = (): ForecastFilters => ({
|
|
217
|
-
tranDate:
|
|
216
|
+
tranDate: dcpsRuntime.date, clientName: '', competName: '', payDirec: '', busiType: '', payChannel: '',
|
|
218
217
|
groundBranch: '', predStatus: '', verifyStatus: '', startTransAmt: '', endTransAmt: '', sortRule: '',
|
|
219
218
|
})
|
|
220
219
|
const listFilters = ref(createFilters())
|
|
@@ -372,6 +371,7 @@ async function deleteRecords(records: ForecastRow[]) {
|
|
|
372
371
|
try {
|
|
373
372
|
await ElMessageBox.confirm(`确认删除选中的 ${references.length} 条预报记录?删除后将重新查询列表。`, '删除预报', {
|
|
374
373
|
confirmButtonText: '确认删除', cancelButtonText: '取消', type: 'warning', distinguishCancelAndClose: true,
|
|
374
|
+
buttonSize: listTableSettings.value.size,
|
|
375
375
|
})
|
|
376
376
|
if (disposed) return
|
|
377
377
|
ensureSuccess(await API.deleteApi(references), '删除预报失败')
|
|
@@ -482,8 +482,8 @@ const fieldPlaceholder = (field: EditorField) => {
|
|
|
482
482
|
const initializeForm = () => {
|
|
483
483
|
const nextValues = createFormValues()
|
|
484
484
|
if (editorMode.value === 'create') {
|
|
485
|
-
nextValues.tranDate = props.tranDate ||
|
|
486
|
-
nextValues.predDate =
|
|
485
|
+
nextValues.tranDate = props.tranDate || dcpsRuntime.date
|
|
486
|
+
nextValues.predDate = dcpsRuntime.date
|
|
487
487
|
} else {
|
|
488
488
|
for (const key of Object.keys(nextValues) as FieldKey[]) {
|
|
489
489
|
const value = initialFieldValue(key)
|
|
@@ -678,6 +678,7 @@ onActivated(() => {
|
|
|
678
678
|
</script>
|
|
679
679
|
|
|
680
680
|
<template>
|
|
681
|
+
<ElConfigProvider :size="listTableSettings.size">
|
|
681
682
|
<!-- 新增 / 修改页 -->
|
|
682
683
|
<main v-if="isEditor" class="page-shell">
|
|
683
684
|
<el-card class="shell-header" shadow="never" :body-style="{ padding: '10px' }">
|
|
@@ -700,7 +701,7 @@ onActivated(() => {
|
|
|
700
701
|
</el-alert>
|
|
701
702
|
<template v-else>
|
|
702
703
|
<p class="editor-note">金额单位为元,方向、业务类型、支付渠道和客户类型按业务代码填写。</p>
|
|
703
|
-
<el-form :model="form"
|
|
704
|
+
<el-form :model="form" label-position="top" :disabled="editorDisabled" @submit.prevent="submit">
|
|
704
705
|
<section v-for="group in visibleGroups" :key="group.title" class="editor-group" :aria-label="group.title">
|
|
705
706
|
<h3>{{ group.title }}</h3>
|
|
706
707
|
<div class="editor-fields">
|
|
@@ -780,7 +781,7 @@ onActivated(() => {
|
|
|
780
781
|
<div v-loading="detailLoading" class="detail-scroll">
|
|
781
782
|
<div v-if="detailError" class="detail-error" role="alert">
|
|
782
783
|
<el-alert :title="detailError" type="error" :closable="false" show-icon />
|
|
783
|
-
<el-button
|
|
784
|
+
<el-button :disabled="detailLoading" @click="loadDetail">重新加载</el-button>
|
|
784
785
|
</div>
|
|
785
786
|
<div v-else-if="detail" class="detail-content">
|
|
786
787
|
<!-- group 为当前详情分组,fields 中的每项对应一个字段。 -->
|
|
@@ -879,6 +880,7 @@ onActivated(() => {
|
|
|
879
880
|
</ArtDataTable>
|
|
880
881
|
</div>
|
|
881
882
|
</main>
|
|
883
|
+
</ElConfigProvider>
|
|
882
884
|
</template>
|
|
883
885
|
|
|
884
886
|
<style scoped>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import baseHttpClient
|
|
1
|
+
import baseHttpClient from '@chic/http'
|
|
2
2
|
import type { AccountBalanceInfo, InjectionCreateParams } from './typs'
|
|
3
3
|
|
|
4
4
|
export default {
|
|
5
5
|
/** 查询单条账户行余额,无筛选参数。 */
|
|
6
6
|
queryBalanceApi: () =>
|
|
7
|
-
baseHttpClient.post<
|
|
7
|
+
baseHttpClient.post<AccountBalanceInfo>('/TAM/0001/140506001', {}),
|
|
8
8
|
/** 注资/预注资发起,响应未声明业务字段。 */
|
|
9
9
|
createApi: (params: InjectionCreateParams) =>
|
|
10
|
-
baseHttpClient.post
|
|
10
|
+
baseHttpClient.post('/TAM/0001/120506001', params),
|
|
11
11
|
}
|
|
@@ -72,7 +72,7 @@ const submitCreate = async () => {
|
|
|
72
72
|
|
|
73
73
|
pendingCreate.value = true
|
|
74
74
|
try {
|
|
75
|
-
const { head } = await API.createApi({ adjustType, tranAmt })
|
|
75
|
+
const { head } = await API.createApi({ adjustType, tranAmt }) as any
|
|
76
76
|
if (disposed) return
|
|
77
77
|
if (head?.retCode !== '00000') {
|
|
78
78
|
throw new Error(head?.retMsg || '提交失败')
|
|
@@ -169,7 +169,7 @@ const query = async () => {
|
|
|
169
169
|
const currentRequestId = ++requestId
|
|
170
170
|
loading.value = true
|
|
171
171
|
try {
|
|
172
|
-
const { head, body } = await API.queryBalanceApi()
|
|
172
|
+
const { head, body } = await API.queryBalanceApi() as any
|
|
173
173
|
if (currentRequestId !== requestId) return
|
|
174
174
|
if (head?.retCode !== '00000') {
|
|
175
175
|
throw new Error(head?.retMsg || '查询失败')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue'
|
|
3
|
-
import { ElMessage } from 'element-plus'
|
|
3
|
+
import { ElConfigProvider, ElMessage } from 'element-plus'
|
|
4
4
|
import { ArtDataTable, type ColumnOption, type PaginationOptions, type TableSettings } from '@/components/table'
|
|
5
5
|
import API from './api'
|
|
6
6
|
import type { InjectionFilters, InjectionQueryParams, InjectionRecord } from './typs'
|
|
@@ -318,6 +318,7 @@ onBeforeUnmount(() => {
|
|
|
318
318
|
</script>
|
|
319
319
|
|
|
320
320
|
<template>
|
|
321
|
+
<ElConfigProvider :size="tableSettings.size">
|
|
321
322
|
<main class="dcps-page">
|
|
322
323
|
<!-- 查询条件:控件尺寸跟随表格设置,卡片内边距为 10px,点击查询生效。 -->
|
|
323
324
|
<el-card v-show="showSearchBar" class="injection-search" shadow="never" :body-style="{ padding: '10px' }">
|
|
@@ -415,6 +416,7 @@ onBeforeUnmount(() => {
|
|
|
415
416
|
</template>
|
|
416
417
|
</el-dialog>
|
|
417
418
|
</main>
|
|
419
|
+
</ElConfigProvider>
|
|
418
420
|
</template>
|
|
419
421
|
|
|
420
422
|
<style scoped>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import parameterApi from '../city-clearing/parameters/api'
|
|
2
|
+
import type { ParameterEditBody, ParameterFormValues, ParameterQueryParams } from './typs'
|
|
3
|
+
|
|
4
|
+
const moduleCode = '5'
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
queryListApi: ({ keywords, pageIndex, pageSize }: ParameterQueryParams) =>
|
|
8
|
+
parameterApi.queryListApi({
|
|
9
|
+
head: { pageIndex: String(pageIndex), pageSize: String(pageSize) },
|
|
10
|
+
body: { moduleCode, keywords },
|
|
11
|
+
}),
|
|
12
|
+
|
|
13
|
+
getDetailApi: (paraName: string) =>
|
|
14
|
+
parameterApi.getDetailApi({ body: { moduleCode, paraName } }),
|
|
15
|
+
|
|
16
|
+
addApi: (values: ParameterFormValues) =>
|
|
17
|
+
parameterApi.addApi({ body: { ...values, moduleCode } }),
|
|
18
|
+
|
|
19
|
+
// 用户确认以原参数名称定位;原始修改契约不包含 moduleCode、paraMark。
|
|
20
|
+
editApi: (values: ParameterEditBody) =>
|
|
21
|
+
parameterApi.editApi({ body: values }),
|
|
22
|
+
|
|
23
|
+
// 用户确认 sysParaList 的元素为参数名称;删除契约没有模块字段。
|
|
24
|
+
deleteApi: (paraNames: string[]) =>
|
|
25
|
+
parameterApi.deleteApi({ body: { sysParaList: [...paraNames] } }),
|
|
26
|
+
}
|