Files
nxxmdata/bank-backend/routes/loanApplications.js
2025-09-24 17:49:32 +08:00

409 lines
11 KiB
JavaScript

/**
* 贷款申请路由
* @file loanApplications.js
* @description 银行系统贷款申请相关路由配置
*/
const express = require('express');
const router = express.Router();
const { body } = require('express-validator');
const loanApplicationController = require('../controllers/loanApplicationController');
const { authMiddleware } = require('../middleware/auth');
// 所有路由都需要认证
router.use(authMiddleware);
/**
* @swagger
* /api/loan-applications:
* get:
* summary: 获取贷款申请列表
* tags: [贷款申请]
* security:
* - bearerAuth: []
* parameters:
* - in: query
* name: page
* schema:
* type: integer
* default: 1
* description: 页码
* - in: query
* name: pageSize
* schema:
* type: integer
* default: 10
* description: 每页数量
* - in: query
* name: searchField
* schema:
* type: string
* enum: [applicationNumber, customerName, productName]
* default: applicationNumber
* description: 搜索字段
* - in: query
* name: searchValue
* schema:
* type: string
* description: 搜索值
* - in: query
* name: status
* schema:
* type: string
* enum: [pending_review, verification_pending, pending_binding, approved, rejected]
* description: 申请状态筛选
* - in: query
* name: sortField
* schema:
* type: string
* default: createdAt
* description: 排序字段
* - in: query
* name: sortOrder
* schema:
* type: string
* enum: [ASC, DESC]
* default: DESC
* description: 排序方向
* responses:
* 200:
* description: 获取成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* data:
* type: object
* properties:
* applications:
* type: array
* items:
* $ref: '#/components/schemas/LoanApplication'
* pagination:
* $ref: '#/components/schemas/Pagination'
*/
router.get('/', loanApplicationController.getApplications);
/**
* @swagger
* /api/loan-applications/{id}:
* get:
* summary: 获取贷款申请详情
* tags: [贷款申请]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: integer
* description: 申请ID
* responses:
* 200:
* description: 获取成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* data:
* $ref: '#/components/schemas/LoanApplication'
* 404:
* description: 申请不存在
*/
router.get('/:id', loanApplicationController.getApplicationById);
/**
* @swagger
* /api/loan-applications/{id}/audit:
* post:
* summary: 审核贷款申请
* tags: [贷款申请]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: integer
* description: 申请ID
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - action
* - comment
* properties:
* action:
* type: string
* enum: [approve, reject]
* description: 审核动作
* comment:
* type: string
* description: 审核意见
* responses:
* 200:
* description: 审核成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* message:
* type: string
* data:
* type: object
* properties:
* id:
* type: integer
* status:
* type: string
* action:
* type: string
* comment:
* type: string
* 400:
* description: 请求参数错误
* 404:
* description: 申请不存在
*/
router.post('/:id/audit', [
body('action')
.isIn(['approve', 'reject'])
.withMessage('审核动作必须是approve或reject'),
body('comment')
.notEmpty()
.withMessage('审核意见不能为空')
.isLength({ max: 500 })
.withMessage('审核意见不能超过500个字符')
], loanApplicationController.auditApplication);
/**
* @swagger
* /api/loan-applications/stats:
* get:
* summary: 获取申请统计信息
* tags: [贷款申请]
* security:
* - bearerAuth: []
* responses:
* 200:
* description: 获取成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* data:
* type: object
* properties:
* total:
* type: object
* properties:
* applications:
* type: integer
* amount:
* type: number
* byStatus:
* type: object
* properties:
* counts:
* type: object
* amounts:
* type: object
*/
router.get('/stats', loanApplicationController.getApplicationStats);
/**
* @swagger
* /api/loan-applications/batch/status:
* put:
* summary: 批量更新申请状态
* tags: [贷款申请]
* security:
* - bearerAuth: []
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - ids
* - status
* properties:
* ids:
* type: array
* items:
* type: integer
* description: 申请ID数组
* status:
* type: string
* enum: [approved, rejected]
* description: 目标状态
* responses:
* 200:
* description: 更新成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* message:
* type: string
* data:
* type: object
* properties:
* updatedCount:
* type: integer
* status:
* type: string
* 400:
* description: 请求参数错误
*/
router.put('/batch/status', [
body('ids')
.isArray({ min: 1 })
.withMessage('请选择要操作的申请'),
body('status')
.isIn(['approved', 'rejected'])
.withMessage('状态必须是approved或rejected')
], loanApplicationController.batchUpdateStatus);
/**
* @swagger
* components:
* schemas:
* LoanApplication:
* type: object
* properties:
* id:
* type: integer
* description: 申请ID
* applicationNumber:
* type: string
* description: 申请单号
* productName:
* type: string
* description: 贷款产品名称
* farmerName:
* type: string
* description: 申请养殖户姓名
* borrowerName:
* type: string
* description: 贷款人姓名
* borrowerIdNumber:
* type: string
* description: 贷款人身份证号
* assetType:
* type: string
* description: 生资种类
* applicationQuantity:
* type: string
* description: 申请数量
* amount:
* type: number
* description: 申请额度
* status:
* type: string
* enum: [pending_review, verification_pending, pending_binding, approved, rejected]
* description: 申请状态
* type:
* type: string
* enum: [personal, business, mortgage]
* description: 申请类型
* term:
* type: integer
* description: 申请期限(月)
* interestRate:
* type: number
* description: 预计利率
* phone:
* type: string
* description: 联系电话
* purpose:
* type: string
* description: 申请用途
* remark:
* type: string
* description: 备注
* applicationTime:
* type: string
* format: date-time
* description: 申请时间
* approvedTime:
* type: string
* format: date-time
* description: 审批通过时间
* rejectedTime:
* type: string
* format: date-time
* description: 审批拒绝时间
* auditRecords:
* type: array
* items:
* $ref: '#/components/schemas/AuditRecord'
* description: 审核记录
* AuditRecord:
* type: object
* properties:
* id:
* type: integer
* description: 记录ID
* action:
* type: string
* enum: [submit, approve, reject, review, verification, binding]
* description: 审核动作
* auditor:
* type: string
* description: 审核人
* auditorId:
* type: integer
* description: 审核人ID
* comment:
* type: string
* description: 审核意见
* time:
* type: string
* format: date-time
* description: 审核时间
* previousStatus:
* type: string
* description: 审核前状态
* newStatus:
* type: string
* description: 审核后状态
* Pagination:
* type: object
* properties:
* current:
* type: integer
* description: 当前页码
* pageSize:
* type: integer
* description: 每页数量
* total:
* type: integer
* description: 总记录数
* totalPages:
* type: integer
* description: 总页数
*/
module.exports = router;