'use client'; import { useState, useEffect } from 'react'; import { toast } from 'sonner'; import { MessageTemplate as MessageTemplateType } from './types'; import { MessageTemplateList, MessageTemplateSearch, MessageTemplateHeader, MessageTemplateDialog, MessageTemplateTestDialog, MessageTemplateInfo } from './components'; export default function MessageTemplatePage() { const [templates, setTemplates] = useState([]); const [searchKeyword, setSearchKeyword] = useState(''); const [typeFilter, setTypeFilter] = useState('all'); const [showDialog, setShowDialog] = useState(false); const [showTestDialog, setShowTestDialog] = useState(false); const [editingTemplate, setEditingTemplate] = useState(null); const [testTemplate, setTestTemplate] = useState(null); useEffect(() => { loadTemplates(); }, []); const loadTemplates = () => { // 清除旧的localStorage数据,确保使用最新的mock数据 localStorage.removeItem('smart_agriculture_message_templates'); const data = localStorage.getItem('smart_agriculture_message_templates'); if (data) { try { const parsedData = JSON.parse(data); console.log('Loaded templates from localStorage:', parsedData); // 确保数据是数组格式 if (Array.isArray(parsedData)) { setTemplates(parsedData); } else { console.error('Loaded data is not an array:', parsedData); setTemplates([]); } } catch (error) { console.error('Error parsing templates from localStorage:', error); setTemplates([]); } } else { const mockTemplates: MessageTemplateType[] = [ { id: 'tpl-1', code: 'TASK_ASSIGNED', name: '任务分配通知', type: 'internal', subject: '新任务分配', content: '您好,{{username}}!您有新的作业任务:{{taskName}},计划执行时间:{{executeTime}}。请及时查看并准备。', variables: ['username', 'taskName', 'executeTime'], isActive: true, description: '当任务分配给驾驶员时发送', createdAt: '2024-01-01T00:00:00', updatedAt: '2024-01-01T00:00:00', createdBy: 'admin', }, { id: 'tpl-2', code: 'EQUIPMENT_WARNING', name: '设备预警通知', type: 'sms', content: '【智慧农业】设备预警:{{equipmentName}}检测到异常,{{warningType}},请及时处理。', variables: ['equipmentName', 'warningType'], isActive: true, description: '设备出现异常时发送短信通知', createdAt: '2024-01-01T00:00:00', updatedAt: '2024-01-01T00:00:00', createdBy: 'admin', }, { id: 'tpl-3', code: 'MAINTENANCE_REMINDER', name: '保养提醒', type: 'email', subject: '设备保养提醒', content: '尊敬的用户:\n\n您的设备{{equipmentName}}(编号:{{equipmentCode}})已使用{{hours}}小时,建议进行保养维护。\n\n保养周期:{{maintenanceCycle}}\n上次保养时间:{{lastMaintenanceTime}}\n\n请及时安排保养,确保设备正常运行。\n\n智慧农业管理系统', variables: ['equipmentName', 'equipmentCode', 'hours', 'maintenanceCycle', 'lastMaintenanceTime'], isActive: true, description: '设备到达保养周期时发送邮件提醒', createdAt: '2024-01-01T00:00:00', updatedAt: '2024-01-01T00:00:00', createdBy: 'admin', }, { id: 'tpl-4', code: 'TASK_COMPLETED', name: '任务完成通知', type: 'push', subject: '任务完成', content: '作业任务{{taskName}}已完成,作业面积:{{area}}亩,耗时:{{duration}}。', variables: ['taskName', 'area', 'duration'], isActive: true, description: '任务完成后推送通知', createdAt: '2024-01-01T00:00:00', updatedAt: '2024-01-01T00:00:00', createdBy: 'admin', }, ]; console.log('Created mock templates:', mockTemplates); localStorage.setItem('smart_agriculture_message_templates', JSON.stringify(mockTemplates)); setTemplates(mockTemplates); } }; const saveTemplates = (newTemplates: MessageTemplateType[]) => { localStorage.setItem('smart_agriculture_message_templates', JSON.stringify(newTemplates)); setTemplates(newTemplates); }; const filteredTemplates = templates.filter(tpl => { const matchKeyword = !searchKeyword || tpl.name.includes(searchKeyword) || tpl.code.includes(searchKeyword) || tpl.content.includes(searchKeyword); const matchType = typeFilter === 'all' || tpl.type === typeFilter; return matchKeyword && matchType; }); // 调试日志 console.log('Original templates:', templates); console.log('Filtered templates:', filteredTemplates); console.log('Search keyword:', searchKeyword); console.log('Type filter:', typeFilter); const handleAdd = () => { setEditingTemplate(null); setShowDialog(true); }; const handleEdit = (template: MessageTemplateType) => { setEditingTemplate(template); setShowDialog(true); }; const handleDelete = (id: string) => { const updated = templates.filter(t => t.id !== id); saveTemplates(updated); toast.success('删除成功'); }; const handleSave = (formData: any) => { if (!formData.code.trim() || !formData.name.trim() || !formData.content.trim()) { toast.error('请填写必填项'); return; } const now = new Date().toISOString(); // 提取变量 const variableRegex = /\{\{(\w+)\}\}/g; const matches = formData.content.matchAll(variableRegex); const extractedVars = Array.from(new Set(Array.from(matches, m => m[1]))); if (editingTemplate) { const updated = templates.map(t => t.id === editingTemplate.id ? { ...t, ...formData, variables: extractedVars, updatedAt: now, } : t ); saveTemplates(updated); toast.success('更新成功'); } else { const newTemplate: MessageTemplateType = { id: `tpl-${Date.now()}`, ...formData, variables: extractedVars, createdAt: now, updatedAt: now, createdBy: 'admin', }; saveTemplates([...templates, newTemplate]); toast.success('添加成功'); } setShowDialog(false); }; const handleTest = (template: MessageTemplateType) => { setTestTemplate(template); setShowTestDialog(true); }; const handleSendTest = (testData: any) => { if (!testData.recipient.trim()) { toast.error('请输入接收人'); return; } // 检查变量是否都填写了 const emptyVars = Object.entries(testData.variables).filter(([k, v]) => !v.trim()); if (emptyVars.length > 0) { toast.error('请填写变量:' + emptyVars.map(([k]) => k).join(', ')); return; } toast.success('测试消息发送成功'); setShowTestDialog(false); }; const handleExport = () => { const dataStr = JSON.stringify(filteredTemplates, null, 2); const dataBlob = new Blob([dataStr], { type: 'application/json' }); const url = URL.createObjectURL(dataBlob); const link = document.createElement('a'); link.href = url; link.download = `message_templates_${new Date().getTime()}.json`; link.click(); toast.success('导出成功'); }; return (
{/* 页面头部 */} {/* 搜索和筛选 */} {/* 模版列表 */} {/* 编辑对话框 */} {/* 测试对话框 */} {/* 使用说明 */}
); }