Browse Source

12345助手弹框封装组件

luckysheet_xiaowang
mk 8 months ago
parent
commit
d5506eaa53
  1. 160
      src/views/modules/shequzhili/analysis/index.vue
  2. 123
      src/views/modules/shequzhili/analysis/markDown.vue

160
src/views/modules/shequzhili/analysis/index.vue

@ -461,10 +461,7 @@
<el-dialog :title="`${$store.state.user.agencyName}12345政务热线诉求总结`" :visible.sync="summarizeDialog" width="50%"
v-if="summarizeDialog" @close="handleCloseSummarizeDialog" center>
<div class="chatContent">
<span v-if="!displayedText">
<i class="el-icon-loading"></i>思考中...
</span>
<div v-html="displayedText"></div>
<mark-down></mark-down>
</div>
</el-dialog>
</div>
@ -476,7 +473,6 @@ import eventInfo from "../../shequzhili/event/cpts/event-info.vue";
import { requestPost, requestGet } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import axios from "axios";
import * as echarts from "echarts";
import util from "@js/util.js";
import TableRow from './TableRow.vue';
@ -484,9 +480,9 @@ import mobileList from "./mobileList";
import areaNoSameList from "./areaNoSameList";
import addComplainList from "./addComplainList";
import echartsAffairs from "./cpts/echarts-affairs.vue";
import { marked } from "marked";
import markDown from "./markDown.vue";
export default {
components: { TableRow, formList, eventInfo, areaSameList, mobileList, areaNoSameList, addComplainList, echartsAffairs },
components: { TableRow, formList, eventInfo, areaSameList, mobileList, areaNoSameList, addComplainList, echartsAffairs ,markDown},
data() {
return {
selectedIndex: 0,
@ -809,8 +805,11 @@ export default {
]
},
summarizeDialog: false,
displayedText: null,
typingSpeed: 100, //
displayedText: '',
typingSpeed: 50, //
typingQueue: [], //
isTyping: false,
showMarkdown:false,
};
},
@ -821,16 +820,9 @@ export default {
return this.$store.state.inIframe ? h : _h;
},
...mapGetters(["clientHeight", "iframeHeight"]),
renderedMarkdown() {
return marked(this.displayedText); // Markdown HTML
},
},
watch: {
renderedMarkdown(newText) {
this.displayedText = null; //
this.startTypingEffect(newVal);
}
},
watch: {},
mounted() {
this.user = this.$store.state.user;
this.agencyId = this.user.agencyId;
@ -845,6 +837,75 @@ export default {
this.initChart("/actual/base/residentIntegrity/resiCategoryStats/byOrg/query4Org");
},
methods: {
regexChat(str) {
const regex = /"content":"(.*?)"/g;
const matches = [];
let match;
while ((match = regex.exec(str)) !== null) {
const formattedContent = match[1].replace(/\\n/g, '\\\\n');
console.log(formattedContent,'formattedContent');
matches.push(formattedContent);
}
const mergedContent = matches.join('');
return mergedContent;
},
handelClickShowSummarize() {
this.summarizeDialog = true;
// const that = this;
// const { queryDateStart, queryDateEnd } = this.getLastWeekDateRange();
// 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"
// }
// })
// .then(response => {
// const reader = response.body.getReader();
// const decoder = new TextDecoder("utf-8");
// reader.read().then(function process({ done, value }) {
// if (done) {
// console.log("");
// that.showMarkdown = true;
// return;
// }
// const chunk = decoder.decode(value, { stream: true });
// console.log("", chunk,typeof (chunk));
// const text = that.regexChat(chunk);
// console.log("", text,typeof (text));
// //
// that.typingQueue.push(text);
// that.startNextTypingEffect(); //
// //
// return reader.read().then(process);
// });
// })
// .catch(err => console.error("", err));
},
startNextTypingEffect() {
//
if (this.isTyping || this.typingQueue.length === 0){
};
console.log(this.typingQueue,'typingQueue');
const nextText = this.typingQueue.shift();
console.log(typeof(nextText));
this.displayedText += nextText.toString()
},
handleCloseSummarizeDialog(){
this.displayedText = '';
this.showMarkdown = false;
},
initChart(url) {
this.$http.get(url).then(({ data: { data } }) => {
const chartDom = this.$refs.chart;
@ -873,7 +934,6 @@ export default {
];
let xData = departmentNames.map(item => item.name)
let xiangying = departmentNames.map(item => item.xiangying)
console.log(xiangying, "dsfll;dsfj");
let banjie = departmentNames.map(item => item.banjie)
let zuizhong = departmentNames.map(item => item.zuizhong)
let manyi = departmentNames.map(item => item.manyi)
@ -1142,8 +1202,6 @@ export default {
if (code === 0) {
this.tableList = data
// this.tableList=this.flattenTree(data);
console.log(this.tableList);
console.log(this.tableList, "lksdjfklj s");
} else {
this.$message.error(msg);
}
@ -1542,45 +1600,7 @@ export default {
queryDateEnd: formatDate(endOfLastWeek),
};
},
regexChat(str) {
console.log(str,'jieshou');
const regex = /"content":"([^\\\n]*?)"(?:}}])?/g;
const matches = [];
let match;
while ((match = regex.exec(str)) !== null) {
matches.push(match[1]);
}
const mergedContent = matches.join('');
return mergedContent;
},
handelClickShowSummarize() {
this.summarizeDialog = true;
const { queryDateStart, queryDateEnd } = this.getLastWeekDateRange()
this.$http.get(`/governance/event/assistant/report?queryDateStart=${queryDateStart}&queryDateEnd=${queryDateEnd}`).then((res) => {
const text = this.regexChat(res.data);
//
if (text) {
this.startTypingEffect(text);
}
});
},
startTypingEffect(text) {
this.displayedText = ""; //
let index = 0;
const interval = setInterval(() => {
if (index < text.length) {
this.displayedText += text[index]; //
index++;
} else {
clearInterval(interval); //
}
}, this.typingSpeed);
},
handleCloseSummarizeDialog(){
this.displayedText = null;
}
},
@ -1705,7 +1725,7 @@ thead {
width: 100%;
/* 限制最大宽度,确保换行 */
word-wrap: break-word;
/* 确保长文本换行 */
// /* */
overflow-wrap: break-word;
white-space: pre-wrap;
/* 保持空格和换行 */
@ -1713,26 +1733,6 @@ thead {
overflow-y: scroll;
}
.typing-animation {
display: inline-block;
overflow: hidden;
/* 隐藏未显示的部分 */
white-space: nowrap;
/* 避免提前换行 */
animation: typing 2s steps(20, end) forwards;
}
/* 动画:逐字显示 */
@keyframes typing {
from {
width: 0;
}
to {
width: 100%;
}
}
.flex {
display: flex;
justify-content: center;

123
src/views/modules/shequzhili/analysis/markDown.vue

@ -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…
Cancel
Save