Files
nxxmdata/bank-backend/routes/loanContracts.js

569 lines
17 KiB
JavaScript
Raw Normal View History

2025-09-24 17:49:32 +08:00
/**
* 贷款合同路由
* @file loanContracts.js
* @description 银行系统贷款合同相关路由配置
*/
const express = require('express');
const router = express.Router();
const { body } = require('express-validator');
const loanContractController = require('../controllers/loanContractController');
const { authMiddleware } = require('../middleware/auth');
// 所有路由都需要认证
router.use(authMiddleware);
/**
* @swagger
* /api/loan-contracts:
* 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: [contractNumber, applicationNumber, borrowerName, farmerName, productName]
* default: contractNumber
* description: 搜索字段
* - in: query
* name: searchValue
* schema:
* type: string
* description: 搜索值
* - in: query
* name: status
* schema:
* type: string
* enum: [active, pending, completed, defaulted, cancelled]
* 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:
* contracts:
* type: array
* items:
* $ref: '#/components/schemas/LoanContract'
* pagination:
* $ref: '#/components/schemas/Pagination'
*/
router.get('/', loanContractController.getContracts);
/**
* @swagger
* /api/loan-contracts/{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/LoanContract'
* 404:
* description: 合同不存在
*/
router.get('/:id', loanContractController.getContractById);
/**
* @swagger
* /api/loan-contracts:
* post:
* summary: 创建贷款合同
* tags: [贷款合同]
* security:
* - bearerAuth: []
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - applicationNumber
* - productName
* - farmerName
* - borrowerName
* - borrowerIdNumber
* - assetType
* - applicationQuantity
* - amount
* - type
* - term
* - interestRate
* - phone
* properties:
* 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: 合同金额
* type:
* type: string
* enum: [livestock_collateral, farmer_loan, business_loan, personal_loan]
* description: 合同类型
* term:
* type: integer
* description: 合同期限
* interestRate:
* type: number
* description: 利率
* phone:
* type: string
* description: 联系电话
* purpose:
* type: string
* description: 贷款用途
* remark:
* type: string
* description: 备注
* responses:
* 201:
* description: 创建成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* message:
* type: string
* data:
* $ref: '#/components/schemas/LoanContract'
* 400:
* description: 请求参数错误
*/
router.post('/', [
body('applicationNumber').notEmpty().withMessage('申请单号不能为空'),
body('productName').notEmpty().withMessage('贷款产品名称不能为空'),
body('farmerName').notEmpty().withMessage('申请养殖户姓名不能为空'),
body('borrowerName').notEmpty().withMessage('贷款人姓名不能为空'),
body('borrowerIdNumber').notEmpty().withMessage('贷款人身份证号不能为空'),
body('assetType').notEmpty().withMessage('生资种类不能为空'),
body('applicationQuantity').notEmpty().withMessage('申请数量不能为空'),
body('amount').isNumeric().withMessage('合同金额必须是数字'),
body('type').isIn(['livestock_collateral', 'farmer_loan', 'business_loan', 'personal_loan']).withMessage('合同类型无效'),
body('term').isInt({ min: 1 }).withMessage('合同期限必须大于0'),
body('interestRate').isNumeric().withMessage('利率必须是数字'),
body('phone').notEmpty().withMessage('联系电话不能为空')
], loanContractController.createContract);
/**
* @swagger
* /api/loan-contracts/{id}:
* put:
* 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
* properties:
* 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: 合同金额
* paidAmount:
* type: number
* description: 已还款金额
* status:
* type: string
* enum: [active, pending, completed, defaulted, cancelled]
* description: 合同状态
* type:
* type: string
* enum: [livestock_collateral, farmer_loan, business_loan, personal_loan]
* description: 合同类型
* term:
* type: integer
* description: 合同期限
* interestRate:
* type: number
* description: 利率
* phone:
* type: string
* description: 联系电话
* purpose:
* type: string
* description: 贷款用途
* remark:
* type: string
* description: 备注
* responses:
* 200:
* description: 更新成功
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* message:
* type: string
* data:
* $ref: '#/components/schemas/LoanContract'
* 400:
* description: 请求参数错误
* 404:
* description: 合同不存在
*/
router.put('/:id', loanContractController.updateContract);
/**
* @swagger
* /api/loan-contracts/{id}:
* delete:
* 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
* message:
* type: string
* 404:
* description: 合同不存在
*/
router.delete('/:id', loanContractController.deleteContract);
/**
* @swagger
* /api/loan-contracts/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:
* contracts:
* type: integer
* amount:
* type: number
* paidAmount:
* type: number
* remainingAmount:
* type: number
* byStatus:
* type: object
* properties:
* counts:
* type: object
* amounts:
* type: object
* paidAmounts:
* type: object
*/
router.get('/stats', loanContractController.getContractStats);
/**
* @swagger
* /api/loan-contracts/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: [active, pending, completed, defaulted, cancelled]
* 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(['active', 'pending', 'completed', 'defaulted', 'cancelled']).withMessage('状态无效')
], loanContractController.batchUpdateStatus);
/**
* @swagger
* components:
* schemas:
* LoanContract:
* type: object
* properties:
* id:
* type: integer
* description: 合同ID
* contractNumber:
* type: string
* description: 合同编号
* 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: 合同金额
* paidAmount:
* type: number
* description: 已还款金额
* status:
* type: string
* enum: [active, pending, completed, defaulted, cancelled]
* description: 合同状态
* type:
* type: string
* enum: [livestock_collateral, farmer_loan, business_loan, personal_loan]
* description: 合同类型
* term:
* type: integer
* description: 合同期限
* interestRate:
* type: number
* description: 利率
* phone:
* type: string
* description: 联系电话
* purpose:
* type: string
* description: 贷款用途
* remark:
* type: string
* description: 备注
* contractTime:
* type: string
* format: date-time
* description: 合同签订时间
* disbursementTime:
* type: string
* format: date-time
* description: 放款时间
* maturityTime:
* type: string
* format: date-time
* description: 到期时间
* completedTime:
* type: string
* format: date-time
* description: 完成时间
* remainingAmount:
* type: number
* description: 剩余还款金额
* repaymentProgress:
* type: number
* description: 还款进度百分比
* creator:
* $ref: '#/components/schemas/User'
* updater:
* $ref: '#/components/schemas/User'
* User:
* type: object
* properties:
* id:
* type: integer
* description: 用户ID
* username:
* type: string
* description: 用户名
* real_name:
* type: string
* description: 真实姓名
* email:
* type: string
* description: 邮箱
* phone:
* 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;