添加银行后端接口,前端代码

This commit is contained in:
2025-09-23 17:57:18 +08:00
parent 325c114c38
commit bdc1b29934
67 changed files with 12682 additions and 7085 deletions

View File

@@ -0,0 +1,200 @@
const { Project, User } = require('../models');
const { sequelize } = require('../config/database');
// 项目测试数据
const projectsData = [
{
name: '张洪彬',
status: 'completed',
farmName: '大数据中心',
supervisionObject: '牛',
supervisionQuantity: 10,
supervisionPeriod: '23天',
supervisionAmount: 10000.00,
startTime: '2024-02-21',
endTime: '2024-03-15',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '大数据中心养殖项目'
},
{
name: '田小平',
status: 'completed',
farmName: '139****5685_养殖场',
supervisionObject: '牛',
supervisionQuantity: 0,
supervisionPeriod: '0天',
supervisionAmount: 0.00,
startTime: '2022-12-12',
endTime: '2023-12-12',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: '',
description: '田小平养殖场项目'
},
{
name: '杜宝民',
status: 'completed',
farmName: '杜宝民养殖场',
supervisionObject: '牛',
supervisionQuantity: 1,
supervisionPeriod: '20天',
supervisionAmount: 1000000.00,
startTime: '2023-05-08',
endTime: '2028-05-08',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '杜宝民养殖场长期项目'
},
{
name: '满良',
status: 'completed',
farmName: '满良养殖场',
supervisionObject: '牛',
supervisionQuantity: 30,
supervisionPeriod: '365天',
supervisionAmount: 420000.00,
startTime: '2023-01-01',
endTime: '2024-01-01',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '满良养殖场年度项目'
},
{
name: '敖日布仁琴',
status: 'supervision',
farmName: '敖日布仁琴养殖场',
supervisionObject: '牛',
supervisionQuantity: 38,
supervisionPeriod: '1827天',
supervisionAmount: 530000.00,
startTime: '2019-01-01',
endTime: '2024-01-01',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '敖日布仁琴养殖场长期监管项目'
},
{
name: '那顺乌日图',
status: 'supervision',
farmName: '那顺乌日图养殖场',
supervisionObject: '牛',
supervisionQuantity: 36,
supervisionPeriod: '1827天',
supervisionAmount: 500000.00,
startTime: '2019-01-01',
endTime: '2024-01-01',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '那顺乌日图养殖场长期监管项目'
},
{
name: '巴特尔',
status: 'supervision',
farmName: '巴特尔养殖场',
supervisionObject: '牛',
supervisionQuantity: 41,
supervisionPeriod: '1827天',
supervisionAmount: 570000.00,
startTime: '2019-01-01',
endTime: '2024-01-01',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '巴特尔养殖场长期监管项目'
},
{
name: '王五',
status: 'completed',
farmName: '王五养殖场',
supervisionObject: '牛',
supervisionQuantity: 50,
supervisionPeriod: '365天',
supervisionAmount: 700000.00,
startTime: '2023-01-01',
endTime: '2024-01-01',
earTag: 0,
collar: 0,
host: 0,
loanOfficer: 'mapleaf',
description: '王五养殖场年度项目'
}
];
async function seedProjects() {
try {
console.log('开始创建项目测试数据...');
// 测试数据库连接
await sequelize.authenticate();
console.log('✅ 数据库连接成功');
// 查找管理员用户作为创建人
const adminUser = await User.findOne({ where: { username: 'admin' } });
const createdBy = adminUser ? adminUser.id : null;
// 清空现有项目数据
await Project.destroy({ where: {} });
console.log('✅ 清空现有项目数据');
// 创建项目数据
for (const projectData of projectsData) {
await Project.create({
...projectData,
createdBy: createdBy,
updatedBy: createdBy
});
}
console.log(`✅ 成功创建 ${projectsData.length} 个项目`);
// 验证数据
const projectCount = await Project.count();
console.log(`📊 数据库中现有项目数量: ${projectCount}`);
// 显示统计信息
const supervisionCount = await Project.count({ where: { status: 'supervision' } });
const completedCount = await Project.count({ where: { status: 'completed' } });
const totalAmount = await Project.sum('supervisionAmount');
const totalQuantity = await Project.sum('supervisionQuantity');
console.log('\n📈 项目统计信息:');
console.log(` 监管中项目: ${supervisionCount}`);
console.log(` 已结项项目: ${completedCount}`);
console.log(` 总监管金额: ${totalAmount?.toFixed(2) || 0}`);
console.log(` 总监管数量: ${totalQuantity || 0}`);
console.log('\n🎉 项目数据创建完成!');
} catch (error) {
console.error('❌ 创建项目数据失败:', error);
throw error;
}
}
// 如果直接运行此脚本
if (require.main === module) {
seedProjects()
.then(() => {
console.log('✅ 脚本执行完成');
process.exit(0);
})
.catch((error) => {
console.error('❌ 脚本执行失败:', error);
process.exit(1);
});
}
module.exports = seedProjects;

View File

@@ -0,0 +1,261 @@
/**
* 监管任务测试数据种子文件
* @file seed-supervision-tasks.js
* @description 为监管任务表添加测试数据
*/
const { sequelize, SupervisionTask, User } = require('../models');
async function seedSupervisionTasks() {
try {
console.log('🌱 开始添加监管任务测试数据...');
// 检查是否已有数据
const existingCount = await SupervisionTask.count();
if (existingCount > 0) {
console.log(`⚠️ 监管任务表已有 ${existingCount} 条数据,跳过种子数据添加`);
return;
}
// 获取管理员用户ID
const adminUser = await User.findOne({ where: { username: 'admin' } });
if (!adminUser) {
console.log('❌ 未找到管理员用户,请先运行用户种子数据');
return;
}
const adminId = adminUser.id;
// 监管任务测试数据
const supervisionTasks = [
{
applicationNumber: 'APP001',
contractNumber: 'CONTRACT001',
productName: '农业贷款产品A',
customerName: '张三',
idType: 'id_card',
idNumber: '110101199001011234',
assetType: 'cattle',
assetQuantity: 10,
supervisionStatus: 'supervising',
importTime: new Date('2024-01-15 10:30:00'),
startTime: '2024-01-15',
endTime: '2024-12-15',
loanAmount: 500000.00,
interestRate: 0.0650,
loanTerm: 12,
supervisorName: '李监管员',
supervisorPhone: '13800138001',
farmAddress: '北京市朝阳区某某养殖场',
remarks: '重点监管项目,需要定期检查',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP002',
contractNumber: 'CONTRACT002',
productName: '农业贷款产品B',
customerName: '李四',
idType: 'id_card',
idNumber: '110101199002021234',
assetType: 'sheep',
assetQuantity: 20,
supervisionStatus: 'pending',
importTime: new Date('2024-01-16 14:20:00'),
startTime: '2024-01-16',
endTime: '2024-12-16',
loanAmount: 300000.00,
interestRate: 0.0600,
loanTerm: 12,
supervisorName: '王监管员',
supervisorPhone: '13800138002',
farmAddress: '北京市海淀区某某农场',
remarks: '新申请项目,待开始监管',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP003',
contractNumber: 'CONTRACT003',
productName: '农业贷款产品C',
customerName: '王五',
idType: 'id_card',
idNumber: '110101199003031234',
assetType: 'pig',
assetQuantity: 15,
supervisionStatus: 'completed',
importTime: new Date('2024-01-10 09:15:00'),
startTime: '2024-01-10',
endTime: '2024-01-20',
loanAmount: 200000.00,
interestRate: 0.0550,
loanTerm: 6,
supervisorName: '赵监管员',
supervisorPhone: '13800138003',
farmAddress: '北京市丰台区某某猪场',
remarks: '监管任务已完成,客户还款正常',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP004',
contractNumber: 'CONTRACT004',
productName: '农业贷款产品D',
customerName: '赵六',
idType: 'id_card',
idNumber: '110101199004041234',
assetType: 'poultry',
assetQuantity: 50,
supervisionStatus: 'supervising',
importTime: new Date('2024-01-20 11:45:00'),
startTime: '2024-01-20',
endTime: '2024-06-20',
loanAmount: 150000.00,
interestRate: 0.0700,
loanTerm: 6,
supervisorName: '孙监管员',
supervisorPhone: '13800138004',
farmAddress: '北京市通州区某某鸡场',
remarks: '家禽养殖项目,需要特别关注防疫情况',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP005',
contractNumber: 'CONTRACT005',
productName: '农业贷款产品E',
customerName: '孙七',
idType: 'id_card',
idNumber: '110101199005051234',
assetType: 'cattle',
assetQuantity: 25,
supervisionStatus: 'suspended',
importTime: new Date('2024-01-25 16:30:00'),
startTime: '2024-01-25',
endTime: '2024-12-25',
loanAmount: 800000.00,
interestRate: 0.0625,
loanTerm: 18,
supervisorName: '周监管员',
supervisorPhone: '13800138005',
farmAddress: '北京市昌平区某某牧场',
remarks: '因客户原因暂停监管,等待进一步通知',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP006',
contractNumber: 'CONTRACT006',
productName: '农业贷款产品F',
customerName: '周八',
idType: 'passport',
idNumber: 'P123456789',
assetType: 'other',
assetQuantity: 30,
supervisionStatus: 'supervising',
importTime: new Date('2024-02-01 08:20:00'),
startTime: '2024-02-01',
endTime: '2024-08-01',
loanAmount: 400000.00,
interestRate: 0.0680,
loanTerm: 6,
supervisorName: '吴监管员',
supervisorPhone: '13800138006',
farmAddress: '北京市顺义区某某特种养殖场',
remarks: '特种养殖项目,需要专业监管',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP007',
contractNumber: 'CONTRACT007',
productName: '农业贷款产品G',
customerName: '吴九',
idType: 'id_card',
idNumber: '110101199007071234',
assetType: 'sheep',
assetQuantity: 40,
supervisionStatus: 'pending',
importTime: new Date('2024-02-05 13:10:00'),
startTime: '2024-02-05',
endTime: '2024-12-05',
loanAmount: 600000.00,
interestRate: 0.0590,
loanTerm: 12,
supervisorName: '郑监管员',
supervisorPhone: '13800138007',
farmAddress: '北京市房山区某某羊场',
remarks: '大规模羊群养殖,需要加强监管',
createdBy: adminId,
updatedBy: adminId
},
{
applicationNumber: 'APP008',
contractNumber: 'CONTRACT008',
productName: '农业贷款产品H',
customerName: '郑十',
idType: 'id_card',
idNumber: '110101199008081234',
assetType: 'pig',
assetQuantity: 35,
supervisionStatus: 'completed',
importTime: new Date('2024-01-05 15:45:00'),
startTime: '2024-01-05',
endTime: '2024-03-05',
loanAmount: 350000.00,
interestRate: 0.0575,
loanTerm: 3,
supervisorName: '冯监管员',
supervisorPhone: '13800138008',
farmAddress: '北京市大兴区某某养猪场',
remarks: '短期养殖项目,已顺利完成监管',
createdBy: adminId,
updatedBy: adminId
}
];
// 批量创建监管任务
await SupervisionTask.bulkCreate(supervisionTasks);
console.log(`✅ 成功添加 ${supervisionTasks.length} 条监管任务测试数据`);
// 显示统计信息
const stats = await SupervisionTask.findAll({
attributes: [
'supervisionStatus',
[sequelize.fn('COUNT', sequelize.col('id')), 'count']
],
group: ['supervisionStatus'],
raw: true
});
console.log('📊 监管任务状态统计:');
stats.forEach(stat => {
const statusNames = {
'pending': '待监管',
'supervising': '监管中',
'completed': '已完成',
'suspended': '已暂停'
};
console.log(` ${statusNames[stat.supervisionStatus] || stat.supervisionStatus}: ${stat.count}`);
});
} catch (error) {
console.error('❌ 添加监管任务测试数据失败:', error);
throw error;
}
}
// 如果直接运行此文件
if (require.main === module) {
seedSupervisionTasks()
.then(() => {
console.log('🎉 监管任务种子数据添加完成');
process.exit(0);
})
.catch((error) => {
console.error('💥 监管任务种子数据添加失败:', error);
process.exit(1);
});
}
module.exports = seedSupervisionTasks;

View File

@@ -0,0 +1,60 @@
const { sequelize } = require('../config/database');
const { Project } = require('../models');
const seedProjects = require('./seed-projects');
async function setupProjectsSimple() {
try {
console.log('🚀 开始设置项目清单功能...\n');
// 1. 测试数据库连接
console.log('1⃣ 测试数据库连接...');
await sequelize.authenticate();
console.log('✅ 数据库连接成功\n');
// 2. 同步项目模型(创建表)
console.log('2⃣ 创建项目表...');
await Project.sync({ force: false }); // force: false 表示如果表已存在则不删除
console.log('✅ 项目表创建成功\n');
// 3. 创建项目测试数据
console.log('3⃣ 创建项目测试数据...');
await seedProjects();
console.log('✅ 项目测试数据创建完成\n');
// 4. 验证数据
console.log('4⃣ 验证项目数据...');
const projectCount = await Project.count();
const supervisionCount = await Project.count({ where: { status: 'supervision' } });
const completedCount = await Project.count({ where: { status: 'completed' } });
console.log(` 总项目数: ${projectCount}`);
console.log(` 监管中项目: ${supervisionCount}`);
console.log(` 已结项项目: ${completedCount}`);
console.log('✅ 项目数据验证完成\n');
console.log('🎉 项目清单功能设置完成!');
console.log('📝 接下来可以:');
console.log(' 1. 启动后端服务器: npm start');
console.log(' 2. 运行API测试: node test-projects-api.js');
console.log(' 3. 在前端访问项目清单页面');
} catch (error) {
console.error('❌ 设置项目清单功能失败:', error);
throw error;
}
}
// 如果直接运行此脚本
if (require.main === module) {
setupProjectsSimple()
.then(() => {
console.log('✅ 脚本执行完成');
process.exit(0);
})
.catch((error) => {
console.error('❌ 脚本执行失败:', error);
process.exit(1);
});
}
module.exports = setupProjectsSimple;

View File

@@ -0,0 +1,79 @@
const { sequelize } = require('../config/database');
const seedProjects = require('./seed-projects');
async function setupProjects() {
try {
console.log('🚀 开始设置项目清单功能...\n');
// 1. 测试数据库连接
console.log('1⃣ 测试数据库连接...');
await sequelize.authenticate();
console.log('✅ 数据库连接成功\n');
// 2. 运行项目表迁移
console.log('2⃣ 运行项目表迁移...');
try {
const { QueryInterface } = require('sequelize');
const queryInterface = sequelize.getQueryInterface();
// 检查表是否已存在
const tableExists = await queryInterface.showAllTables().then(tables =>
tables.includes('projects')
);
if (!tableExists) {
// 运行迁移
const migration = require('../migrations/20241220000002-create-projects');
await migration.up(queryInterface, sequelize);
console.log('✅ 项目表创建成功\n');
} else {
console.log('✅ 项目表已存在\n');
}
} catch (error) {
console.error('❌ 项目表迁移失败:', error.message);
throw error;
}
// 3. 创建项目测试数据
console.log('3⃣ 创建项目测试数据...');
await seedProjects();
console.log('✅ 项目测试数据创建完成\n');
// 4. 验证数据
console.log('4⃣ 验证项目数据...');
const { Project } = require('../models');
const projectCount = await Project.count();
const supervisionCount = await Project.count({ where: { status: 'supervision' } });
const completedCount = await Project.count({ where: { status: 'completed' } });
console.log(` 总项目数: ${projectCount}`);
console.log(` 监管中项目: ${supervisionCount}`);
console.log(` 已结项项目: ${completedCount}`);
console.log('✅ 项目数据验证完成\n');
console.log('🎉 项目清单功能设置完成!');
console.log('📝 接下来可以:');
console.log(' 1. 启动后端服务器: npm start');
console.log(' 2. 运行API测试: node test-projects-api.js');
console.log(' 3. 在前端访问项目清单页面');
} catch (error) {
console.error('❌ 设置项目清单功能失败:', error);
throw error;
}
}
// 如果直接运行此脚本
if (require.main === module) {
setupProjects()
.then(() => {
console.log('✅ 脚本执行完成');
process.exit(0);
})
.catch((error) => {
console.error('❌ 脚本执行失败:', error);
process.exit(1);
});
}
module.exports = setupProjects;

View File

@@ -0,0 +1,43 @@
/**
* 监管任务设置脚本
* @file setup-supervision-tasks.js
* @description 创建监管任务表并添加测试数据
*/
const { sequelize, SupervisionTask } = require('../models');
const seedSupervisionTasks = require('./seed-supervision-tasks');
async function setupSupervisionTasks() {
try {
console.log('🚀 开始设置监管任务...');
// 测试数据库连接
await sequelize.authenticate();
console.log('✅ 数据库连接成功');
// 同步监管任务模型(创建表)
await sequelize.sync({ force: false });
console.log('✅ 数据库表同步完成');
// 添加测试数据
await seedSupervisionTasks();
console.log('🎉 监管任务设置完成!');
} catch (error) {
console.error('❌ 监管任务设置失败:', error);
throw error;
} finally {
await sequelize.close();
}
}
// 运行设置
setupSupervisionTasks()
.then(() => {
console.log('✅ 所有操作完成');
process.exit(0);
})
.catch((error) => {
console.error('💥 操作失败:', error);
process.exit(1);
});