Files
yunhaifinance/backend/fix-implementation.md
T

9.0 KiB
Raw Blame History

采购付款分离改造修复方案

问题分析

经过代码分析,发现以下问题:

  1. 数据库表结构db-sqlite.js 文件中已经包含了所有必要的表创建语句,包括:

    • purchase_orders(采购订单表)
    • purchase_order_items(采购订单明细表)
    • payment_plans(付款计划表)
    • inventory_records(库存记录表)
  2. API端点实现final-backend.js 文件中已经包含了所有必要的API端点:

    • 采购订单APIGET /api/purchase-orders, POST /api/purchase-orders, GET /api/purchase-orders/:id
    • 付款计划APIGET /api/payment-plans, POST /api/payment-plans, GET /api/payment-plans/:id, PUT /api/payment-plans/:id
    • 库存管理APIGET /api/inventory, GET /api/inventory/summary, POST /api/inventory/out
  3. 前端配置:前端代码中已经正确配置了API调用,使用相对路径 /api/...

修复方案

步骤1:初始化数据库

  1. 运行数据库初始化脚本

    node db-sqlite.js
    
  2. 验证数据库表结构

    • 运行数据库表结构检查脚本
    • 确保所有必要的表都已创建

步骤2:启动后端服务器

  1. 安装依赖项

    npm install
    
  2. 启动后端服务器

    npm start
    
  3. 验证服务器启动

步骤3:测试API端点

  1. 运行API端点测试脚本

    node test-api-endpoints.js
    
  2. 验证API响应

    • 确保所有API端点返回 200 状态码
    • 确保响应数据符合预期格式

步骤4:测试前端连接

  1. 启动前端服务器

    cd ../frontend
    npm install
    npm run dev
    
  2. 验证前端连接

    • 访问 http://localhost:3006
    • 导航到采购订单、付款计划和库存管理页面
    • 验证数据加载是否正常

具体修复措施

1. 数据库表结构修复

确保以下表都已创建:

purchase_orders表

  • id (INTEGER PRIMARY KEY AUTOINCREMENT)
  • code (TEXT NOT NULL)
  • purchase_request_id (INTEGER)
  • supplier_id (INTEGER)
  • supplier_name (TEXT)
  • total_amount (REAL DEFAULT 0)
  • currency (TEXT DEFAULT 'CNY')
  • order_date (TEXT)
  • delivery_date (TEXT)
  • status (TEXT DEFAULT 'pending')
  • created_by (TEXT)
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)

purchase_order_items表

  • id (INTEGER PRIMARY KEY AUTOINCREMENT)
  • purchase_order_id (INTEGER NOT NULL)
  • product_id (INTEGER)
  • product_name (TEXT NOT NULL)
  • specification (TEXT)
  • quantity (REAL NOT NULL)
  • unit (TEXT NOT NULL)
  • unit_price (REAL NOT NULL)
  • total_price (REAL NOT NULL)
  • remark (TEXT)
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)

payment_plans表

  • id (INTEGER PRIMARY KEY AUTOINCREMENT)
  • purchase_order_id (INTEGER NOT NULL)
  • code (TEXT NOT NULL)
  • payment_date (TEXT)
  • amount (REAL NOT NULL)
  • currency (TEXT DEFAULT 'CNY')
  • payment_type (TEXT DEFAULT 'partial')
  • status (TEXT DEFAULT 'pending')
  • description (TEXT)
  • created_by (TEXT)
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)

inventory_records表

  • id (INTEGER PRIMARY KEY AUTOINCREMENT)
  • record_type (TEXT NOT NULL)
  • purchase_request_id (INTEGER)
  • project_id (INTEGER)
  • product_id (INTEGER)
  • quantity (REAL NOT NULL)
  • unit_price (REAL)
  • total_amount (REAL)
  • record_date (TEXT)
  • operator (TEXT)
  • remark (TEXT)
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP)

2. API端点修复

确保以下API端点正确实现:

采购订单API

  • GET /api/purchase-orders - 获取采购订单列表
  • POST /api/purchase-orders - 创建采购订单
  • GET /api/purchase-orders/:id - 获取采购订单详情

付款计划API

  • GET /api/payment-plans - 获取付款计划列表
  • POST /api/payment-plans - 创建付款计划
  • GET /api/payment-plans/:id - 获取付款计划详情
  • PUT /api/payment-plans/:id - 更新付款计划

库存管理API

  • GET /api/inventory - 获取库存记录
  • GET /api/inventory/summary - 获取库存汇总
  • POST /api/inventory/out - 出库操作

3. 前端连接修复

确保前端代码正确调用API端点:

  • 采购订单页面:使用 /api/purchase-orders 端点
  • 付款计划页面:使用 /api/payment-plans 端点
  • 库存管理页面:使用 /api/inventory 端点

验证测试

1. 数据库表结构验证

运行数据库表结构检查脚本,确保所有必要的表都已创建:

const sqlite3 = require('sqlite3').verbose();
const path = require('path');

const dbPath = path.join(__dirname, 'company_finance.db');
const db = new sqlite3.Database(dbPath, (err) => {
  if (err) {
    console.error('数据库连接失败:', err.message);
    process.exit(1);
  } else {
    console.log('数据库连接成功');
    checkTables();
  }
});

function checkTables() {
  console.log('正在检查数据库表结构...');
  
  const tables = [
    'purchase_orders',
    'purchase_order_items',
    'payment_plans',
    'inventory_records'
  ];
  
  let checked = 0;
  
  tables.forEach(table => {
    db.get(`SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'`, (err, row) => {
      checked++;
      if (err) {
        console.error(`检查表 ${table} 失败:`, err.message);
      } else if (row) {
        console.log(`✅ 表 ${table} 存在`);
      } else {
        console.log(`❌ 表 ${table} 不存在`);
      }
      
      if (checked === tables.length) {
        console.log('检查完成');
        db.close();
      }
    });
  });
}

2. API端点验证

运行API端点测试脚本,确保所有API端点正常响应:

const http = require('http');

const options = {
  hostname: 'localhost',
  port: 3002,
  timeout: 5000
};

function testApi(endpoint, method = 'GET', data = null) {
  return new Promise((resolve, reject) => {
    const reqOptions = {
      ...options,
      path: endpoint,
      method,
      headers: {
        'Content-Type': 'application/json'
      }
    };

    const req = http.request(reqOptions, (res) => {
      let data = '';
      res.on('data', (chunk) => {
        data += chunk;
      });
      res.on('end', () => {
        try {
          const result = JSON.parse(data);
          resolve({ status: res.statusCode, data: result });
        } catch (error) {
          resolve({ status: res.statusCode, data: data });
        }
      });
    });

    req.on('error', (error) => {
      reject(error);
    });

    req.on('timeout', () => {
      req.destroy();
      reject(new Error('请求超时'));
    });

    if (data) {
      req.write(JSON.stringify(data));
    }

    req.end();
  });
}

async function runTests() {
  console.log('开始测试API端点...');

  try {
    // 测试采购订单API
    console.log('\n测试采购订单API:');
    const purchaseOrders = await testApi('/api/purchase-orders');
    console.log('GET /api/purchase-orders:', purchaseOrders.status);
    console.log('响应:', purchaseOrders.data);

    // 测试付款计划API
    console.log('\n测试付款计划API:');
    const paymentPlans = await testApi('/api/payment-plans');
    console.log('GET /api/payment-plans:', paymentPlans.status);
    console.log('响应:', paymentPlans.data);

    // 测试库存管理API
    console.log('\n测试库存管理API:');
    const inventory = await testApi('/api/inventory');
    console.log('GET /api/inventory:', inventory.status);
    console.log('响应:', inventory.data);

    console.log('\n测试完成');
  } catch (error) {
    console.error('测试失败:', error.message);
  }
}

runTests();

3. 前端功能验证

  1. 访问前端应用http://localhost:3006
  2. 导航到采购订单页面:验证采购订单列表加载正常
  3. 导航到付款计划页面:验证付款计划列表加载正常
  4. 导航到库存管理页面:验证库存管理列表加载正常
  5. 测试创建功能:尝试创建采购订单和付款计划
  6. 测试编辑功能:尝试编辑采购订单和付款计划
  7. 测试库存操作:尝试出库操作

预期结果

  1. 数据库表结构:所有必要的表都已创建
  2. API端点:所有API端点返回 200 状态码,响应数据符合预期格式
  3. 前端功能:所有页面加载正常,功能操作正常

修复总结

  1. 数据库初始化:运行 db-sqlite.js 初始化数据库,确保所有必要的表都已创建
  2. 后端服务器:启动后端服务器,确保API端点正常响应
  3. 前端连接:启动前端服务器,确保前端正确调用API端点
  4. 功能验证:测试所有功能,确保采购付款分离改造方案的需求能够实现

通过以上修复步骤,应该能够解决获取采购订单列表失败、获取付款计划列表失败和库存管理列表失败的问题。