diff --git a/chat-client/public/dmb/dmb.xlsx b/chat-client/public/dmb/dmb.xlsx new file mode 100644 index 0000000..4800927 Binary files /dev/null and b/chat-client/public/dmb/dmb.xlsx differ diff --git a/chat-client/public/dxal/3.典型故障案例-重联动车组网络WTB初运行导致受电弓无法升起故障.pdf b/chat-client/public/dxal/3.典型故障案例-重联动车组网络WTB初运行导致受电弓无法升起故障.pdf new file mode 100644 index 0000000..ff495c1 Binary files /dev/null and b/chat-client/public/dxal/3.典型故障案例-重联动车组网络WTB初运行导致受电弓无法升起故障.pdf differ diff --git a/chat-client/public/dxal/3.典型故障案例-重联动车组近端两架受电弓同时升起故障.pdf b/chat-client/public/dxal/3.典型故障案例-重联动车组近端两架受电弓同时升起故障.pdf new file mode 100644 index 0000000..b274a99 Binary files /dev/null and b/chat-client/public/dxal/3.典型故障案例-重联动车组近端两架受电弓同时升起故障.pdf differ diff --git a/chat-client/public/dxal/典型故障案例:受电弓升弓位置异常(内含代码3044和重联继电器MXR1故障应急处置).pdf b/chat-client/public/dxal/典型故障案例:受电弓升弓位置异常(内含代码3044和重联继电器MXR1故障应急处置).pdf new file mode 100644 index 0000000..9c61bf4 Binary files /dev/null and b/chat-client/public/dxal/典型故障案例:受电弓升弓位置异常(内含代码3044和重联继电器MXR1故障应急处置).pdf differ diff --git a/chat-client/public/gzzd/1.pdf b/chat-client/public/gzzd/1.pdf new file mode 100644 index 0000000..9b0a13d Binary files /dev/null and b/chat-client/public/gzzd/1.pdf differ diff --git a/chat-client/public/gzzd/2.pdf b/chat-client/public/gzzd/2.pdf new file mode 100644 index 0000000..80c8258 Binary files /dev/null and b/chat-client/public/gzzd/2.pdf differ diff --git a/chat-client/public/gzzd/3.pdf b/chat-client/public/gzzd/3.pdf new file mode 100644 index 0000000..0d50bf3 Binary files /dev/null and b/chat-client/public/gzzd/3.pdf differ diff --git a/chat-client/public/jl/长沙动车乘务车间2025年第四季度随车机械师作业图表(上半部分).pdf b/chat-client/public/jl/长沙动车乘务车间2025年第四季度随车机械师作业图表(上半部分).pdf new file mode 100644 index 0000000..69927a7 Binary files /dev/null and b/chat-client/public/jl/长沙动车乘务车间2025年第四季度随车机械师作业图表(上半部分).pdf differ diff --git a/chat-client/src/api/dashboard.ts b/chat-client/src/api/dashboard.ts index ad29369..e3141c9 100644 --- a/chat-client/src/api/dashboard.ts +++ b/chat-client/src/api/dashboard.ts @@ -104,7 +104,7 @@ export function refreshModuleData(moduleType: string) { } /** - * 获取应急处置方法和故障原因 + * 获取应急处置方法和 * @param question 用户提问 * @param sysMessageId 系统消息ID */ diff --git a/chat-client/src/components/dashboard/DetailModal.vue b/chat-client/src/components/dashboard/DetailModal.vue index 2d1edd0..877d43a 100644 --- a/chat-client/src/components/dashboard/DetailModal.vue +++ b/chat-client/src/components/dashboard/DetailModal.vue @@ -128,7 +128,7 @@ const title = computed(() => { typicalCase: '典型案例详情', standardFile: '标准文件详情', ruleRegulation: '规则制度详情', - aiChat: 'AI助手对话详情' + inputCard: '输入框卡片详情' } return props.moduleType ? titles[props.moduleType] : '详情信息' }) @@ -142,7 +142,7 @@ const iconComponent = computed(() => { typicalCase: FileText, standardFile: Folder, ruleRegulation: Shield, - aiChat: Activity + inputCard: Activity } return props.moduleType ? icons[props.moduleType] : FileText }) @@ -205,7 +205,7 @@ const tableColumns = computed(() => { { prop: 'complianceRate', label: '合规率', width: 120 }, { prop: 'violations', label: '违规次数', width: 120 } ], - aiChat: [ + inputCard: [ { prop: 'type', label: '消息类型', width: 120 }, { prop: 'content', label: '消息内容', width: 300 }, { prop: 'timestamp', label: '时间戳', width: 150 } diff --git a/chat-client/src/components/dashboard/ModuleCard.vue b/chat-client/src/components/dashboard/ModuleCard.vue index 6d5fec3..8af1a92 100644 --- a/chat-client/src/components/dashboard/ModuleCard.vue +++ b/chat-client/src/components/dashboard/ModuleCard.vue @@ -5,43 +5,222 @@ :class="{ 'module-card--active': isActive, 'module-card--dragging': isDragging, - 'module-card--resizing': isResizing + 'module-card--resizing': isResizing, + 'input-card-style': config.id === 'inputCard' }" @click="handleClick" @dblclick="handleDoubleClick" @mousedown="handleMouseDown" > -
+

{{ config.title }}

+ +
+ 生成二维码 +
-
+
-
- 车组号 - {{ trainData?.name || 'N/A' }} + +
+ 基本信息
-
- 当前位置 - {{ trainData?.location || 'N/A' }} + + +
+ +
+
+ CR400AF-2028 +
+
+ 配属局 + 广 +
+
+ 配属段 + +
+
+ 配属所 + 长沙所 +
+
+ 资产属性 + 国铁集团 +
+
+ 详细状态 + 二级检修 +
+
+ 速度等级 + 300 +
+
+ 编组 + 8 +
+
+ 坐卧种类 + 座车 +
+
+ 制造厂 + 四方股份 +
+
+ 制造年月 + 2017-09 +
+
+ + +
+
+ CR400AF-2024 +
+
+ 配属局 + 广 +
+
+ 配属段 + +
+
+ 配属所 + 长沙所 +
+
+ 资产属性 + 国铁集团 +
+
+ 详细状态 + 载客运行 +
+
+ 速度等级 + 300 +
+
+ 编组 + 8 +
+
+ 坐卧种类 + 座车 +
+
+ 制造厂 + 四方股份 +
+
+ 制造年月 + 2017-09 +
+
-
- 运行状态 - {{ trainData?.status === 'running' ? '运行中' : trainData?.status === 'maintenance' ? '维护中' : '待命' }} + + +
+ 车组高级修信息
-
- 当前速度 - {{ trainData?.speed || 0 }} km/h -
-
- 走行公里 - {{ trainData?.mileage?.toLocaleString() || 'N/A' }} + + +
+ +
+
+ CR400AF-2028 +
+
+ 总累计走行公里 + 5,066,507 公里 +
+
+ 上次高级修程 + 三级修 +
+
+ 上次高级修程轮次 + A32 +
+
+ 上次高级修修峻日期 + 2024-11-21 +
+
+ 上次高级修修竣时走行公里 + 4,372,153 公里 +
+
+ 上次高级修程后走行公里 + 694,354 公里 +
+
+ 下次高级修程 + 五级修 +
+
+ 下次高级修程轮次 + A51 +
+
+ + +
+
+ CR400AF-2024 +
+
+ 总累计走行公里 + 4,921,189 公里 +
+
+ 上次高级修程 + 三级修 +
+
+ 上次高级修程轮次 + A32 +
+
+ 上次高级修修峻日期 + 2024-11-21 +
+
+ 上次高级修修竣时走行公里 + 4,233,893 公里 +
+
+ 上次高级修程后走行公里 + 687,296 公里 +
+
+ 下次高级修程 + 五级修 +
+
+ 下次高级修程轮次 + A51 +
+
@@ -107,6 +286,8 @@ 故障原因
+ +
-
-
- 车组位置 -
-
- 当前位置 - {{ routeData?.currentLocation || 'N/A' }} -
-
- 后续车次 - {{ routeData?.nextTrain || 'N/A' }} -
-
- 行车限制 - {{ routeData?.restriction || 'N/A' }} -
-
-
- - -
-
- 姓名 - {{ mechanicData?.name || 'N/A' }} -
-
- 工号 - {{ mechanicData?.id || 'N/A' }} -
-
- 资质等级 - {{ mechanicData?.level || 'N/A' }} -
-
- 工作时长 - {{ mechanicData?.workHours || 0 }}小时 -
-
- 完成任务 - {{ mechanicData?.completedTasks || 0 }}个 -
-
- - -
- -
- -
- -
-
-
-
- +
+ +
+
+
+ + 车次信息
-
-
{{ precaution.title }}
-
{{ precaution.description }}
+
+
+ 车组位置 + 株洲西-衡阳西区间 +
+
+ 当前车次 + G6307/10/07 +
+
+ 运行区段 + 长沙南-汕头 +
+
+ 后续车次 + G6084/1/4/1 +
+
+ 后续区段 + 汕头-湛江西 +
+
+ + +
+ +
+
+
+ + +
+
+
+ + 安全事项提示 +
+
+
+ 1. + 做好动车组出入库时间点的卡控。 +
+
+ 2. + 做好途中换乘时间和换乘地点的卡控。 +
+
+ 3. + 做好途中吸污、应急上水车次的卡控。 +
+
+ 4. + 遇变换车次作业,随车机械师及时变换车次。 +
+
+ 5. + 随车机械师实际换乘情况根据当日交路安排执行。 +
+
+ 6. + "危"为部分高架梁缝间隙大于10cm且没有安全防护设施,梁缝附近挡渣墙上喷有"高空危险"的警示标志,下车作业时注意扭伤、坠落风险。 +
+
+ 7. + 长大坡道区间,无停放制动的车组注意防溜。 +
+
+ 8. + 暴雨暴雪天气,如果有雨雪进入车内的情况,站台停站时间超过30分钟的,要及时汇报应急,并沟通车长临时关门。 +
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+ +
+ +
+
+ 王平 +
+
+
+ 班组 + 技术组 +
+
+ 车型资质 + CRH3、CR400AF +
+
-
-
{{ file.name }}
-
- {{ file.size }} - {{ file.modifiedDate }} + + +
+
+ 曾凌锋 +
+
+
+ 班组 + 乘务一队 +
+
+ 车型资质 + CRH3、CR400AF +
+
+
+ + +
+
+ 颜麒麟 +
+
+
+ 班组 + 乘务二队 +
+
+ 车型资质 + CRH3、CR400AF +
+
+
+
+
+ + +
+ +
+
+ +
+
+ + +
+ +
+ +
+ + +
+ 返回重新编辑 +
+
+
+ + +
+
+ +
+
+ + 典型案例摘要 +
+
+
+
{{ typicalCaseData[0].caseSummary }}
+
来源:{{ typicalCaseData[0].fileName }}
+
+
+
+ + +
+
+ + 故障原因分析 +
+
+
{{ typicalCaseData[0].caseAnalysis }}
+
+
+ + +
+
+ + 应急处置要点 +
+
+
{{ typicalCaseData[0].emergencyPoints }}
+
+
+ + +
+
+ + 案例结论 +
+
+
{{ typicalCaseData[0].caseConclusion }}
+
+
+ + +
+
+
+ +
+
+
+
+ {{ caseItem.fileName || caseItem.title }} +
+ 预览 +
+
{{ caseItem.description }}
+
+ {{ caseItem.category }} + + {{ getDifficultyText(caseItem.difficulty) }} + + {{ caseItem.resolveTime }}分钟 +
+
@@ -299,45 +639,65 @@
-
-
-
- +
+ +
+
+ + 相关故障文件段落
-
-
-
- {{ rule.fileName || rule.title }} -
- 预览 +
+
+
{{ paragraph.title }}
+
{{ paragraph.content }}
+
来源:{{ paragraph.fileName }}
+
+
+
+ + +
+
+
+ +
+
+
+
+ {{ rule.fileName || rule.title }} +
+ 预览 +
+
{{ rule.description }}
-
{{ rule.description }}
- -
- + +
-
@@ -374,21 +733,17 @@ :class="`task-item--${task.status}`" >
-
- - - @@ -403,7 +758,6 @@
-
+
--> + + +
+ +
+
AI 助手
+
+ + + + + + + + +
+
+
+ +
+ +
+ + +
+ + +
+
@@ -528,7 +934,10 @@ import { Activity, Loader2, ChevronDown, - ChevronUp + ChevronUp, + QrCode, + MapPin, + AlertCircle } from 'lucide-vue-next'; import VabQrCode from '@/plugins/VabQrCode'; // 规章制度的 PDF 预览弹窗迁移到 HomePage 页面,组件不再直接引用 @@ -547,7 +956,9 @@ import type { RuleRegulation, PrecautionInfo, RouteInfo, - FaultCause + FaultCause, + TypicalCase, + SafetyReminder } from '@/types/dashboard'; import { useDraggable } from '@/composables/useDraggable'; @@ -578,6 +989,8 @@ interface Props { precautionList?: PrecautionInfo[]; routeData?: RouteInfo; faultCauses?: FaultCause[]; + typicalCases?: TypicalCase[]; + safetyReminders?: SafetyReminder[]; // 安全事项提示 } interface Emits { @@ -587,6 +1000,8 @@ interface Emits { (e: 'sizeChange', moduleId: string, size: Size): void; // 新增:让父组件(HomePage)打开规章制度 PDF 弹窗(使用kebab-case避免事件大小写问题) (e: 'open-rule-pdf', rule: RuleRegulation): void; + // 新增:让父组件(HomePage)打开典型案例 PDF 弹窗 + (e: 'open-case-pdf', caseItem: TypicalCase): void; } const props = withDefaults(defineProps(), { @@ -601,7 +1016,9 @@ const props = withDefaults(defineProps(), { fileList: () => [], ruleList: () => [], precautionList: () => [], - faultCauses: () => [] + faultCauses: () => [], + typicalCases: () => [], + safetyReminders: () => [] }); const emit = defineEmits(); @@ -613,6 +1030,7 @@ const diagnosticTableData = computed(() => props.diagnosticCodes || []); const ruleRegulationData = computed(() => props.ruleList || []); const precautionsData = computed(() => props.precautionList || []); const faultCausesData = computed(() => props.faultCauses || []); +const typicalCaseData = computed(() => props.typicalCases || []); // 运用信息二维码文本:将列表内容汇总为多行字符串 const operationalInfoQrText = computed(() => { @@ -636,6 +1054,46 @@ const openRulePdf = (rule: RuleRegulation) => { emit('open-rule-pdf', rule); }; +// 典型案例 PDF 预览改为由父级页面统一控制 +const openCasePdf = (caseItem: TypicalCase) => { + if (!caseItem.fileUrl) { + ElMessage.warning('该案例未配置预览文件'); + return; + } + emit('open-case-pdf', caseItem); +}; + +// 作业图表 PDF 预览 +const openWorkSchedulePdf = () => { + if (!props.routeData?.workScheduleUrl) { + ElMessage.warning('作业图表文件未配置'); + return; + } + + // 创建一个临时的规章制度对象来复用现有的PDF预览功能 + const workScheduleRule: RuleRegulation = { + id: 'work-schedule', + title: '作业图表', + description: '长沙动车乘务车间2025年第四季度随车机械师作业图表(上半部分)', + type: 'operation', + fileName: '长沙动车乘务车间2025年第四季度随车机械师作业图表(上半部分).pdf', + fileUrl: props.routeData.workScheduleUrl + }; + + emit('open-rule-pdf', workScheduleRule); +}; + +// 获取难度等级文本 +const getDifficultyText = (difficulty: string): string => { + const difficultyMap: Record = { + easy: '简单', + medium: '中等', + hard: '困难', + high: '高难度' + }; + return difficultyMap[difficulty] || difficulty; +}; + // 悬浮提示相关状态 const showTooltipFlag = ref(false); const currentTooltipContent = ref(''); @@ -726,16 +1184,23 @@ const isDragging = computed(() => dragState.isDragging); const isResizing = computed(() => dragState.isResizing); const currentSize = computed(() => dragState.size); -// AI对话功能相关数据 -const currentMessage = ref(''); // 当前输入的消息 -const isAiThinking = ref(false); // AI是否正在思考 -const chatHistoryRef = ref(); // 对话历史容器引用 -const isTaskListExpanded = ref(true); // 任务列表是否展开 +// AI对话功能相关数据 - 已注释 +// const currentMessage = ref(''); // 当前输入的消息 +// const isAiThinking = ref(false); // AI是否正在思考 +// const chatHistoryRef = ref(); // 对话历史容器引用 +// const isTaskListExpanded = ref(true); // 任务列表是否展开 + +// 输入框卡片相关数据 +const inputCardText = ref(''); // 输入框卡片的文本内容 // 二维码弹窗相关状态 const showQrDialog = ref(false); const qrCodeText = ref(''); +// 运用信息卡片状态 +const isPrecautionQrMode = ref(false); // 是否显示二维码模式 +const precautionEditText = ref('配属长沙所的CR400AF-2028+2024车组担当G6307/10/07次(长沙南-汕头,01车主控),7时46分车组运行至株洲西-衡山西区间,机械师汇报:接到司机通知,运行方向左侧撞鸟,司机未停车,已汇报行调,机械师前方衡山西站检查发现运行方向左侧头罩有撞鸟痕迹,加强盯控,维持运行。'); // 编辑文本内容 + // 对话消息接口 interface ChatMessage { type: 'user' | 'ai'; @@ -747,16 +1212,16 @@ interface ChatMessage { const chatMessages = ref([]); /** - * 切换任务列表展开/收起状态 + * 切换任务列表展开/收起状态 - 已注释 */ -const toggleTaskList = (event?: Event) => { - if (event) { - event.stopPropagation(); - event.preventDefault(); - } - isTaskListExpanded.value = !isTaskListExpanded.value; - console.log('任务列表状态切换:', isTaskListExpanded.value ? '展开' : '收起'); -}; +// const toggleTaskList = (event?: Event) => { +// if (event) { +// event.stopPropagation(); +// event.preventDefault(); +// } +// isTaskListExpanded.value = !isTaskListExpanded.value; +// console.log('任务列表状态切换:', isTaskListExpanded.value ? '展开' : '收起'); +// }; /** * 根据图标名称获取对应的图标组件 @@ -774,30 +1239,31 @@ const iconComponent = computed(() => { Activity, Loader2, ChevronDown, - ChevronUp + ChevronUp, + QrCode }; return iconMap[props.config.icon as keyof typeof iconMap] || FileText; }); /** - * 计算已完成任务数量 + * 计算已完成任务数量 - 已注释 */ -const completedTaskCount = computed(() => { - return props.taskList?.filter(task => task.status === 'completed').length || 0; -}); +// const completedTaskCount = computed(() => { +// return props.taskList?.filter(task => task.status === 'completed').length || 0; +// }); /** - * 获取任务状态文本 + * 获取任务状态文本 - 已注释 */ -const getTaskStatusText = (status: string): string => { - const statusMap: Record = { - pending: '等待中', - loading: '加载中...', - completed: '已完成', - error: '失败' - }; - return statusMap[status] || ''; -}; +// const getTaskStatusText = (status: string): string => { +// const statusMap: Record = { +// pending: '等待中', +// loading: '加载中...', +// completed: '已完成', +// error: '失败' +// }; +// return statusMap[status] || ''; +// }; /** * 计算进度百分比 @@ -819,6 +1285,23 @@ const handleMouseDown = (event: MouseEvent) => { return; // 调整大小事件由专门的处理器处理 } + // 检查是否点击在输入框、按钮等交互元素上 + if (target.tagName === 'TEXTAREA' || + target.tagName === 'INPUT' || + target.tagName === 'BUTTON' || + target.closest('button') || + target.closest('.input-card-textarea-styled') || + target.closest('.input-card-actions')) { + return; // 在交互元素上不进行拖拽 + } + + // 对于输入框卡片,只有在头部区域才允许拖拽 + if (props.config.id === 'inputCard') { + if (!target.closest('.input-card-header') && !target.closest('.input-card-drag-handle')) { + return; // 只有点击头部区域才能拖拽输入框卡片 + } + } + // 开始拖拽 startDrag(event); }; @@ -865,47 +1348,47 @@ const handleDoubleClick = (event: MouseEvent) => { }; /** - * 格式化时间戳 + * 格式化时间戳 - 已注释 */ -const formatTimestamp = (date: Date): string => { - return date.toLocaleTimeString('zh-CN', { - hour: '2-digit', - minute: '2-digit' - }); -}; +// const formatTimestamp = (date: Date): string => { +// return date.toLocaleTimeString('zh-CN', { +// hour: '2-digit', +// minute: '2-digit' +// }); +// }; /** - * 滚动到对话历史底部 + * 滚动到对话历史底部 - 已注释 */ -const scrollToBottom = () => { - nextTick(() => { - if (chatHistoryRef.value) { - chatHistoryRef.value.scrollTop = chatHistoryRef.value.scrollHeight; - } - }); -}; +// const scrollToBottom = () => { +// nextTick(() => { +// if (chatHistoryRef.value) { +// chatHistoryRef.value.scrollTop = chatHistoryRef.value.scrollHeight; +// } +// }); +// }; /** - * 模拟AI回复 + * 模拟AI回复 - 已注释 */ -const simulateAiResponse = async (userMessage: string): Promise => { - // 模拟AI思考时间 - await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 2000)); - - // 简单的回复逻辑 - const responses = [ - '我理解您的问题。根据系统数据分析,建议您检查相关设备状态。', - '这是一个很好的问题。让我为您查询相关的技术文档和历史案例。', - '基于当前的运维数据,我建议采取以下措施进行处理。', - '您提到的情况在历史记录中有类似案例,建议参考标准处置流程。', - '我已经分析了相关数据,这里有一些建议供您参考。' - ]; - - return responses[Math.floor(Math.random() * responses.length)]; -}; +// const simulateAiResponse = async (userMessage: string): Promise => { +// // 模拟AI思考时间 +// await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 2000)); +// +// // 简单的回复逻辑 +// const responses = [ +// '我理解您的问题。根据系统数据分析,建议您检查相关设备状态。', +// '这是一个很好的问题。让我为您查询相关的技术文档和历史案例。', +// '基于当前的运维数据,我建议采取以下措施进行处理。', +// '您提到的情况在历史记录中有类似案例,建议参考标准处置流程。', +// '我已经分析了相关数据,这里有一些建议供您参考。' +// ]; +// +// return responses[Math.floor(Math.random() * responses.length)]; +// }; /** - * 处理运用信息点击事件 + * 处理运用信息点击事件 - 切换到二维码模式 */ const handlePrecautionClick = (event: MouseEvent) => { console.log('handlePrecautionClick 被调用'); @@ -914,60 +1397,83 @@ const handlePrecautionClick = (event: MouseEvent) => { event.preventDefault(); event.stopPropagation(); - // 获取运用信息内容 - const operationalInfo = "配属长沙所的CR400AF-2028+2024车组担当G6307/10/07次(长沙南-汕头,01车主控),7时46分车组运行至株洲西-衡山西区间,机械师汇报:接到司机通知,运行方向左侧撞鸟,司机未停车,已汇报行调,机械师前方衡山西站检查发现运行方向左侧头罩有撞鸟痕迹,加强盯控,维持运行。"; - - console.log('设置二维码内容:', operationalInfo); - qrCodeText.value = operationalInfo; - console.log('显示二维码弹窗'); - showQrDialog.value = true; - console.log('showQrDialog.value:', showQrDialog.value); + // 切换到二维码显示模式 + isPrecautionQrMode.value = true; + console.log('切换到二维码模式'); }; /** - * 处理发送消息 + * 处理返回编辑模式 */ -const handleSendMessage = async () => { - if (!currentMessage.value.trim() || isAiThinking.value) return; +const handleReturnToEdit = (event: MouseEvent) => { + console.log('handleReturnToEdit 被调用'); - try { - // 添加用户消息 - const userMessage: ChatMessage = { - type: 'user', - content: currentMessage.value.trim(), - timestamp: formatTimestamp(new Date()) - }; - chatMessages.value.push(userMessage); - - // 清空输入框 - const messageToSend = currentMessage.value.trim(); - currentMessage.value = ''; - - // 滚动到底部 - scrollToBottom(); - - // 设置AI思考状态 - isAiThinking.value = true; - - // 模拟AI回复 - const aiResponse = await simulateAiResponse(messageToSend); - - // 添加AI回复 - const aiMessage: ChatMessage = { - type: 'ai', - content: aiResponse, - timestamp: formatTimestamp(new Date()) - }; - chatMessages.value.push(aiMessage); - - // 滚动到底部 - scrollToBottom(); - - } catch (error) { - console.error('发送消息失败:', error); - } finally { - isAiThinking.value = false; - } + // 阻止事件冒泡,防止触发拖拽 + event.preventDefault(); + event.stopPropagation(); + + // 切换回编辑模式 + isPrecautionQrMode.value = false; + console.log('切换回编辑模式'); +}; + +/** + * 处理发送消息 - 已注释 + */ +// const handleSendMessage = async () => { +// if (!currentMessage.value.trim() || isAiThinking.value) return; +// +// try { +// // 添加用户消息 +// const userMessage: ChatMessage = { +// type: 'user', +// content: currentMessage.value.trim(), +// timestamp: formatTimestamp(new Date()) +// }; +// chatMessages.value.push(userMessage); +// +// // 清空输入框 +// const messageToSend = currentMessage.value.trim(); +// currentMessage.value = ''; +// +// // 滚动到底部 +// scrollToBottom(); +// +// // 设置AI思考状态 +// isAiThinking.value = true; +// +// // 模拟AI回复 +// const aiResponse = await simulateAiResponse(messageToSend); +// +// // 添加AI回复 +// const aiMessage: ChatMessage = { +// type: 'ai', +// content: aiResponse, +// timestamp: formatTimestamp(new Date()) +// }; +// chatMessages.value.push(aiMessage); +// +// // 滚动到底部 +// scrollToBottom(); +// +// } catch (error) { +// console.error('发送消息失败:', error); +// } finally { +// isAiThinking.value = false; +// } +// }; + +/** + * 处理输入框卡片提交 + */ +const handleInputCardSubmit = () => { + if (!inputCardText.value.trim()) return; + + console.log('输入框卡片提交:', inputCardText.value.trim()); + // 这里可以添加具体的处理逻辑,比如发送到父组件或调用API + + // 清空输入框 + inputCardText.value = ''; }; // 监听位置和大小变化,使用节流避免过于频繁的事件发射 @@ -1021,54 +1527,54 @@ watch( { deep: true, immediate: false } ); -// 监听初始问题,自动添加到对话历史 -let hasProcessedInitialQuestion = false; // 标记是否已处理初始问题 +// 监听初始问题,自动添加到对话历史 - 已注释 +// let hasProcessedInitialQuestion = false; // 标记是否已处理初始问题 -watch( - () => props.initialQuestion, - async (newQuestion) => { - // 只有当问题不为空且未处理过时才处理 - if (newQuestion && newQuestion.trim() && !hasProcessedInitialQuestion && props.config.id === 'aiChat') { - hasProcessedInitialQuestion = true; - - try { - // 添加用户消息 - const userMessage: ChatMessage = { - type: 'user', - content: newQuestion.trim(), - timestamp: formatTimestamp(new Date()) - }; - chatMessages.value.push(userMessage); - - // 滚动到底部 - scrollToBottom(); - - // 设置AI思考状态 - isAiThinking.value = true; - - // 模拟AI回复 - const aiResponse = await simulateAiResponse(newQuestion.trim()); - - // 添加AI回复 - const aiMessage: ChatMessage = { - type: 'ai', - content: aiResponse, - timestamp: formatTimestamp(new Date()) - }; - chatMessages.value.push(aiMessage); - - // 滚动到底部 - scrollToBottom(); - - } catch (error) { - console.error('处理初始问题失败:', error); - } finally { - isAiThinking.value = false; - } - } - }, - { immediate: true } // 立即执行一次 -); +// watch( +// () => props.initialQuestion, +// async (newQuestion) => { +// // 只有当问题不为空且未处理过时才处理 +// if (newQuestion && newQuestion.trim() && !hasProcessedInitialQuestion && props.config.id === 'inputCard') { +// hasProcessedInitialQuestion = true; +// +// try { +// // 添加用户消息 +// const userMessage: ChatMessage = { +// type: 'user', +// content: newQuestion.trim(), +// timestamp: formatTimestamp(new Date()) +// }; +// chatMessages.value.push(userMessage); +// +// // 滚动到底部 +// scrollToBottom(); +// +// // 设置AI思考状态 +// isAiThinking.value = true; +// +// // 模拟AI回复 +// const aiResponse = await simulateAiResponse(newQuestion.trim()); +// +// // 添加AI回复 +// const aiMessage: ChatMessage = { +// type: 'ai', +// content: aiResponse, +// timestamp: formatTimestamp(new Date()) +// }; +// chatMessages.value.push(aiMessage); +// +// // 滚动到底部 +// scrollToBottom(); +// +// } catch (error) { +// console.error('处理初始问题失败:', error); +// } finally { +// isAiThinking.value = false; +// } +// } +// }, +// { immediate: true } // 立即执行一次 +// ); \ No newline at end of file diff --git a/chat-client/src/constants/modules.ts b/chat-client/src/constants/modules.ts index 0e01394..ce9dc7f 100644 --- a/chat-client/src/constants/modules.ts +++ b/chat-client/src/constants/modules.ts @@ -61,11 +61,11 @@ export const MODULE_CONFIGS: ModuleConfig[] = [ description: '显示车组运用过程中的重要信息和事件记录' }, { - id: 'aiChat', - title: 'AI助手对话', + id: 'inputCard', + title: '输入框卡片', icon: 'Activity', color: '#00D4FF', - description: '与AI助手进行智能对话,获取运维建议和技术支持' + description: '用于输入消息或指令的交互界面' } ] diff --git a/chat-client/src/services/dashboardService.ts b/chat-client/src/services/dashboardService.ts index 74357e0..387fd91 100644 --- a/chat-client/src/services/dashboardService.ts +++ b/chat-client/src/services/dashboardService.ts @@ -12,7 +12,8 @@ import type { RuleRegulation, PrecautionInfo, RouteInfo, - FaultCause + FaultCause, + SafetyReminder } from '@/types/dashboard' import * as dashboardApi from '@/api/dashboard' import { USE_MOCK_DATA, MOCK_NETWORK_DELAY } from '@/config/dashboard.config' @@ -24,30 +25,65 @@ export const generateTrainData = (): TrainInfo[] => { return [ { id: '1', - name: 'CRH380B-3686', - status: 'running', - location: '金华-金华', - speed: 280, - mileage: 6335222, - lastMaintenance: '2024-01-15' + name: 'CR400AF-2028', + status: 'maintenance', + location: '长沙所', + speed: 0, + mileage: 5066507, + lastMaintenance: '2024-11-21', + // 详细信息 + bureau: '广', + depot: '沙', + station: '长沙所', + assetProperty: '国铁集团', + detailedStatus: '二级检修', + speedLevel: 300, + formation: 8, + seatType: '座车', + manufacturer: '四方股份', + manufactureDate: '2017-09', + // 高级修信息 + maintenanceInfo: { + totalMileage: 5066507, + lastMaintenanceType: '三级修', + lastMaintenanceRound: 'A32', + lastMaintenanceDate: '2024-11-21', + lastMaintenanceMileage: 4372153, + mileageAfterMaintenance: 694354, + nextMaintenanceType: '五级修', + nextMaintenanceRound: 'A51' + } }, { id: '2', - name: 'CRH380B-3688', - status: 'maintenance', - location: '新塘动车运用所', - speed: 0, - mileage: 5842100, - lastMaintenance: '2024-01-10' - }, - { - id: '3', - name: 'CRH380B-3631', - status: 'standby', - location: '新塘动车运用所', - speed: 0, - mileage: 4523890, - lastMaintenance: '2024-01-12' + name: 'CR400AF-2024', + status: 'running', + location: '长沙所', + speed: 250, + mileage: 4921189, + lastMaintenance: '2024-11-21', + // 详细信息 + bureau: '广', + depot: '沙', + station: '长沙所', + assetProperty: '国铁集团', + detailedStatus: '载客运行', + speedLevel: 300, + formation: 8, + seatType: '座车', + manufacturer: '四方股份', + manufactureDate: '2017-09', + // 高级修信息 + maintenanceInfo: { + totalMileage: 4921189, + lastMaintenanceType: '三级修', + lastMaintenanceRound: 'A32', + lastMaintenanceDate: '2024-11-21', + lastMaintenanceMileage: 4233893, + mileageAfterMaintenance: 687296, + nextMaintenanceType: '五级修', + nextMaintenanceRound: 'A51' + } } ] } @@ -59,30 +95,39 @@ export const generateMechanicData = (): MechanicInfo[] => { return [ { id: '1', - name: '李师傅', - level: '高级机械师', + name: '王平', + level: '技术组', status: 'working', - currentTask: '车组检修', + currentTask: '技术组', completedTasks: 156, - workHours: 2340 + workHours: 2340, + // 新增字段,参考CLClient中的样式 + team: '技术组', + qualifications: 'CRH3、CR400AF' }, { id: '2', - name: '张工', - level: '中级机械师', + name: '曾凌锋', + level: '乘务一队', status: 'available', - currentTask: '无', + currentTask: '乘务一队', completedTasks: 98, - workHours: 1680 + workHours: 1680, + // 新增字段,参考CLClient中的样式 + team: '乘务一队', + qualifications: 'CRH3、CR400AF' }, { id: '3', - name: '王师傅', - level: '高级机械师', + name: '颜麒麟', + level: '乘务二队', status: 'break', - currentTask: '休息中', + currentTask: '乘务二队', completedTasks: 203, - workHours: 3120 + workHours: 3120, + // 新增字段,参考CLClient中的样式 + team: '乘务二队', + qualifications: 'CRH3、CR400AF' } ] } @@ -93,28 +138,36 @@ export const generateMechanicData = (): MechanicInfo[] => { export const generateDiagnosticData = (): DiagnosticCode[] => { return [ { - code: '191A', - description: '间接制动试验过程中,间接制动受到干扰', - severity: 'medium', - frequency: 12, - category: '制动系统', + code: '3044', + description: '受电弓升弓位置异常', + severity: 'high', + frequency: 8, + category: '受电弓系统', lastOccurrence: '2024-01-14' }, { - code: '2C4F', - description: '牵引系统异常', - severity: 'high', - frequency: 5, - category: '牵引系统', + code: '3041', + description: '受电弓自动降弓异常', + severity: 'medium', + frequency: 12, + category: '受电弓系统', lastOccurrence: '2024-01-13' }, { - code: '3A2B', - description: '空调系统压力异常', - severity: 'low', - frequency: 8, - category: '空调系统', + code: '3042', + description: '受电弓位置开关信号异常', + severity: 'medium', + frequency: 6, + category: '受电弓系统', lastOccurrence: '2024-01-12' + }, + { + code: '3045', + description: '受电弓DIO模块通信异常', + severity: 'low', + frequency: 4, + category: '受电弓系统', + lastOccurrence: '2024-01-11' } ] } @@ -126,30 +179,48 @@ export const generateTreatmentData = (): TreatmentMethod[] => { return [ { id: '1', - title: '完成当前制动试验步骤', - description: '忽略代码191A,继续完成其余制动试验项目,确保故障车制动有效率不显示。', - source: '故障代码191A', - estimatedTime: 30, - requiredTools: ['扳手', '万用表'], - safetyNotes: ['确保车辆静止', '佩戴防护装备'] + title: '维持运行', + description: '确认受电弓状态正常后,继续运行至前方站点。', + source: '受电弓故障应急处置办法', + estimatedTime: 5, + requiredTools: ['弓网视频监控'], + safetyNotes: ['通过弓网视频确认受电弓状态'] }, { id: '2', - title: '切除故障车空气制动', - description: '对08车空气制动切除,并按照限速表中制动切除后限速值运行。', - source: '故障代码191A', - estimatedTime: 20, - requiredTools: ['操作手册'], - safetyNotes: ['严格按限速值运行'] + title: '重新操作升弓', + description: '车速200km/h以下操作降弓然后再次进行升弓操作,HMI屏确认故障是否再次发生。若故障消失,闭合总真空断路器,正常运行;若故障再次发生,根据现车状态隔离相应受电弓,操作换弓,维持运行。', + source: '受电弓升弓位置异常处置规程', + estimatedTime: 10, + requiredTools: ['HMI操作屏', '总真空断路器'], + safetyNotes: ['换弓操作需降速至200km/h以下', '确认HMI屏显示状态'] }, { id: '3', - title: '复位相关空开', - description: '若故障未消除,尝试复位08车BCU空开(如42-F01/42-F02),并重新进行制动试验。', - source: '《CRH380B车型诊断代码总表—CRH380B(G)型》《录入运用信息_20240101-20240531.xls》', + title: '断开升弓断路器处置', + description: '若仅单弓升起,或升弓时报出受电弓升弓位置异常(3044),则断开自动降弓编组靠近重联端的受电弓车厢[升弓]断路器,重新升弓后维持运行。', + source: '重联车单弓异常降弓应急处置办法', estimatedTime: 15, - requiredTools: ['工具箱'], - safetyNotes: ['确认空开状态后操作'] + requiredTools: ['升弓断路器操作工具'], + safetyNotes: ['确认断路器位置', '重新升弓前确认安全'] + }, + { + id: '4', + title: '申请救援或继电器处置', + description: '若后续途中再次发生单弓异常降弓,则使用剩余受电弓维持运行至前方站后,申请救援或对调降弓编组头尾车总配电柜MXR1继电器后维持运行。', + source: '重联车受电弓故障应急处置规程', + estimatedTime: 30, + requiredTools: ['总配电柜操作工具', 'MXR1继电器'], + safetyNotes: ['确保至少一个受电弓正常工作', '必要时申请救援'] + }, + { + id: '5', + title: '检修受电弓位置开关', + description: '检修受电弓位置开关状态,检查采集以上信号的网络DIO模块能够正确采集到升弓位置开关信息。', + source: '受电弓检修维护指南', + estimatedTime: 45, + requiredTools: ['万用表', '网络DIO模块测试仪', '位置开关检测工具'], + safetyNotes: ['断电后进行检修', '确认DIO模块信号采集正常', '佩戴防护装备'] } ] } @@ -161,21 +232,48 @@ export const generateCaseData = (): TypicalCase[] => { return [ { id: '1', - title: 'CRH380B-3688车组191A故障处理案例', - description: '司机制动手柄操作导致的间接制动干扰', - solution: '指导司机正确操作制动手柄', - category: '制动系统', - difficulty: 'easy', - resolveTime: 20 + title: '重联动车组近端两架受电弓同时升起故障', + description: '重联动车组在运行过程中出现近端两架受电弓同时升起的异常情况,需要进行应急处置', + solution: '按照应急处置流程进行单弓降弓操作,确保安全运行', + category: '受电弓系统', + difficulty: 'high', + resolveTime: 30, + fileName: '3.典型故障案例-重联动车组近端两架受电弓同时升起故障.pdf', + fileUrl: '/dxal/3.典型故障案例-重联动车组近端两架受电弓同时升起故障.pdf', + caseSummary: '重联动车组在升弓操作时,由于网络误判重联状态,导致近端两架受电弓同时升起,触发升弓位置异常故障(代码3044),系统自动降弓保护。司机未立即停车,但触发了自动降弓保护机制。', + caseAnalysis: '直接原因:A列00车MXR1继电器辅助触点故障,导致联挂完成信号(T741线)异常失电,CCU误判重联状态。连锁反应:A列06车因误判为"后弓",与B列03车同时升弓,触发故障代码3044。硬件问题:MXR1继电器(型号B400)的第三组触点故障。', + emergencyPoints: '1.优先通过视频监控确认故障情况;2.若受电弓拉弧严重,需逐级降速(每40km/h一个等级);3.故障处理完毕后,需在前方停车站检查受电弓状态;4.若重联车单弓异常降弓,可断开故障编组靠近重联端的升弓断路器,重新升弓维持运行。', + caseConclusion: '故障本质为MXR1继电器辅助触点失效,导致网络误判重联状态,引发升弓逻辑冲突及安全环路异常。若故障属于"无需降弓"或"降弓不停车"场景,且通过视频监控确认故障不影响运行,升弓或换弓后控制速度≤200km/h,则司机未停车符合应急处置要求。' }, { id: '2', - title: 'CRH380B-3631总风压力不足案例', - description: '空气制动系统压力异常', - solution: '检查并修复空气压缩机', - category: '制动系统', + title: '重联动车组网络WTB初运行导致受电弓无法升起故障', + description: '重联动车组网络WTB系统初始化运行时出现受电弓无法升起的故障情况', + solution: '检查网络WTB系统状态,重新初始化网络连接,确保受电弓控制信号正常', + category: '受电弓系统', difficulty: 'medium', - resolveTime: 90 + resolveTime: 45, + fileName: '3.典型故障案例-重联动车组网络WTB初运行导致受电弓无法升起故障.pdf', + fileUrl: '/dxal/3.典型故障案例-重联动车组网络WTB初运行导致受电弓无法升起故障.pdf', + caseSummary: '重联动车组在启动时,网络WTB系统进行初运行过程中出现异常,导致受电弓控制信号中断,无法正常升起受电弓。故障表现为升弓指令发出后,受电弓无响应,HMI显示升弓失败。', + caseAnalysis: '网络WTB初运行过程中,重联信号传输异常,导致CCU无法正确识别编组状态。可能原因包括:1.网络连接不稳定;2.WTB总线通信故障;3.重联继电器状态异常;4.网络初始化时序问题。', + emergencyPoints: '1.检查网络WTB系统状态指示灯;2.重新进行WTB初运行操作;3.确认重联信号传输正常;4.若网络故障持续,可尝试重启网络系统;5.必要时联系技术支持进行远程诊断。', + caseConclusion: '网络WTB初运行故障通常为临时性故障,通过重新初始化网络连接可解决。预防措施包括定期检查网络连接状态,确保重联继电器工作正常,避免在恶劣环境下进行网络操作。' + }, + { + id: '3', + title: '受电弓升弓位置异常(内含代码3044和重联继电器MXR1故障应急处置)', + description: '受电弓升弓位置出现异常,伴随故障代码3044,涉及重联继电器MXR1的故障处置', + solution: '根据故障代码3044进行诊断,检查重联继电器MXR1状态,执行相应的应急处置措施', + category: '受电弓系统', + difficulty: 'high', + resolveTime: 60, + fileName: '典型故障案例:受电弓升弓位置异常(内含代码3044和重联继电器MXR1故障应急处置).pdf', + fileUrl: '/dxal/典型故障案例:受电弓升弓位置异常(内含代码3044和重联继电器MXR1故障应急处置).pdf', + caseSummary: 'B列00车主控时,升06车受电弓,出库前A列06车自动降弓。后续在B列00车重新操作升弓时,B列03车与A列06车受电弓同时升起,触发受电弓升弓位置异常故障(代码3044),导致自动降弓。司机未停车但触发自动降弓保护。', + caseAnalysis: '直接原因:A列00车MXR1继电器辅助触点故障,导致联挂完成信号(T741线)异常失电,CCU误判重联状态。连锁反应:A列06车因误判为"后弓",与B列03车同时升弓,触发故障代码3044。HMI操作切除受电弓时,因单元位置误判,导致03/06车同时切除或切除无效。硬件问题:MXR1继电器(型号B400)的第三组触点故障,辅助触点未闭合(T741线电压为0V),但主触点正常得电。', + emergencyPoints: '视频监控优先:装有受电弓视频监控装置的动车组,应优先通过监控确认故障。限速运行要求:若受电弓拉弧严重,需逐级降速(每40km/h一个等级)直至受流正常。应急处置后检查:故障处理完毕后,需在前方停车站检查受电弓状态。重联车处置:若重联车单弓异常降弓,可断开故障编组靠近重联端的升弓断路器,重新升弓维持运行。', + caseConclusion: '故障本质为MXR1继电器辅助触点失效,导致网络误判重联状态,引发升弓逻辑冲突及安全环路异常。司机未停车的处理需结合故障性质、监控确认和限速操作进行合规性判断。若故障属于"无需降弓"或"降弓不停车"场景,且通过视频监控确认故障不影响运行,升弓或换弓后控制速度≤200km/h,则司机未停车符合应急处置要求。' } ] } @@ -228,35 +326,71 @@ export const generateRuleData = (): RuleRegulation[] => { { id: '1', title: '国铁文件', - description: '机辆动客电〔2021〕304号', + description: '广铁辆发[2020]7号', type: 'national', effectiveDate: '2024-01-01', complianceRate: 98.5, violations: 3, - fileName: '《广州局集团公司行车突发事件应急预案》车辆专业内容的通知.pdf', - fileUrl: '/notice.pdf' + fileName: '中国铁路广州局集团有限公司关于发布《广州局集团公司动车组受电弓故障应急处置办法(修订)的通知(废止:广铁辆发[2012]229号).pdf', + fileUrl: '/gzzd/1.pdf', + faultParagraphs: [ + { + title: '受电弓升弓位置异常故障处置', + content: '当动车组出现受电弓升弓位置异常故障(代码3044)时,司机应立即停车检查。若故障发生在重联动车组中,应优先通过视频监控确认故障情况,避免盲目操作。对于MXR1继电器故障导致的升弓逻辑异常,需断开故障编组靠近重联端的升弓断路器,重新升弓维持运行。', + fileName: '中国铁路广州局集团有限公司关于发布《广州局集团公司动车组受电弓故障应急处置办法(修订)的通知(废止:广铁辆发[2012]229号).pdf' + }, + { + title: '重联继电器故障应急处置', + content: '重联继电器MXR1故障会导致网络误判重联状态,引发升弓逻辑冲突。应急处置时,应检查T741线电压,确认联挂完成信号状态。若辅助触点故障但主触点正常,可临时维持运行,但需加强监控,必要时按救援方式运行。', + fileName: '中国铁路广州局集团有限公司关于发布《广州局集团公司动车组受电弓故障应急处置办法(修订)的通知(废止:广铁辆发[2012]229号).pdf' + } + ] }, { id: '2', title: '集团文件', - description: '机辆动客网〔2023〕297号', + description: '集团文件', type: 'group', effectiveDate: '2024-01-01', complianceRate: 96.2, violations: 7, - fileName: '《广州局集团公司行车突发事件应急预案》车辆专业内容的通知.pdf', - fileUrl: '/notice.pdf' + fileName: '广铁(集团)公司车辆处关于明确动车组受电弓升弓操作方式的函.pdf', + fileUrl: '/gzzd/2.pdf', + faultParagraphs: [ + { + title: '升弓操作方式规范', + content: '动车组升弓操作应严格按照"前-前弓"或"后-后弓"的原则进行,避免同时升起近端两架受电弓。在重联编组中,主控端默认升"后-后弓",若不可用则选择"前-前弓"。升弓前应确认网络状态正常,避免因WTB初运行导致升弓失败。', + fileName: '广铁(集团)公司车辆处关于明确动车组受电弓升弓操作方式的函.pdf' + }, + { + title: '升弓失败处理流程', + content: '当升弓操作失败时,应首先检查网络WTB系统状态,确认重联信号正常。若为网络初始化问题,可重新进行WTB初运行。若为硬件故障,应按照故障代码进行相应处置,必要时联系技术支持。', + fileName: '广铁(集团)公司车辆处关于明确动车组受电弓升弓操作方式的函.pdf' + } + ] }, { id: '3', title: '段级文件', - description: '安全管理制度汇编', + description: '辆电【2023】271号', type: 'department', effectiveDate: '2024-01-01', complianceRate: 95.8, violations: 5, - fileName: '《广州局集团公司行车突发事件应急预案》车辆专业内容的通知.pdf', - fileUrl: '/notice.pdf' + fileName: '广州局集团公司车辆部关于2023年10月15日CRH6F-0410车组03车受电弓无法升起的通报.pdf', + fileUrl: '/gzzd/3.pdf', + faultParagraphs: [ + { + title: 'CRH6F车组受电弓故障案例', + content: '2023年10月15日,CRH6F-0410车组03车受电弓无法升起,经检查发现受电弓升弓位置异常。通过视频监控确认故障后,司机按限速要求操作,最终在前方停车站检查受电弓状态。此案例说明视频监控在故障确认中的重要作用。', + fileName: '广州局集团公司车辆部关于2023年10月15日CRH6F-0410车组03车受电弓无法升起的通报.pdf' + }, + { + title: '应急处置后检查要求', + content: '故障处理完毕后,必须在前方停车站检查受电弓状态,确认升弓功能正常。若受电弓拉弧严重,需逐级降速(每40km/h一个等级)直至受流正常。检查时应重点关注受电弓与接触网的接触状态。', + fileName: '广州局集团公司车辆部关于2023年10月15日CRH6F-0410车组03车受电弓无法升起的通报.pdf' + } + ] } ] } @@ -282,13 +416,67 @@ export const generateRouteData = (): RouteInfo[] => { return [ { id: '1', - currentLocation: '金华站', - nextTrain: 'G2114 金华→广州南', - restriction: '制动切除后限速160km/h' + currentLocation: '株洲西-衡阳西区间', + nextTrain: 'G6084/1/4/1', + restriction: '制动切除后限速160km/h', + // 新增字段,根据图片内容 + currentTrainNumber: 'G6307/10/07', + currentRoute: '长沙南-汕头', + followingTrainNumber: 'G6084/1/4/1', + followingRoute: '汕头-湛江西', + workScheduleUrl: '/jl/长沙动车乘务车间2025年第四季度随车机械师作业图表(上半部分).pdf' } ] } +/** + * 生成安全事项提示数据 + */ +export const generateSafetyRemindersData = (): SafetyReminder[] => { + return [ + { + id: '1', + level: 'warning', + content: '做好动车组出入库时间点的卡控。' + }, + { + id: '2', + level: 'warning', + content: '做好途中换乘时间和换乘地点的卡控。' + }, + { + id: '3', + level: 'warning', + content: '做好途中吸污,应急上水车次的卡控。' + }, + { + id: '4', + level: 'normal', + content: '遇变换车次作业,随车机械师及时变换车次。' + }, + { + id: '5', + level: 'normal', + content: '随车机械师实际换乘情况根据当日交路安排执行。' + }, + { + id: '6', + level: 'danger', + content: '"危"为部分高架线缝间隙大于10cm且没有安全防护设施,梁缝附近沿着墙上喷有"高空危险"的警示标志,下车作业时注意扭伤、坠落风险。' + }, + { + id: '7', + level: 'normal', + content: '长大隧道区间,无停放制动的车组注意防溜。' + }, + { + id: '8', + level: 'warning', + content: '暴雨暴雪天气,如果有雨进入车内的情况,站台停步时间超过30分钟的,要及时汇报应急,并沟通车临时关门。' + } + ]; +}; + /** * 生成模拟故障原因数据 */ @@ -296,13 +484,23 @@ export const generateFaultCauseData = (): FaultCause[] => { return [ { id: '1', - description: '间接制动试验过程中,间接制动受到干扰', - source: '依据诊断代码191A描述' + description: '受电弓升弓位置开关故障或信号异常', + source: '依据受电弓升弓位置异常故障代码3044分析' }, { id: '2', - description: '司机制动手柄操作不当', - source: '参考标准文件处置信息中CRH380B-3688车组案例,故障代码191A由司机操作问题导致' + description: '网络DIO模块无法正确采集升弓位置开关信息', + source: '参考受电弓检修维护指南,DIO模块信号采集异常导致' + }, + { + id: '3', + description: '重联车自动降弓系统异常触发', + source: '重联车单弓异常降弓故障分析,自动降弓编组控制异常' + }, + { + id: '4', + description: '受电弓机械部件卡滞或损坏', + source: '弓网视频监控发现受电弓物理状态异常' } ] } @@ -341,7 +539,8 @@ export class DashboardService { ruleRegulations: generateRuleData(), precautions: generatePrecautionsData(), routeInfo: generateRouteData(), - faultCauses: generateFaultCauseData() + faultCauses: generateFaultCauseData(), + safetyReminders: generateSafetyRemindersData() } } @@ -403,7 +602,10 @@ export class DashboardService { case 'emergencyDisposal': return generateTreatmentData() case 'routeInfo': - return generateRouteData() + return { + routeInfo: generateRouteData(), + safetyReminders: generateSafetyRemindersData() + } case 'typicalCase': return generateCaseData() case 'ruleRegulation': diff --git a/chat-client/src/store/modules/dashboard.ts b/chat-client/src/store/modules/dashboard.ts index 15d2908..a55c9cd 100644 --- a/chat-client/src/store/modules/dashboard.ts +++ b/chat-client/src/store/modules/dashboard.ts @@ -204,7 +204,7 @@ export const useDashboardStore = defineStore('dashboard', () => { return ruleRegulations.value case 'precautions': return precautions.value - case 'aiChat': + case 'inputCard': return [] default: return [] diff --git a/chat-client/src/types/dashboard.ts b/chat-client/src/types/dashboard.ts index ae0cda9..09a3d6f 100644 --- a/chat-client/src/types/dashboard.ts +++ b/chat-client/src/types/dashboard.ts @@ -2,15 +2,40 @@ * 智能运维大屏系统 - TypeScript类型定义 */ +// 车组高级修信息接口 +export interface TrainMaintenanceInfo { + totalMileage: number; // 总累计走行公里 + lastMaintenanceType: string; // 上次高级修程 + lastMaintenanceRound: string; // 上次高级修程轮次 + lastMaintenanceDate: string; // 上次高级修修峻日期 + lastMaintenanceMileage: number; // 上次高级修修竣时走行公里 + mileageAfterMaintenance: number; // 上次高级修程后走行公里 + nextMaintenanceType: string; // 下次高级修程 + nextMaintenanceRound: string; // 下次高级修程轮次 +} + // 车组信息接口 export interface TrainInfo { id: string; - name: string; + name: string; // 车组号 status: 'running' | 'maintenance' | 'standby'; location: string; speed: number; mileage: number; lastMaintenance: string; + // 新增详细信息 + bureau?: string; // 配属局 + depot?: string; // 配属段 + station?: string; // 配属所 + assetProperty?: string; // 资产属性 + detailedStatus?: string; // 详细状态 + speedLevel?: number; // 速度等级 + formation?: number; // 编组 + seatType?: string; // 坐卧种类 + manufacturer?: string; // 制造厂 + manufactureDate?: string; // 制造年月 + // 高级修信息 + maintenanceInfo?: TrainMaintenanceInfo; } // 机械师信息接口 @@ -22,6 +47,9 @@ export interface MechanicInfo { currentTask: string; completedTasks: number; workHours: number; + // 新增字段,参考CLClient中的样式 + team?: string; // 班组 + qualifications?: string; // 车型资质 } // 诊断代码信息接口 @@ -53,8 +81,16 @@ export interface TypicalCase { description: string; solution: string; category: string; - difficulty: 'easy' | 'medium' | 'hard'; + difficulty: 'easy' | 'medium' | 'hard' | 'high'; resolveTime: number; + // 新增:用于前端展示与预览 + fileName?: string; + fileUrl?: string; + // 新增:典型案例摘要和文件段落内容 + caseSummary?: string; // 典型案例摘要 + caseAnalysis?: string; // 故障原因分析 + emergencyPoints?: string; // 应急处置要点 + caseConclusion?: string; // 案例结论 } // 标准文件信息接口 @@ -84,6 +120,12 @@ export interface RuleRegulation { // 新增:用于前端展示与预览 fileName?: string; fileUrl?: string; + // 新增:相关故障的文件段落内容 + faultParagraphs?: Array<{ + title: string; // 段落标题 + content: string; // 段落内容 + fileName: string; // 所属文件名 + }>; } // 注意事项信息接口 @@ -101,6 +143,19 @@ export interface RouteInfo { currentLocation: string; nextTrain: string; restriction: string; + // 新增字段 + currentTrainNumber: string; // 当前车次 + currentRoute: string; // 运行区段 + followingTrainNumber: string; // 后续车次 + followingRoute: string; // 后续区段 + workScheduleUrl?: string; // 作业图表PDF文件URL +} + +// 安全事项提示 +export interface SafetyReminder { + id: string; + level: 'normal' | 'warning' | 'danger'; + content: string; } // 故障原因接口 @@ -121,7 +176,7 @@ export type ModuleType = | 'typicalCase' | 'ruleRegulation' | 'precautions' - | 'aiChat'; + | 'inputCard'; // 模块配置接口 export interface ModuleConfig { diff --git a/chat-client/src/views/chatweb/homePage/index.vue b/chat-client/src/views/chatweb/homePage/index.vue index 86946cb..d2abbf5 100644 --- a/chat-client/src/views/chatweb/homePage/index.vue +++ b/chat-client/src/views/chatweb/homePage/index.vue @@ -5,7 +5,7 @@
-

今天有什么问题?

+
@@ -22,7 +22,7 @@ class="chat-input" placeholder="发消息或输入..." @keyup.enter="handleQuestionSubmit" - rows="3" + rows="1" >
@@ -76,8 +76,8 @@ :is-draggable="isDragEnabled" :initial-position="moduleLayouts[config.id]?.position || { x: 0, y: 0 }" :initial-size="moduleLayouts[config.id]?.size || { width: 280, height: 200 }" - :initial-question="config.id === 'aiChat' ? submittedQuestion : ''" - :task-list="config.id === 'aiChat' ? taskList : []" + :initial-question="config.id === 'inputCard' ? submittedQuestion : ''" + :task-list="config.id === 'inputCard' ? taskList : []" :train-data="getTrainData(config.id)" :mechanic-data="getMechanicData(config.id)" :diagnostic-codes="getDiagnosticCodes(config.id)" @@ -87,6 +87,7 @@ :precaution-list="getPrecautionList(config.id)" :route-data="getRouteData(config.id)" :fault-causes="getFaultCauses(config.id)" + :typical-cases="getTypicalCases(config.id)" :class="[ `animate-slide-in-up animate-delay-${(index + 1) * 100}`, 'draggable-module-card' @@ -97,6 +98,7 @@ @position-change="handlePositionChange" @size-change="handleSizeChange" @open-rule-pdf="handleOpenRulePdf" + @open-case-pdf="handleOpenCasePdf" />
@@ -129,7 +131,7 @@ -// 规章制度 PDF 预览状态与方法(页面级) -const rulePdfDialogVisible = ref(false); -const currentRulePdfUrl = ref(''); -const rulePdfLoading = ref(false); -const handleOpenRulePdf = (rule: RuleRegulation) => { - if (!rule.fileUrl) { - ElMessage.warning('该条目未配置预览文件'); - return; - } - currentRulePdfUrl.value = rule.fileUrl; - rulePdfLoading.value = true; - rulePdfDialogVisible.value = true; -}; /* 规章制度 PDF 预览弹窗样式(页面级) */ .rule-pdf-dialog { :deep(.el-dialog__header) { @@ -1898,7 +1950,7 @@ const handleOpenRulePdf = (rule: RuleRegulation) => { } .preview-content { - min-height: 600px; + min-height: 750px; display: flex; align-items: center; justify-content: center; @@ -1908,8 +1960,9 @@ const handleOpenRulePdf = (rule: RuleRegulation) => { .pdf-preview { width: 100%; - height: 600px; + height: 750px; border-radius: 8px; overflow: hidden; background: #ffffff; } +