// routes/suppliers.js —— 供应商管理 CRUD const { pool } = require('../db') function pagination(query) { const page = Math.max(Number(query.page) || 1, 1) const pageSize = Math.min(Math.max(Number(query.pageSize) || 10, 1), 100) const offset = (page - 1) * pageSize return { page, pageSize, offset } } // GET /api/suppliers —— 列表 async function list(req, res) { try { const { page, pageSize, offset } = pagination(req.query) const { id, name, type, status } = req.query let where = 'WHERE 1=1' const params = [] if (id) { where += ' AND id = ?' params.push(Number(id)) } if (name) { where += ' AND name LIKE ?' params.push(`%${name}%`) } if (type) { where += ' AND type LIKE ?' params.push(`%${type}%`) } if (status !== undefined && status !== '') { where += ' AND status = ?' params.push(Number(status)) } const [[{ total }]] = await pool.query( `SELECT COUNT(*) AS total FROM suppliers ${where}`, params ) const [rows] = await pool.query( `SELECT * FROM suppliers ${where} ORDER BY id DESC LIMIT ? OFFSET ?`, [...params, pageSize, offset] ) res.json({ code: 0, message: 'ok', data: { list: rows, total, page, pageSize, totalPages: Math.ceil(total / pageSize), }, }) } catch (e) { console.error('[suppliers list] error:', e) res.status(500).json({ code: 500, message: e.message }) } } // GET /api/suppliers/:id —— 详情 async function detail(req, res) { try { const [rows] = await pool.query('SELECT * FROM suppliers WHERE id = ?', [req.params.id]) if (rows.length === 0) { return res.status(404).json({ code: 404, message: '供应商不存在' }) } res.json({ code: 0, message: 'ok', data: rows[0] }) } catch (e) { console.error('[suppliers detail] error:', e) res.status(500).json({ code: 500, message: e.message }) } } // POST /api/suppliers —— 新增 async function create(req, res) { const { name, contact, phone, address, type, content, status } = req.body || {} if (!name) { return res.status(400).json({ code: 400, message: '供应商名称必填' }) } try { const [result] = await pool.query( `INSERT INTO suppliers (name, contact, phone, address, type, content, status) VALUES (?, ?, ?, ?, ?, ?, ?)`, [name, contact || null, phone || null, address || null, type || null, content || null, status !== undefined ? status : 1] ) const [rows] = await pool.query('SELECT * FROM suppliers WHERE id = ?', [result.insertId]) res.json({ code: 0, message: 'ok', data: rows[0] }) } catch (e) { console.error('[suppliers create] error:', e) res.status(500).json({ code: 500, message: e.message }) } } // PUT /api/suppliers/:id —— 更新 async function update(req, res) { const { id } = req.params const fields = ['name', 'contact', 'phone', 'address', 'type', 'content', 'status'] try { const [existing] = await pool.query('SELECT id FROM suppliers WHERE id = ?', [id]) if (existing.length === 0) { return res.status(404).json({ code: 404, message: '供应商不存在' }) } const sets = [] const params = [] for (const f of fields) { if (req.body[f] !== undefined) { sets.push(`${f} = ?`) params.push(req.body[f]) } } if (sets.length === 0) { return res.status(400).json({ code: 400, message: '没有需要更新的字段' }) } params.push(id) await pool.query(`UPDATE suppliers SET ${sets.join(', ')} WHERE id = ?`, params) const [rows] = await pool.query('SELECT * FROM suppliers WHERE id = ?', [id]) res.json({ code: 0, message: 'ok', data: rows[0] }) } catch (e) { console.error('[suppliers update] error:', e) res.status(500).json({ code: 500, message: e.message }) } } // DELETE /api/suppliers/:id —— 删除 async function remove(req, res) { const { id } = req.params try { const [existing] = await pool.query('SELECT id FROM suppliers WHERE id = ?', [id]) if (existing.length === 0) { return res.status(404).json({ code: 404, message: '供应商不存在' }) } await pool.query('DELETE FROM suppliers WHERE id = ?', [id]) res.json({ code: 0, message: 'ok' }) } catch (e) { console.error('[suppliers delete] error:', e) if (e.code === 'ER_ROW_IS_REFERENCED_2') { return res.status(400).json({ code: 400, message: '该供应商被合同引用,无法删除' }) } res.status(500).json({ code: 500, message: e.message }) } } module.exports = { list, detail, create, update, remove }