2 changed files with 204 additions and 81 deletions
			
			
		@ -0,0 +1,123 @@ | 
				
			|||
<template> | 
				
			|||
    <div v-if="showMarkdown"> | 
				
			|||
        <div  v-html="markdownContent"></div> | 
				
			|||
    </div> | 
				
			|||
</template> | 
				
			|||
 | 
				
			|||
<script> | 
				
			|||
import { marked } from "marked"; | 
				
			|||
export default { | 
				
			|||
    data() { | 
				
			|||
        return { | 
				
			|||
            text: '', | 
				
			|||
            displayedText: '', | 
				
			|||
            showMarkdown: false, | 
				
			|||
            typingQueue: [],  //队列存储 | 
				
			|||
            isTyping: false, | 
				
			|||
            markdownContent: '', | 
				
			|||
            typingSpeed: 50, //每个字出现的间隔时间(毫秒) | 
				
			|||
 | 
				
			|||
        }; | 
				
			|||
    }, | 
				
			|||
    created() { }, | 
				
			|||
    methods: { | 
				
			|||
        getLastWeekDateRange() { | 
				
			|||
            const today = new Date(); | 
				
			|||
            const dayOfWeek = today.getDay(); | 
				
			|||
            const startOfLastWeek = new Date(today); | 
				
			|||
            const endOfLastWeek = new Date(today); | 
				
			|||
            startOfLastWeek.setDate(today.getDate() - dayOfWeek - 6); | 
				
			|||
            endOfLastWeek.setDate(today.getDate() - dayOfWeek); | 
				
			|||
            const formatDate = (date) => { | 
				
			|||
                const year = date.getFullYear(); | 
				
			|||
                const month = String(date.getMonth() + 1).padStart(2, '0'); | 
				
			|||
                const day = String(date.getDate()).padStart(2, '0'); | 
				
			|||
                return `${year}-${month}-${day}`; | 
				
			|||
            }; | 
				
			|||
            return { | 
				
			|||
                queryDateStart: formatDate(startOfLastWeek), | 
				
			|||
                queryDateEnd: formatDate(endOfLastWeek), | 
				
			|||
            }; | 
				
			|||
        }, | 
				
			|||
        regexChat(str) { | 
				
			|||
            const regex = /"content":"(.*?)"/g; | 
				
			|||
            const matches = []; | 
				
			|||
            let match; | 
				
			|||
            while ((match = regex.exec(str)) !== null) { | 
				
			|||
            // let formattedContent = match[1].replace(/\\n/g, '\\\\n'); | 
				
			|||
            matches.push(match[1]); | 
				
			|||
            } | 
				
			|||
            const mergedContent = matches.join(''); | 
				
			|||
            console.log(mergedContent,'mergedContent'); | 
				
			|||
            return mergedContent; | 
				
			|||
        }, | 
				
			|||
        startNextTypingEffect() { | 
				
			|||
            // 如果正在打字或队列为空,则直接返回 | 
				
			|||
            if (this.isTyping || this.typingQueue.length === 0) { | 
				
			|||
                return | 
				
			|||
            }; | 
				
			|||
            const nextText = this.typingQueue.shift(); | 
				
			|||
            console.log(nextText,typeof(nextText),'seeeee1'); | 
				
			|||
             | 
				
			|||
            this.displayedText += nextText | 
				
			|||
        }, | 
				
			|||
        async loadMarkdownTohtml() { | 
				
			|||
            const { queryDateStart, queryDateEnd } = this.getLastWeekDateRange(); | 
				
			|||
            const that = this; | 
				
			|||
            try { | 
				
			|||
                const res = await fetch(`${process.env.VUE_APP_API_SERVER}/governance/event/assistant/report?queryDateStart=${queryDateStart}&queryDateEnd=${queryDateEnd}`, { | 
				
			|||
                    method: "GET", | 
				
			|||
                    headers: { | 
				
			|||
                        "Authorization": localStorage.getItem('token'), | 
				
			|||
                        "Content-Type": "application/json" | 
				
			|||
                    } | 
				
			|||
                }) | 
				
			|||
                const reader = res.body.getReader(); | 
				
			|||
                const decoder = new TextDecoder("utf-8"); | 
				
			|||
 | 
				
			|||
                reader.read().then(function process({ done, value }) { | 
				
			|||
                    if (done) { | 
				
			|||
                        console.log('加载完了', that.displayedText); | 
				
			|||
                        that.showMarkdown = true; | 
				
			|||
                        that.markdownContent = marked(that.displayedText); // 将markdown内容解析 | 
				
			|||
                        console.log(that.markdownContent); | 
				
			|||
                        console.log(that.displayedText === | 
				
			|||
                        '\n\n**市北区2025-03-03至2025-03-09事件分析报告**\n\n---\n\n### 一、主要事件类型分析\n1. **事件类别统计**  \n   - 基础设施类:1起(电表异常问题)  \n   - 其他类别(如治安、环保等):0起  \n2. **突出类别说明**  \n   本月所有上报事件均集中于**基础设施类**(电表问题),占比100%。该问题直接涉及居民日常生活与公共资源管理,需重点关注。\n\n---\n\n### 二、重点集中区域分析\n1. **高频事件区域**  \n   - **华山镇花园小区54号楼**:发生1起电表问题投诉。  \n2. **潜在原因推测**  \n   - **设备老化可能性**:电表更换后出现异常,可能与新设备调试不当或旧电路系统适配性有关。  \n   - **居民需求敏感度**:电力供应直接影响生活成本,居民对电表准确性关注度高,易引发投诉。  \n   - **区域特殊性**:该小区为较老社区,基础设施维护需求可能长期存在。\n\n---\n\n### 三、事件趋势分析\n1. **数量对比**  \n   - 本月事件总量:1起(仅基础设施类)  \n   - 上月事件总量(假设数据):无提供历史数据,需补充信息以分析趋势。  \n2. **初步推断**  \n   - 若上月无同类问题,本次电表投诉可能为偶发个案;若持续出现类似事件,则需排查系统性风险(如批量设备故障)。\n\n---\n\n### 四、工作改进建议\n1. **基础设施优化**  \n   - 联合电力部门对华山镇花园小区开展电表专项检查,排查设备异常原因,公开检测结果以消除居民疑虑。  \n   - 对老旧社区实施电路系统升级计划,减少因设备老化引发的后续问题。  \n2. **居民沟通与宣传**  \n   - 通过社区公告、线上通知等形式,普及电表使用常识及问题反馈渠道,降低信息不对称。  \n3. **服务流程完善**  \n   - 建立公共设施报修快速响应机制,确保问题在24小时内初步响应并反馈处理进度。  \n4. **数据监测扩展**  \n   - 补充完善环保、治安等事件的数据采集,以支持更全面的社区管理分析。\n\n---\n\n**结论**:本月社区管理需重点关注基础设施维护与居民沟通效率,建议通过专项排查和透明化服务提升居民满意度,同时加强多维度数据收集以支持长期决策。'); | 
				
			|||
                        return; | 
				
			|||
                        '\n\n**市北区2025-03-03至2025-03-09事件分析报告**\n\n---\n\n### 一、主要事件类型分析\n1. **事件类别统计**  \n   - 基础设施类:1起(电表异常问题)  \n   - 其他类别(如治安、环保等):0起  \n2. **突出类别说明**  \n   本月所有上报事件均集中于**基础设施类**(电表问题),占比100%。该问题直接涉及居民日常生活与公共资源管理,需重点关注。\n\n---\n\n### 二、重点集中区域分析\n1. **高频事件区域**  \n   - **华山镇花园小区54号楼**:发生1起电表问题投诉。  \n2. **潜在原因推测**  \n   - **设备老化可能性**:电表更换后出现异常,可能与新设备调试不当或旧电路系统适配性有关。  \n   - **居民需求敏感度**:电力供应直接影响生活成本,居民对电表准确性关注度高,易引发投诉。  \n   - **区域特殊性**:该小区为较老社区,基础设施维护需求可能长期存在。\n\n---\n\n### 三、事件趋势分析\n1. **数量对比**  \n   - 本月事件总量:1起(类)  \n   - 上月事件总量(假设数据):无提供历史数据,需补充信息以分析趋势。  \n2. **初步推断**  \n   - 若上月无同类问题,本次电表投诉可能为偶发个案;若持续出现类似事件,则需排查系统性风险(如批量设备故障)。\n\n---\n\n### 四、工作改进建议\n1. **基础设施优化**  \n   - 联合电力部门对华山镇花园小区开展电表专项检查,排查设备异常原因,公开检测结果以消除居民疑虑。  \n   - 对老旧社区实施电路系统升级计划,减少因设备老化引发的后续问题。  \n2. **居民沟通与宣传**  \n   - 通过社区公告、线上通知等形式,普及电表使用常识及问题反馈渠道,降低信息不对称。  \n3. **服务流程完善**  \n   - 建立公共设施报修快速响应机制,确保问题在24小时内初步响应并反馈处理进度。  \n4. **数据监测扩展**  \n   - 补充完善环保、治安等事件的数据采集,以支持更全面的社区管理分析。\n\n---\n\n**结论**:本月社区管理需重点关注基础设施维护与居民沟通效率,建议通过专项排查和透明化服务提升居民满意度,同时加强多维度数据收集以支持长期决策。' | 
				
			|||
                    } | 
				
			|||
 | 
				
			|||
                    const chunk = decoder.decode(value, { stream: true }); | 
				
			|||
                    console.log("流数据块:", chunk, typeof (chunk)); | 
				
			|||
                    // console.log(JSON.parse(`"${chunk}"`),'json'); | 
				
			|||
                    const text = that.regexChat(chunk); | 
				
			|||
                    console.log("转换后:", text, typeof (text)); | 
				
			|||
 | 
				
			|||
                    // 将数据推入队列 | 
				
			|||
                    that.typingQueue.push(text); | 
				
			|||
                    that.startNextTypingEffect();  // 尝试开始下一个 | 
				
			|||
 | 
				
			|||
                    // 继续读取 | 
				
			|||
                    return reader.read().then(process); | 
				
			|||
                }); | 
				
			|||
 | 
				
			|||
            } catch { | 
				
			|||
 | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
    }, | 
				
			|||
    components: {}, | 
				
			|||
    computed: { | 
				
			|||
    }, | 
				
			|||
    watch: {}, | 
				
			|||
    props: { | 
				
			|||
        html: { | 
				
			|||
            type: String, | 
				
			|||
            default: '' | 
				
			|||
        } | 
				
			|||
    }, | 
				
			|||
    mounted() { | 
				
			|||
        this.loadMarkdownTohtml() | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
</script> | 
				
			|||
					Loading…
					
					
				
		Reference in new issue