流程列表
This commit is contained in:
25
openspec/changes/add-loan-pricing-frontend/proposal.md
Normal file
25
openspec/changes/add-loan-pricing-frontend/proposal.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Change: 添加利率定价流程前端管理界面
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
后端利率定价流程 API 已实现(参见 `add-loan-pricing-workflow` 变更),但缺少对应的前端管理界面。业务人员需要通过 Web 界面查询利率定价流程列表、查看流程详情,而不能直接调用后端 API。
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- 新增前端 API 接口模块 `ruoyi-ui/src/api/loanPricing/workflow.js`
|
||||||
|
- 新增前端页面组件 `ruoyi-ui/src/views/loanPricing/workflow/index.vue`
|
||||||
|
- 在数据库 `sys_menu` 表中配置菜单项,确保页面可以正常访问
|
||||||
|
- 配置路由和权限,使用户可以通过菜单导航访问功能
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- **Affected specs:** 新增 `loan-pricing-workflow-ui` 能力规格
|
||||||
|
- **Affected code:**
|
||||||
|
- **新增 `ruoyi-ui/src/api/loanPricing/workflow.js`** - API 接口定义
|
||||||
|
- **新增 `ruoyi-ui/src/views/loanPricing/workflow/index.vue`** - 列表和详情页面组件
|
||||||
|
- **修改 `sys_menu` 表** - 添加菜单配置数据
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
- 依赖已完成的 `add-loan-pricing-workflow` 后端变更
|
||||||
|
- 后端 API 接口文档位于 `doc/api/loan-pricing-workflow-api.md`
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# Capability: loan-pricing-workflow-ui
|
||||||
|
|
||||||
|
利率定价流程前端用户界面能力。
|
||||||
|
|
||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: 流程列表查询
|
||||||
|
|
||||||
|
系统 SHALL 提供利率定价流程列表查询页面,支持分页和多条件筛选。
|
||||||
|
|
||||||
|
#### Scenario: 查询流程列表
|
||||||
|
- **WHEN** 用户已登录系统且具有 `loanPricing:workflow:list` 权限,访问"利率定价管理 > 流程列表"菜单
|
||||||
|
- **THEN** 系统显示利率定价流程列表页面,包含查询表单(客户名称模糊查询、创建者、机构号筛选)、搜索和重置按钮、数据表格(业务方流水号、客户名称、客户类型、担保方式、申请金额、贷款利率、创建时间、创建者)、分页组件、操作列(包含"查看"按钮)
|
||||||
|
|
||||||
|
#### Scenario: 使用筛选条件查询
|
||||||
|
- **WHEN** 用户在流程列表页面输入客户名称或选择创建者/机构号,点击搜索按钮
|
||||||
|
- **THEN** 系统根据筛选条件查询并更新列表数据
|
||||||
|
|
||||||
|
#### Scenario: 重置筛选条件
|
||||||
|
- **WHEN** 用户已设置筛选条件,点击重置按钮
|
||||||
|
- **THEN** 系统清空所有筛选条件并重新查询全部数据
|
||||||
|
|
||||||
|
### Requirement: 流程详情查看
|
||||||
|
|
||||||
|
系统 SHALL 提供流程详情查看功能,以对话框形式展示完整的流程信息。
|
||||||
|
|
||||||
|
#### Scenario: 查看流程详情
|
||||||
|
- **WHEN** 用户在流程列表页面且具有 `loanPricing:workflow:query` 权限,点击列表中某条记录的"查看"按钮
|
||||||
|
- **THEN** 系统弹出详情对话框,展示完整的流程信息(基本信息:业务方流水号、机构编码、客户内码、客户名称、证件类型;业务信息:客户类型、担保方式、申请金额、贷款利率、贷款用途;业务标识:中间业务标识、企业标识;抵质押信息:抵质押类型、是否三方所有;其他信息:创建时间、创建者、更新时间、更新者)
|
||||||
|
|
||||||
|
### Requirement: 菜单和权限配置
|
||||||
|
|
||||||
|
系统 SHALL 在数据库中正确配置菜单项和权限,确保用户可以访问功能。
|
||||||
|
|
||||||
|
#### Scenario: 菜单显示和导航
|
||||||
|
- **WHEN** 用户已登录系统且具有利率定价流程相关权限
|
||||||
|
- **THEN** 系统在左侧菜单栏显示"利率定价管理"一级菜单,展开后显示"流程列表"二级菜单项
|
||||||
|
|
||||||
|
#### Scenario: 菜单路由配置
|
||||||
|
- **WHEN** 用户点击"流程列表"菜单项,系统处理路由跳转
|
||||||
|
- **THEN** 系统导航至 `/loanPricing/workflow` 路径,加载对应的前端组件
|
||||||
|
|
||||||
|
### Requirement: API 接口集成
|
||||||
|
|
||||||
|
前端 SHALL 正确调用后端 API 接口获取数据。
|
||||||
|
|
||||||
|
#### Scenario: 列表接口调用
|
||||||
|
- **WHEN** 用户访问流程列表页面,页面初始化或用户执行查询操作
|
||||||
|
- **THEN** 前端调用 `GET /loanPricing/workflow/list` 接口,传入分页和筛选参数
|
||||||
|
|
||||||
|
#### Scenario: 详情接口调用
|
||||||
|
- **WHEN** 用户点击查看按钮,前端获取选中记录的业务方流水号
|
||||||
|
- **THEN** 前端调用 `GET /loanPricing/workflow/{serialNum}` 接口获取详情数据
|
||||||
41
openspec/changes/add-loan-pricing-frontend/tasks.md
Normal file
41
openspec/changes/add-loan-pricing-frontend/tasks.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Tasks: 添加利率定价流程前端管理界面
|
||||||
|
|
||||||
|
## Implementation Tasks
|
||||||
|
|
||||||
|
### 1. 创建前端 API 接口模块
|
||||||
|
- [x] 创建 `ruoyi-ui/src/api/loanPricing/` 目录
|
||||||
|
- [x] 创建 `workflow.js` 文件,实现以下 API 函数:
|
||||||
|
- `listWorkflow(query)` - 查询利率定价流程列表
|
||||||
|
- `getWorkflow(serialNum)` - 根据业务方流水号查询详情
|
||||||
|
|
||||||
|
### 2. 创建前端页面组件
|
||||||
|
- [x] 创建 `ruoyi-ui/src/views/loanPricing/workflow/` 目录
|
||||||
|
- [x] 创建 `index.vue` 页面组件,包含:
|
||||||
|
- 查询表单区域(支持客户名称、创建者、机构号筛选)
|
||||||
|
- 数据表格区域(显示流程列表)
|
||||||
|
- 分页组件
|
||||||
|
- 详情对话框(点击查看按钮弹出)
|
||||||
|
- [x] 实现以下功能:
|
||||||
|
- 页面加载时自动查询列表
|
||||||
|
- 搜索和重置功能
|
||||||
|
- 点击"查看"按钮弹出详情对话框
|
||||||
|
- 详情对话框展示完整的流程信息
|
||||||
|
|
||||||
|
### 3. 配置数据库菜单
|
||||||
|
- [x] 准备 SQL 插入语句,在 `sys_menu` 表中添加菜单项:
|
||||||
|
- 一级菜单:利率定价管理(menu_type='M')
|
||||||
|
- 二级菜单:流程列表(menu_type='C',对应前端组件路径)
|
||||||
|
- [x] 设置正确的权限标识(perms字段):
|
||||||
|
- 列表查询权限:`loanPricing:workflow:list`
|
||||||
|
- 详情查询权限:`loanPricing:workflow:query`
|
||||||
|
- [x] 执行 SQL 插入语句
|
||||||
|
- [x] 关联管理员角色到新菜单
|
||||||
|
|
||||||
|
### 4. 验证和测试
|
||||||
|
- [x] 配置完成,等待用户启动前端服务进行测试
|
||||||
|
- [ ] 启动前端开发服务器(`npm run dev`)
|
||||||
|
- [ ] 使用 admin 账号登录系统
|
||||||
|
- [ ] 验证菜单是否正常显示
|
||||||
|
- [ ] 测试列表查询功能
|
||||||
|
- [ ] 测试搜索筛选功能
|
||||||
|
- [ ] 测试详情查看功能
|
||||||
18
ruoyi-ui/src/api/loanPricing/workflow.js
Normal file
18
ruoyi-ui/src/api/loanPricing/workflow.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询利率定价流程列表
|
||||||
|
export function listWorkflow(query) {
|
||||||
|
return request({
|
||||||
|
url: '/loanPricing/workflow/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询利率定价流程详情
|
||||||
|
export function getWorkflow(serialNum) {
|
||||||
|
return request({
|
||||||
|
url: '/loanPricing/workflow/' + serialNum,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
173
ruoyi-ui/src/views/loanPricing/workflow/index.vue
Normal file
173
ruoyi-ui/src/views/loanPricing/workflow/index.vue
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
|
<el-form-item label="客户名称" prop="custName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.custName"
|
||||||
|
placeholder="请输入客户名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建者" prop="createBy">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.createBy"
|
||||||
|
placeholder="请输入创建者"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="机构号" prop="orgCode">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.orgCode"
|
||||||
|
placeholder="请输入机构号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-row :gutter="10" class="mb8">
|
||||||
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-table v-loading="loading" :data="workflowList">
|
||||||
|
<el-table-column label="业务方流水号" align="center" prop="serialNum" width="180" :show-overflow-tooltip="true" />
|
||||||
|
<el-table-column label="客户名称" align="center" prop="custName" :show-overflow-tooltip="true" />
|
||||||
|
<el-table-column label="客户类型" align="center" prop="custType" width="100" />
|
||||||
|
<el-table-column label="担保方式" align="center" prop="guarType" width="100" />
|
||||||
|
<el-table-column label="申请金额(元)" align="center" prop="applyAmt" width="120" />
|
||||||
|
<el-table-column label="贷款利率(%)" align="center" prop="loanRate" width="100" />
|
||||||
|
<el-table-column label="创建时间" align="center" prop="createTime" width="160">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建者" align="center" prop="createBy" width="120" />
|
||||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
size="mini"
|
||||||
|
type="text"
|
||||||
|
icon="el-icon-view"
|
||||||
|
@click="handleView(scope.row)"
|
||||||
|
v-hasPermi="['loanPricing:workflow:query']"
|
||||||
|
>查看</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="total>0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="queryParams.pageNum"
|
||||||
|
:limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- 详情对话框 -->
|
||||||
|
<el-dialog title="利率定价流程详情" :visible.sync="open" width="800px" append-to-body>
|
||||||
|
<el-descriptions :column="2" border>
|
||||||
|
<el-descriptions-item label="业务方流水号" :span="2">{{ detail.serialNum }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="机构编码">{{ detail.orgCode }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="运行模式">{{ detail.runType }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="客户内码">{{ detail.custIsn }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="客户名称">{{ detail.custName }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="证件类型" :span="2">{{ detail.idType }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="客户类型">{{ detail.custType }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="担保方式">{{ detail.guarType }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="申请金额">{{ detail.applyAmt }} 元</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="贷款利率">{{ detail.loanRate }} %</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="贷款用途">{{ detail.loanPurpose }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="是否有经营佐证">{{ detail.bizProof === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="抵质押类型">{{ detail.collType }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="抵质押物三方所有">{{ detail.collThirdParty === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="个人快捷支付">{{ detail.midPerQuickPay === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="个人电费代扣">{{ detail.midPerEleDdc === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="企业电费代扣">{{ detail.midEntEleDdc === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="企业水费代扣">{{ detail.midEntWaterDdc === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="净身企业">{{ detail.isCleanEnt === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="开立基本结算账户">{{ detail.hasSettleAcct === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="制造业企业">{{ detail.isManufacturing === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="省农担担保贷款">{{ detail.isAgriGuar === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="纳税信用等级A级">{{ detail.isTaxA === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="县级及以上农业龙头企业">{{ detail.isAgriLeading === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="普惠小微借款人">{{ detail.isInclusiveFinance === 'true' ? '是' : '否' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="创建时间">{{ detail.createTime }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="创建者">{{ detail.createBy }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="更新时间">{{ detail.updateTime }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="更新者">{{ detail.updateBy }}</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="open = false">关 闭</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { listWorkflow, getWorkflow } from "@/api/loanPricing/workflow"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "LoanPricingWorkflow",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: true,
|
||||||
|
// 显示搜索条件
|
||||||
|
showSearch: true,
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
// 利率定价流程表格数据
|
||||||
|
workflowList: [],
|
||||||
|
// 是否显示弹出层
|
||||||
|
open: false,
|
||||||
|
// 详情数据
|
||||||
|
detail: {},
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
custName: undefined,
|
||||||
|
createBy: undefined,
|
||||||
|
orgCode: undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 查询利率定价流程列表 */
|
||||||
|
getList() {
|
||||||
|
this.loading = true
|
||||||
|
listWorkflow(this.queryParams).then(response => {
|
||||||
|
this.workflowList = response.rows
|
||||||
|
this.total = response.total
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageNum = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.resetForm("queryForm")
|
||||||
|
this.handleQuery()
|
||||||
|
},
|
||||||
|
/** 查看详情操作 */
|
||||||
|
handleView(row) {
|
||||||
|
this.open = true
|
||||||
|
getWorkflow(row.serialNum).then(response => {
|
||||||
|
this.detail = response.data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
21
sql/loan_pricing_menu.sql
Normal file
21
sql/loan_pricing_menu.sql
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
-- 利率定价流程菜单配置
|
||||||
|
-- 注意:由于 Windows 编码问题,建议直接在 MySQL 客户端中执行以下语句
|
||||||
|
|
||||||
|
-- 删除旧数据
|
||||||
|
DELETE FROM sys_role_menu WHERE menu_id IN (2000, 2001, 2002);
|
||||||
|
DELETE FROM sys_menu WHERE menu_id IN (2000, 2001, 2002);
|
||||||
|
|
||||||
|
-- 一级菜单:利率定价管理
|
||||||
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
VALUES('2000', '利率定价管理', '0', '5', 'loanPricing', NULL, '', 1, 0, 'M', '0', '0', '', 'money', 'admin', NOW(), '', NULL, '利率定价管理目录');
|
||||||
|
|
||||||
|
-- 二级菜单:流程列表
|
||||||
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
VALUES('2001', '流程列表', '2000', '1', 'workflow', 'loanPricing/workflow/index', '', 1, 0, 'C', '0', '0', 'loanPricing:workflow:list', 'list', 'admin', NOW(), '', NULL, '利率定价流程列表菜单');
|
||||||
|
|
||||||
|
-- 流程列表查询按钮
|
||||||
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
VALUES('2002', '流程查询', '2001', '1', '', '', '', 1, 0, 'F', '0', '0', 'loanPricing:workflow:query', '#', 'admin', NOW(), '', NULL, '');
|
||||||
|
|
||||||
|
-- 关联管理员角色
|
||||||
|
INSERT INTO sys_role_menu VALUES(1, 2000), (1, 2001), (1, 2002);
|
||||||
Reference in New Issue
Block a user