Files
tech-achievement-management…/server/routes/dictionaries.js
T
2026-04-19 14:05:40 +08:00

166 lines
7.1 KiB
JavaScript

const express = require('express');
const router = express.Router();
const db = require('../db');
const { verifyToken, isSystemAdmin } = require('../middleware/auth');
// 定义允许管理的字典表映射
const tableMap = {
'departments': 'departments',
'organizations': 'dict_organizations',
'award-types': 'dict_award_types',
'award-levels': 'dict_award_levels',
'paper-types': 'dict_paper_types',
'standard-types': 'dict_standard_types',
'project-categories': 'dict_project_categories',
'leader-departments': 'dict_leader_departments'
};
// 特殊接口:公开获取部门列表 (用于注册页面,无需登录)
router.get('/departments', async (req, res) => {
try {
const result = await db.query('SELECT * FROM departments ORDER BY id ASC');
res.json(result.rows);
} catch (err) {
console.error(err);
res.status(500).json({ message: '服务器错误' });
}
});
// 通用获取接口 (登录用户即可访问,用于下拉框)
router.get('/:type', verifyToken, async (req, res) => {
const tableName = tableMap[req.params.type];
if (!tableName) return res.status(404).json({ message: '未知的字典类型' });
try {
const result = await db.query(`SELECT * FROM ${tableName} ORDER BY id ASC`);
res.json(result.rows);
} catch (err) {
console.error(err);
res.status(500).json({ message: '服务器错误' });
}
});
// 通用添加接口 (系统管理员:超管或维护员)
router.post('/:type', verifyToken, isSystemAdmin, async (req, res) => {
const tableName = tableMap[req.params.type];
if (!tableName) return res.status(404).json({ message: '未知的字典类型' });
const { name } = req.body;
if (!name) return res.status(400).json({ message: '名称不能为空' });
try {
const result = await db.query(
`INSERT INTO ${tableName} (name) VALUES ($1) RETURNING *`,
[name]
);
res.status(201).json(result.rows[0]);
} catch (err) {
if (err.code === '23505') {
return res.status(400).json({ message: '该项已存在' });
}
res.status(500).json({ message: '服务器错误' });
}
});
// 通用修改接口 (系统管理员:超管或维护员)
router.put('/:type/:id', verifyToken, isSystemAdmin, async (req, res) => {
const tableName = tableMap[req.params.type];
if (!tableName) return res.status(404).json({ message: '未知的字典类型' });
const { id } = req.params;
const { name } = req.body;
if (!name) return res.status(400).json({ message: '名称不能为空' });
try {
const result = await db.query(
`UPDATE ${tableName} SET name = $1 WHERE id = $2 RETURNING *`,
[name, id]
);
if (result.rows.length === 0) return res.status(404).json({ message: '记录不存在' });
res.json(result.rows[0]);
} catch (err) {
if (err.code === '23505') {
return res.status(400).json({ message: '名称已存在' });
}
res.status(500).json({ message: '服务器错误' });
}
});
// 通用删除接口 (系统管理员:超管或维护员)
router.delete('/:type/:id', verifyToken, isSystemAdmin, async (req, res) => {
const type = req.params.type;
const tableName = tableMap[type];
if (!tableName) return res.status(404).json({ message: '未知的字典类型' });
const { id } = req.params;
try {
// 获取名称用于后续逻辑或检查
const checkResult = await db.query(`SELECT name FROM ${tableName} WHERE id = $1`, [id]);
if (checkResult.rows.length === 0) return res.status(404).json({ message: '记录不存在' });
const name = checkResult.rows[0].name;
// 检查是否是“待定”
if (name === '待定') {
return res.status(400).json({ message: '系统保留项“待定”不能删除' });
}
// 开启事务处理级联更新
const client = await db.pool.connect();
try {
await client.query('BEGIN');
// 1. 执行级联更新逻辑
if (type === 'departments') {
// 更新用户表:部门设为待定,状态设为 pending
await client.query(
"UPDATE users SET department = '待定', dept_status = 'pending' WHERE department = $1",
[name]
);
// 更新成果表:替换归属部门数组中的项
await client.query(
"UPDATE achievements SET assigned_departments = array_replace(assigned_departments, $1, '待定') WHERE $1 = ANY(assigned_departments)",
[name]
);
} else if (type === 'organizations') {
await client.query("UPDATE achievement_award SET award_unit = '待定' WHERE award_unit = $1", [name]);
await client.query("UPDATE achievement_project SET source = '待定' WHERE source = $1", [name]);
await client.query("UPDATE achievement_monograph SET publisher = '待定' WHERE publisher = $1", [name]);
// achievement_plan 表没有 unit 字段,跳过
// achievement_transformation 表没有 receiver_unit 字段,跳过
await client.query("UPDATE achievement_software SET owner_unit = '待定' WHERE owner_unit = $1", [name]); // 修正字段名 owner -> owner_unit
await client.query("UPDATE achievement_paper SET first_unit = '待定' WHERE first_unit = $1", [name]);
} else if (type === 'award-types') {
await client.query("UPDATE achievement_award SET award_type = '待定' WHERE award_type = $1", [name]);
} else if (type === 'award-levels') {
await client.query("UPDATE achievement_award SET award_level = '待定' WHERE award_level = $1", [name]);
} else if (type === 'paper-types') {
await client.query("UPDATE achievement_paper SET paper_type = '待定' WHERE paper_type = $1", [name]);
} else if (type === 'standard-types') {
await client.query("UPDATE achievement_standard SET standard_type = '待定' WHERE standard_type = $1", [name]);
} else if (type === 'project-categories') {
await client.query("UPDATE achievement_project SET project_category = '待定' WHERE project_category = $1", [name]);
} else if (type === 'leader-departments') {
// 领导层部门字典仅用于筛选,删除时不影响其他表数据
}
// 2. 执行删除
await client.query(`DELETE FROM ${tableName} WHERE id = $1`, [id]);
await client.query('COMMIT');
res.json({ message: '删除成功,关联数据已同步为“待定”' });
} catch (err) {
await client.query('ROLLBACK');
throw err;
} finally {
client.release();
}
} catch (err) {
console.error(err);
res.status(500).json({ message: '服务器错误' });
}
});
module.exports = router;