diff --git a/backend/routes/process-templates.js b/backend/routes/process-templates.js
index 10a5042..31ccf15 100644
--- a/backend/routes/process-templates.js
+++ b/backend/routes/process-templates.js
@@ -57,9 +57,6 @@ router.put('/:id', async (req, res) => {
if (existing.rows.length === 0) {
return res.status(404).json({ success: false, message: '模板不存在' });
}
- if (existing.rows[0].is_system) {
- return res.status(403).json({ success: false, message: '系统预设模板不可修改' });
- }
const { name, description, phases } = req.body;
const updates = [];
const values = [];
diff --git a/frontend/src/components/layout/MainLayout.tsx b/frontend/src/components/layout/MainLayout.tsx
index c34e936..b231be8 100644
--- a/frontend/src/components/layout/MainLayout.tsx
+++ b/frontend/src/components/layout/MainLayout.tsx
@@ -252,6 +252,13 @@ const MainLayout: React.FC = () => {
icon: ,
label: '系统设置'
},
+ ...(user?.role === 'admin' ? [{
+ type: 'divider' as const
+ }, {
+ key: '/admin',
+ icon: ,
+ label: '后台管理'
+ }] : []),
{
type: 'divider' as const
},
diff --git a/frontend/src/pages/admin/ProcessTemplates.tsx b/frontend/src/pages/admin/ProcessTemplates.tsx
index 56f95d6..62177b7 100644
--- a/frontend/src/pages/admin/ProcessTemplates.tsx
+++ b/frontend/src/pages/admin/ProcessTemplates.tsx
@@ -37,6 +37,7 @@ const ProcessTemplates: React.FC = () => {
const [phaseDrawerVisible, setPhaseDrawerVisible] = useState(false);
const [editingPhaseIndex, setEditingPhaseIndex] = useState(-1);
const [phaseForm] = Form.useForm();
+ const [editingTemplateId, setEditingTemplateId] = useState(null);
useEffect(() => { fetchTemplates(); }, []);
@@ -53,6 +54,15 @@ const ProcessTemplates: React.FC = () => {
form.resetFields();
setPhases([]);
setCurrentStep(0);
+ setEditingTemplateId(null);
+ setCreateModalVisible(true);
+ };
+
+ const handleEdit = (t: Template) => {
+ form.setFieldsValue({ name: t.name, description: t.description });
+ setPhases(t.phases || []);
+ setCurrentStep(1);
+ setEditingTemplateId(t.id);
setCreateModalVisible(true);
};
@@ -83,11 +93,17 @@ const ProcessTemplates: React.FC = () => {
const description = form.getFieldValue('description');
if (!name) { message.warning('请输入模板名称'); setCurrentStep(0); return; }
if (phases.length === 0) { message.warning('请至少添加一个阶段'); setCurrentStep(1); return; }
- await apiClient.post('/process-templates', { name, description, phases });
- message.success('模板创建成功');
+ if (editingTemplateId) {
+ await apiClient.put(`/process-templates/${editingTemplateId}`, { name, description, phases });
+ message.success('模板更新成功');
+ } else {
+ await apiClient.post('/process-templates', { name, description, phases });
+ message.success('模板创建成功');
+ }
setCreateModalVisible(false);
+ setEditingTemplateId(null);
fetchTemplates();
- } catch (e) { message.error('创建失败'); }
+ } catch (e) { message.error('保存失败'); }
};
const addPhase = () => {
@@ -162,6 +178,7 @@ const ProcessTemplates: React.FC = () => {
{ title: '操作', key: 'action', render: (_: unknown, r: Template) => (
} onClick={() => handleView(r)}>查看
+ } onClick={() => handleEdit(r)}>编辑
} onClick={() => handleCopy(r)}>复制
{!r.is_system && handleDelete(r.id)}>}>删除}
@@ -174,14 +191,14 @@ const ProcessTemplates: React.FC = () => {
- setCreateModalVisible(false)} width={800} footer={[
+ setCreateModalVisible(false)} width={800} footer={[
,
currentStep > 0 && ,
currentStep < 2 && ,
- currentStep === 2 && ,
+ currentStep === 2 && ,
]}>