This commit is contained in:
lcw
2026-01-16 12:40:42 +08:00
parent 2ea84f248c
commit 10853312f2
120 changed files with 23881 additions and 617 deletions

View File

@ -25,7 +25,8 @@
<div style="border-bottom: 1px #ccc solid;padding-bottom: 30px;">
<h1 style="text-align: center;color: red;">{{ nd }}年度林芝市公安战术研判报告</h1>
<div
style="display: flex;align-items: center;justify-content: space-between; color: red;margin-top: 30px;padding: 0 30px;font-size: 18px;font-weight: 700;" class="center-subtitle">
style="display: flex;align-items: center;justify-content: space-between; color: red;margin-top: 30px;padding: 0 30px;font-size: 18px;font-weight: 700;"
class="center-subtitle">
<div>{{ deptId.name }}</div>
<div>{{ deptId?.ord }}</div>
<div>{{ deptId?.time }}</div>
@ -133,6 +134,8 @@ import { reactive, ref, onMounted, getCurrentInstance, nextTick, computed, watch
// import { downloadDocWithStyle } from '@/utils/export.js';
import { downloadDocWithStyle, downloadPDF } from "@/utils/export.js"
import { ElMessage } from "element-plus";
import { qcckPost } from '@/api/qcckApi'
import { connectSSEWithPost, closeSSEConnection } from '@/utils/sse.js'
const props = defineProps({
// 数据
@ -168,7 +171,7 @@ const tabHeight = ref(0)
// 表格高度计算
const tabHeightFn = () => {
tabHeight.value = window.innerHeight - 300
window.onresize = function() {
window.onresize = function () {
tabHeightFn();
};
};
@ -495,48 +498,58 @@ getDictItemList()
const tableBox = ref(null);
const textContent = ref('');
const chartRefs = ref([]); // 存储所有图表组件的引用
// 获取p标签的所有文字内容去除所有<>包裹的内容
const extractTextContent = () => {
loading.value = true
// 获取当前组件的HTML内容
const componentHtml = tableBox.value ? tableBox.value.innerHTML : '';
// 存储提取的文本内容
const extractedTexts = [];
const extractTextContent = async () => {
if (!tableBox.value) return;
// 获取当前组件的HTML内容
const htmlContent = tableBox.value.innerHTML;
// 提取p标签的文本内容
const pRegex = /<p[^>]*>(.*?)<\/p>/gs;
let pMatch;
while ((pMatch = pRegex.exec(componentHtml)) !== null) {
let pContent = pMatch[1];
const pRegex = /<p[^>]*>([\s\S]*?)<\/p>/g;
let pMatch = pRegex.exec(htmlContent);
let extractedText = '';
while (pMatch !== null) {
// 去除所有<>包裹的内容
pContent = pContent.replace(/<[^>]*>/g, '');
let cleanText = pMatch[1].replace(/<[^>]*>/g, '');
// 去除HTML注释
pContent = pContent.replace(/<!--[\s\S]*?-->/g, '');
// 清理文本,去除多余空白字符
const cleanText = pContent.replace(/\s+/g, ' ').trim();
if (cleanText) {
extractedTexts.push(cleanText);
}
cleanText = cleanText.replace(/<!--[\s\S]*?-->/g, '');
extractedText += cleanText + '\n';
pMatch = pRegex.exec(htmlContent);
}
// 清理文本,去除多余空白字符
extractedText = extractedText.replace(/\s+/g, ' ').trim();
// 调用AI分析接口
// loading.value = true;
textContent.value = '';
const prompt = `你是一名资深警务人员,尤其擅长对警情、案件、线索等非结构化文本数据进行阅读理解,并总结各种对象之间的关联关系,对下面数据进行一个分析总结给出一个总结报告。${extractedText}`;
try {
await connectSSEWithPost(prompt, {
onChunk: (content) => {
textContent.value += content;
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
});
} catch (err) {
console.error('分析失败:', err);
textContent.value = '分析失败,请稍后重试';
} finally {
// loading.value = false;
}
}
// 合并为一个字符串
const result = extractedTexts.join(' ');
console.log('提取的文本内容:', result);
completions({
model: "deepseek-32b",
prompt: `# 角色定位\n你是一名资深警务人员尤其擅长对警情、案件、线索等非结构化文本数据进行阅读理解并总结各种对象之间的关联关系,对下面数据进行一个分析总结给出一个总结报告。\n${result}`,
max_tokens: 1000,
}).then(res => {
textContent.value = res?.choices?.[0]?.text
}).finally(() => {
loading.value = false
})
// return result;
};
</script>
@ -547,32 +560,19 @@ const extractTextContent = () => {
color: red;
}
.analysis-report-box {
position: relative;
}
p {
text-indent: 2em;
/* 首行缩进2个汉字 */
margin: 1em 0;
/* 段落间距 */
line-height: 1.6;
/* 行高 */
font-size: 16px;
/* 字体大小 */
text-align: justify;
/* 两端对齐 */
}
/* 特殊情况处理 */
p.no-indent {
text-indent: 0;
/* 不需要缩进的段落 */
}
p.first-no-indent:first-of-type {
text-indent: 0;
/* 第一个段落不缩进 */
}
</style>

View File

@ -0,0 +1,134 @@
<template>
<div>
<el-dialog :model-value="modelValue" :destroy-on-close="true" :title="title" @close="close" :close-on-click-modal="true">
<div style="height: 50vh;overflow: auto;">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="150px" ref="elform">
</FormMessage>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, getCurrentInstance, watch } from 'vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { asjxsajid, asjxzajid } from '@/api/yj'
const { proxy } = getCurrentInstance();
const { GA_D_ASJLYFLDM, GA_D_XSAJLBDM, BD_D_BJFSDM, GA_D_SACSFLDM, GA_D_DYLBDM } = proxy.$fzdict('GA_D_ASJLYFLDM', 'GA_D_XSAJLBDM', 'BD_D_BJFSDM', 'GA_D_SACSFLDM', 'GA_D_DYLBDM')
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '网上会商'
},
dataList: {
type: Object,
default: () => { }
}, lx: {
type: String,
default: '1'
}
})
const emits = defineEmits(['update:modelValue'])
const listQuery = ref({})
const xsaj = [
{ label: "案件名称", prop: "ajmc", type: "input" },
{ label: "案件编号", prop: "asjbh", type: "input" },
{ label: "案件来源", prop: "asjlydm", type: "select", options: GA_D_ASJLYFLDM },
{ label: "主要类别", prop: "ajzlbdm", type: "select", options: GA_D_XSAJLBDM },
{ label: "副类别类别", prop: "ajlbdm", type: "select", options: GA_D_XSAJLBDM },
{ label: "接警编号", prop: "jjbh", type: "input" },
{ label: "接警方式", prop: "jjfs", type: "select", options: BD_D_BJFSDM },
{ label: "接警时间", prop: "bjsj", type: "datetime" },
{ label: "发现事件时间", prop: "fxasjsj", type: "datetime" },
{ label: "开始时间", prop: "asjfssjAsjfskssj", type: "datetime" },
{ label: "结束时间", prop: "asjfssjAsjfsjssj", type: "datetime" },
{ label: "案发地点", prop: "asjfsddDzmc", type: "input", width: '90%' },
{ label: "涉案场所类别", prop: "asjfsddSacsSacslbdm", type: "select", options: GA_D_SACSFLDM },
{ label: "经度", prop: "asjfsddDqjd", type: "input" },
{ label: "纬度", prop: "asjfsddDqwd", type: "input" },
{ label: "地域类别", prop: "asjfsddDylbdm", type: "select", options: GA_D_DYLBDM },
{ label: "简要案情", prop: "jyaq", type: "textarea", width: "90%" },
{ label: "受理时间", prop: "slsj", type: "datetime" },
{ label: "受理单位", prop: "sldwGajgmc", type: "input" },
{ label: "是否涉枪", prop: "sfsqPdbz", type: "input" },
{ label: "是否涉爆", prop: "sfsbPdbz", type: "input" },
{ label: "涉外情况", prop: "swasjswqk", type: "textarea", width: "90%" },
{ label: "受伤人数", prop: "asjssryRs", type: "input" },
{ label: "损失价值(元)", prop: "ssjzrmby", type: "input" },
{ label: "作案特征情况", prop: "zatzJyqk", type: "textarea", width: "90%" },
{ label: "损失财物情况", prop: "asjsscwJyqk", type: "textarea", width: "90%" },
// { label: "管制物品情况", prop: "asjsscwJyqk", type: "textarea", width: "90%" },
]
const xzaj = [
{ label: "案件名称", prop: "ajmc", type: "input" },
{ label: "案件编号", prop: "asjbh", type: "input" },
{ label: "案件来源", prop: "asjlydm", type: "select", options: GA_D_ASJLYFLDM },
{ label: "主要类别", prop: "ajzlbdm", type: "select", options: GA_D_XSAJLBDM },
{ label: "副类别类别", prop: "ajlbdm", type: "select", options: GA_D_XSAJLBDM },
{ label: "接警编号", prop: "jjbh", type: "input" },
{ label: "接警方式", prop: "jjfs", type: "select", options: BD_D_BJFSDM },
{ label: "接警时间", prop: "bjsj", type: "datetime" },
{ label: "发现事件时间", prop: "fxasjsj", type: "datetime" },
{ label: "开始时间", prop: "asjfssjAsjfskssj", type: "datetime" },
{ label: "结束时间", prop: "asjfssjAsjfsjssj", type: "datetime" },
{ label: "案发地点", prop: "asjfsddDzmc", type: "input", width: '90%' },
{ label: "涉案场所类别", prop: "asjfsddSacsSacslbdm", type: "select", options: GA_D_SACSFLDM },
{ label: "经度", prop: "asjfsddDqjd", type: "input" },
{ label: "纬度", prop: "asjfsddDqwd", type: "input" },
{ label: "地域类别", prop: "asjfsddDylbdm", type: "select", options: GA_D_DYLBDM },
{ label: "简要案情", prop: "jyaq", type: "textarea", width: "90%" },
{ label: "受理时间", prop: "slsj", type: "datetime" },
{ label: "受理单位", prop: "sldwGajgmc", type: "input" },
{ label: "是否涉枪", prop: "sfsqPdbz", type: "input" },
{ label: "是否涉外", prop: "sfswPdbz", type: "input" },
{ label: "是否涉爆", prop: "sfsbPdbz", type: "input" },
{ label: "涉枪情况", prop: "sqqk", type: "textarea", width: "90%" },
{ label: "涉爆情况", prop: "sbqk", type: "textarea", width: "90%" },
{ label: "涉外情况", prop: "swasjswqk", type: "textarea", width: "90%" },
{ label: "受伤人数", prop: "asjssryRs", type: "input" },
{ label: "损失价值(元)", prop: "ssjzrmby", type: "input" },
{ label: "作案特征情况", prop: "zatzJyqk", type: "textarea", width: "90%" },
{ label: "损失财物情况", prop: "asjsscwJyqk", type: "textarea", width: "90%" },
{ label: "管制物品情况", prop: "asjgzwpJyqk", type: "textarea", width: "90%" },
]
const formData = ref()
const elform = ref()
watch(() => props.modelValue, (val) => {
if (val) {
if (props.lx == '1') {
tbJqIdFunc()
formData.value = xsaj
} else {
asjxzajidFunc()
formData.value = xzaj
}
}
})
const tbJqIdFunc = () => {
asjxsajid(props.dataList.id).then((res) => {
listQuery.value = res
})
}
const asjxzajidFunc = () => {
asjxzajid(props.dataList.id).then((res) => {
listQuery.value = res
})
}
const close = () => {
elform.value.reset()
emits('update:modelValue', false)
}
</script>

View File

@ -0,0 +1,456 @@
<template>
<div class="report-container" ref="tableBox">
<div ref="ajReport">
<div class="main-title">林芝市{{ wdValue.date }}刑事犯罪</div>
<div class="main-title">情况分析</div>
<div class="body-text">
{{ wdValue.date }}全市共立各类刑事案件{{ wdValue.ypbgZttj.ztsl }}{{ wdValue.ypbgZttj.zpsl }}总破案率{{
wdValue.ypbgZttj.zzpl }}%抓获犯罪嫌疑人{{ wdValue.ypbgZttj.fzxyr }}涉案财物损失约{{ wdValue.ypbgZttj.cwss ?
wdValue.ypbgZttj.cwss : 0 }}万余元挽回经济损失为{{ wdValue.ypbgZttj.whss ? wdValue.ypbgZttj.whss : 0
}}万余元与上年同期相比各类刑事案件{{ wdValue.ypbgZttj.snztsl }}{{ wdValue.ypbgZttj.snzpsl }}总破案率{{ wdValue.ypbgZttj.snzzpl
}}%发案绝对数{{ wdValue.ypbgZttj.fajds }}
</div>
<div class="body-text">{{ wdValue.ym }}月份所立的{{ wdValue.ypbgZttj.ztsl }}起刑事案件进行分析有以下特点</div>
<div class="section-title">案类特点</div>
<div class="body-text" v-if="wdValue.aftdlxList.length > 0">
<!-- 本月立盗窃案5起破4起破案率为80%立电信网络诈骗案13起破3起月前积案2起破案率为23%立普通诈骗案5起破7起月前积案5起破案率为140%立故意伤害案3起破4起月前积案1起破案率为133%立强奸案2起破2起破案率为100%立强制猥亵案1起破1起破案率为100%立故意毁坏财物案1起破1起破案率为100%破拒不执行判决裁定罪1起月前积案 -->
<span>本月</span><span v-for="(item, index) in wdValue.aftdlxList" :key="item.value">{{ item.label }}{{
item.obj.las }}{{ item.obj.pas }}破案率为{{ item.obj.pal }}%</span>
</div>
<div class="section-title">刑事案件分布情况</div>
<div class="body-text" v-if="wdValue.xsajfbqkList.length > 0">
<div v-for="item in wdValue.xsajfbqkList" :key="item.value">
{{ item.label }}{{ item.obj.qxztsl }}{{ item.obj.zpsl }}破案率为{{ item.obj.pal }}%占全市刑事案件总数{{
item.obj.qsbl }}%
</div>
</div>
<div class="section-title">刑事案件发案特点</div>
<div class="body-text">
<!-- 盗窃案与上年同期相比发案有所下降 -->
<div v-for="item in wdValue.aftdList" :key="item.value"><span class="font-bold">{{ item.xb }}{{ item.label
}}与上年同期相比发案{{ item.obj.tqxb }}</span>本月{{ item.label }}{{ item.obj.snzsl }}{{ item.obj.snpa }}破案率为{{
item.obj.snpal }}%与上年同期立{{ item.label }}{{ item.obj.bnzsl }}{{ item.obj.bnpa }}破案率为{{ item.obj.bnpal
}}%相比发案绝对数{{ item.obj.fajds }}
</div>
</div>
<div class="section-title">抓获犯罪嫌疑人情况分析</div>
<div class="body-text">
本月{{ wdValue.xyrQkfx }}
</div>
</div>
<div class="section-title">侦防建议</div>
<div class="body-text">
{{ wdValue.xzjyL }}
</div>
<div class="body-text">
<div class="body-text right-align">
<div>林芝市公安局情报指挥中心</div>
<div>{{ wdValue.td }}</div>
</div>
<div class="body-text" v-for="item in wdValue.xsajqxajqkList" :key="item.value">
<span class="font-bold">{{ item.label }} &nbsp;</span>
<span v-for="items in item.obj.ajqk" :key="items">{{ items.zjlbmc }}{{items.lasl}}{{items.pasl}} </span>
<!-- 立盗窃案{{item.obj.las}}破4起立电诈案8起破2起立普通诈骗案1起破1起立招摇撞骗案1起破1起立敲诈勒索案1起破1起破拒不支付劳动报酬案1起月前积案破伪造公司印章案1起月前积案 -->
<div>{{ item.obj.lasl }}{{ item.obj.pasl }}</div>
</div>
</div>
</div>
<div style="display: flex;justify-content: center;align-items: center;">
<el-button type="primary" @click="downloadWithStyles">导出WORD</el-button>
</div>
</template>
<script setup>
import { xsasjxsajaltdtj, xsasjxsajfbqktj, xsasjxsajFatdtj, xsasjxsajxyrQkfx, xsasjxsajypbgZttj, xsasjxsajqxajqk } from '@/api/fileapi'
import { ref, onMounted ,watch } from 'vue'
import { connectSSEWithPost } from '@/utils/sse'
import { timeValidate } from '@/utils/tools'
import { downloadDocWithStyle, downloadPDF } from "@/utils/export.js"
import Docxtemplater from 'docxtemplater';
import PizZip from 'pizzip';
import { saveAs } from 'file-saver';
const props = defineProps({
search: {
type: Object,
default: ()=>{}
},
xzlx: {
type: String,
default: ''
}
})
const params =ref({...props.search})
onMounted(async () => {
await Promise.all([
getxsasjxsajypbgZttj(),
getxsasjxsajaltdtj(),
getxsasjxsajfbqktj(),
getxsasjxsajFatdtj(),
getxsasjxsajxyrQkfx(),
])
getconnectSSEWithPost()
getxsasjxsajqxajqk()
})
// 案类特点类型:
// 01 盗窃案 02 电信诈骗案 03 普通诈骗案 04 故意伤害案 05 强奸案 06 强制猥亵 07 毁坏财物 08 拒不执行
const aftdlx = [
{
label: '盗窃案', value: '01'
},
{
label: '电信诈骗案', value: '02'
},
{
label: '普通诈骗案', value: '03'
},
{
label: '故意伤害案', value: '04'
},
{
label: '强奸案', value: '05'
},
{
label: '强制猥亵', value: '06'
},
{
label: '毁坏财物', value: '07'
},
{
label: '拒不执行', value: '08'
}
]
// 分布情况
// 所属部门代码540402000000 巴宜区、540421000000 工布江达、540422000000 米林、540423000000 墨脱、540424000000 波密、540425000000 察隅、540426000000 朗县)
const ajfbqk = [
{
label: '巴宜区',
value: '540402000000'
},
{
label: '工布江达县',
value: '540421000000'
},
{
label: '米林市',
value: '540422000000'
},
{
label: '墨脱县',
value: '540423000000'
}, {
label: '波密县',
value: '540424000000'
}, {
label: '察隅县',
value: '540425000000'
}, {
label: '朗县',
value: '540426000000'
}
]
// 案件类型:
// 01 刑事案件 02 民事案件 03 其他案件
// 发案特点类型01 盗窃案 02 电信诈骗案 03 普通诈骗案 04 故意伤害案 05 强奸案 06 敲诈勒索案 07 招摇撞骗案
const fatdlx = [{
label: '盗窃案', value: '01', xb: '(一)'
},
{
label: '电信诈骗案', value: '02', xb: '(二)'
},
{
label: '普通诈骗案', value: '03', xb: '(三)'
},
{
label: '故意伤害案', value: '04', xb: '(四)'
},
{
label: '强奸案', value: '05', xb: '(五)'
},
{
label: '敲诈勒索案', value: '06', xb: '(六)'
},
{
label: '招摇撞骗案', value: '07', xb: '(七)'
}
]
// 值
const wdValue = ref({
date: timeValidate(new Date(), 'ny'),
ym: timeValidate(new Date(), 'ym'),
td: timeValidate(new Date(), 'td'),
ypbgZttj: {},
aftdlxList: [],
xsajfbqkList: [],
aftdList: [],
xsajqxajqkList:[],
xyrQkfx: '',
xzjyL: ''
})
// 案类特点统计
const getxsasjxsajaltdtj = () => {
const promises = aftdlx.map(item => {
return xsasjxsajaltdtj({
...params.value,
aftdlx: item.value
})
})
return Promise.all(promises).then(results => {
wdValue.value.aftdlxList = aftdlx.map((item, index) => {
return {
...item,
obj: results[index]
}
})
}).catch(error => {
console.error('请求失败:', error)
return []
})
}
// 刑事案件分布情况
const getxsasjxsajfbqktj = () => {
const promises = ajfbqk.map(item => {
return xsasjxsajfbqktj({
...params.value,
ajfbqk: item.value
})
})
return Promise.all(promises).then(results => {
wdValue.value.xsajfbqkList = ajfbqk.map((item, index) => {
return {
...item,
obj: results[index]
}
})
}).catch(error => {
console.error('请求失败:', error)
return []
})
}
//刑事案件发案特点
const getxsasjxsajFatdtj = () => {
const promises = fatdlx.map(item => {
return xsasjxsajFatdtj({
...params.value,
ajfalx: item.value
})
})
return Promise.all(promises).then(results => {
wdValue.value.aftdList = fatdlx.map((item, index) => {
return {
...item,
obj: results[index]
}
})
}).catch(error => {
console.error('请求失败:', error)
return []
})
}
// 抓获犯罪嫌疑人情况分析
const getxsasjxsajxyrQkfx = () => {
return xsasjxsajxyrQkfx({...params.value}).then(res => {
wdValue.value.xyrQkfx = res
}).catch(error => {
console.error('请求失败:', error)
return ''
})
}
const ajReport = ref(null)
// 获取报告所有文字内容
const getReportTextContent = () => {
if (!ajReport.value) {
return ''
}
// 提取元素内的所有文本内容
const textContent = ajReport.value.textContent || ''
// 处理空白字符,去除多余的换行和空格
return textContent
.replace(/\s+/g, ' ') // 将多个空白字符替换为单个空格
.trim() // 去除首尾空白
}
// 侦防建议
const getconnectSSEWithPost = () => {
const params = getReportTextContent()
connectSSEWithPost({ prompt: params }, {
onChunk: (content) => {
wdValue.value.xzjyL += content;
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
})
}
// 总体分析
const getxsasjxsajypbgZttj = () => {
return xsasjxsajypbgZttj({...params.value}).then(res => {
wdValue.value.ypbgZttj = { ...res, cwss: res.cwss ? res.cwss : 0, whss: res.whss ? res.whss : 0 }
}).catch(error => {
console.error('请求失败:', error)
return {}
})
}
// 区情分析
const getxsasjxsajqxajqk = () => {
const promises = ajfbqk.map(item => {
return xsasjxsajqxajqk({
...params.value,
ajfbqk: item.value
})
})
return Promise.all(promises).then(results => {
wdValue.value.xsajqxajqkList = ajfbqk.map((item, index) => {
return {
...item,
obj: results[index]
}
})
}).catch(error => {
console.error('请求失败:', error)
return []
})
}
// 导出word
const tableBox = ref(null);
const downloadWithStyles = async () => {
if (!tableBox.value?.innerHTML) return;
try {
// 将类样式转换为行内样式的函数
const convertClassesToInlineStyles = (html) => {
// 创建临时DOM元素
const tempDiv = document.createElement('div');
tempDiv.innerHTML = html;
// 定义样式映射
const styleMap = {
'.report-container': {
'padding': '20px',
'color': '#000'
},
'.main-title': {
'font-size': '22pt',
'font-family': '黑体, SimHei, Microsoft YaHei',
'text-align': 'center',
'font-weight': 'bold',
'line-height': '30pt'
},
'.section-title': {
'font-size': '16pt',
'font-family': '黑体, SimHei, Microsoft YaHei',
'line-height': '30pt',
'text-indent': '2em',
'font-weight': 'bold'
},
'.body-text': {
'font-size': '16pt',
'font-family': '仿宋_GB2312',
'line-height': '30pt',
'text-indent': '2em'
},
'.font-bold': {
'font-weight': '600'
},
'.right-align': {
'text-align': 'right',
'margin-left': 'auto',
'width': 'fit-content'
}
};
// 遍历所有元素,应用行内样式
const elements = tempDiv.querySelectorAll('*');
elements.forEach(element => {
// 获取元素的所有类名
const classes = element.className.split(' ').filter(c => c);
// 为每个类名应用对应的样式
classes.forEach(className => {
const styles = styleMap[`.${className}`];
if (styles) {
Object.entries(styles).forEach(([property, value]) => {
element.style[property] = value;
});
}
});
});
// 返回转换后的HTML
return tempDiv.innerHTML;
};
// 转换样式并构建导出内容
const inlineStyledContent = convertClassesToInlineStyles(tableBox.value.innerHTML);
const styledContent = `
<div style="padding: 20px; color: #000;">
${inlineStyledContent}
</div>
`;
downloadDocWithStyle(styledContent, `刑事案件分析报告_${timeValidate(new Date(), 'ny')}`);
} catch (error) {
console.error('导出Word失败:', error);
alert('导出Word失败请检查控制台错误信息');
}
}
</script>
<style lang="scss" scoped>
.report-container {
padding: 20px;
height: 90%;
overflow: auto;
color: #000;
}
.main-title {
font-size: 22pt;
font-family: '黑体, SimHei, Microsoft YaHei';
text-align: center;
font-weight: bold;
line-height: 30pt;
}
.section-title {
font-size: 16pt;
font-family: '黑体, SimHei, Microsoft YaHei';
line-height: 30pt;
text-indent: 2em;
font-weight: bold;
}
.body-text {
font-size: 16pt;
// font-family: ', FangSong, Microsoft YaHei';
font-family: '仿宋_GB2312';
line-height: 30pt;
text-indent: 2em;
}
.font-bold {
font-weight: 600;
}
.right-align {
text-align: right;
margin-left: auto;
width: fit-content;
}
</style>

View File

@ -0,0 +1,107 @@
<template>
<div>
<el-dialog :model-value="modelValue" :destroy-on-close="true" :title="title" @close="close" :close-on-click-modal="true">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
<template #chryList>
<el-input v-model="chryList" clearable placeholder="请选择参会人员" @click="isShowDialog = true"
style="width: 100%;" />
</template>
</FormMessage>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submit">
确认</el-button>
</div>
</template>
</el-dialog>
</div>
<ChooseUser v-model="isShowDialog" @choosedUsers="userChange" :roleIds="roleIds" :Single="false" />
</template>
<script setup>
import { ref, reactive, computed, getCurrentInstance } from 'vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
import { wshsAdd } from "@/api/huiShangyp/tacticalApi"
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '网上会商'
},
dataList: {
type: Object,
default: () => { }
}, lx: {
type: String,
default: '1'
}
})
const emits = defineEmits(['update:modelValue'])
const rules = reactive({
hsbt: [
{ required: true, message: '请输入标题', trigger: 'blur' }
],
hskssj: [
{ required: true, message: '请选择开始时间', trigger: 'blur' }
],
hsjssj: [
{ required: true, message: '请选择结束时间', trigger: 'blur' }
],
hsnr: [
{ required: true, message: '请输入内容', trigger: 'blur' }
]
})
const getData = computed(() => {
return {
glxsid: props.dataList.glzjjdbh || props.dataList.asjbh,
glxsmc: props.dataList.ajmc || props.dataList.bjrmc
}
})
const listQuery = ref({})
const formData = ref([
{ label: '会商标题', prop: 'hsbt', type: 'input', width: '100%' },
{ label: '会商开始时间', prop: 'hskssj', type: 'datetime' },
{ label: '会商结束时间', prop: 'hsjssj', type: 'datetime' },
{ label: '参会人员', prop: 'chryList', type: 'slot', width: '100%' },
{ label: '会商内容', prop: 'hsnr', type: 'textarea', width: '100%' }
])
const elform = ref()
const close = () => {
elform.value.reset()
emits('update:modelValue', false)
}
const submit = () => {
elform.value.submit((val) => {
if (val) {
const promes = {
...listQuery.value,
...getData.value
}
wshsAdd(promes).then(res => {
proxy.$message({
message: '添加成功',
type: 'success'
})
emits('update:modelValue', false)
})
}
})
}
const isShowDialog = ref(false)
const roleIds = ref([])
const chryList = ref([])
const userChange = (val) => {
listQuery.value.chryList = val.map(v => v.id)
chryList.value = val.map(v => v.userName)
roleIds.value = val.map(v => v.id)
}
</script>

View File

@ -1,13 +1,18 @@
<template>
<el-dialog :title="title" v-model="visible" width="80%" destroy-on-close>
<JudgmentReport :search="search"/>
</el-dialog>
<el-dialog :title="title" :model-value="visible" width="80%" destroy-on-close>
<div class="xsaj">
<JudgmentReport :search="search" v-if="xzlx === '02'" />
<Xsaj :search="search" v-if="xzlx === '03'" />
</div>
</el-dialog>
</template>
<script setup>
import { ref, reactive ,watch} from 'vue'
import { ref, reactive, watch } from 'vue'
import JudgmentReport from './AnalysisReport/index.vue'
import Xsaj from './caseFile/xsaj.vue'
const title = ref('详情')
const props = defineProps({
visible: {
@ -17,12 +22,21 @@ const props = defineProps({
search: {
type: Object,
default: null
},
xzlx: {
type: String,
default: ''
}
})
const opebg = ref(false)
watch(() => props.visible, (val) => {
opebg.value = val
},{immediate:true})
const emit=defineEmits(['update:visible'])
}, { immediate: true })
const emit = defineEmits(['update:visible'])
</script>
<style lang="css" scoped>
.xsaj {
height: 70vh;
}
</style>

View File

@ -0,0 +1,87 @@
<template>
<div>
<el-dialog :model-value="modelValue" :destroy-on-close="true" :title="title" @close="close" :close-on-click-modal="true">
<div style="height: 50vh;overflow: auto;">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="150px" ref="elform" >
</FormMessage> </div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, getCurrentInstance, watch } from 'vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import {tbJqId} from '@/api/yj'
const { proxy } = getCurrentInstance();
const {JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQBQ,D_GS_SSYJ}= proxy.$dict('D_GS_BQ_DJ',"JQLB",'JQLX','JQXL','JQZL','D_BZ_JQLY','D_BZ_JQBQ','D_GS_SSYJ')
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '网上会商'
},
dataList: {
type: Object,
default: () => { }
}
})
const emits = defineEmits(['update:modelValue'])
const listQuery = ref({})
const formData = ref([
{ label: "报警电话", prop: "bjdh", type: "input" },
{ label: "报警电话用户地址", prop: "bjdhyhdz", type: "input" },
{ label: "报警电话用户名", prop: "bjdhyhm", type: "input" },
{ label: "报警地址", prop: "bjdz", type: "input" },
{ label: "报警人名称", prop: "bjrmc", type: "input" },
{ label: "报警人证件号码", prop: "bjrzjhm", type: "input" },
{ label: "报警时间", prop: "bjsj", type: "input" },
{ label: "警情颜色", prop: "color", type: "select",options:D_GS_SSYJ },
{ label: "管辖单位名称", prop: "gxdwmc", type: "input" },
{ label: "单位名称", prop: "jcjxtjsdwmc", type: "input" },
{ label: "接警单编号", prop: "jjdbh", type: "input" },
{ label: "接警单位名称", prop: "jjdwmc", type: "input" },
{ label: "接警录音号", prop: "jjlyh", type: "input" },
{ label: "接警时间", prop: "jjsj", type: "input" },
{ label: "接警完成时间", prop: "jjwcsj", type: "input" },
{ label: "接警员编号", prop: "jjybh", type: "input" },
{ label: "接警员姓名", prop: "jjyxm", type: "input" },
{ label: "警情标签", prop: "jqbq", type: "select",options: D_BZ_JQBQ},
{ label: "警情地址", prop: "jqdz", type: "input" },
{ label: "警情类别代码", prop: "jqlbdm", type: "select", options: JQLB },
{ label: "警情类型代码", prop: "jqlxdm", type: "select",options: JQLX},
{ label: "警情来源", prop: "jqly", type: "select",options: D_BZ_JQLY},
{ label: "警情细类代码", prop: "jqxldm", type: "select" ,options: JQXL},
{ label: "警情子类代码", prop: "jqzldm", type: "select" ,options: JQZL},
{ label: "报警内容", prop: "bjnr", type: "textarea", width: "90%" },
{ label: "补充接警内容", prop: "bcjjnr", type: "textarea", width: "90%" },
{ label: "被困人员情况说明", prop: "bkryqksm", type: "textarea", width: "90%" },
])
const elform = ref()
watch(() => props.modelValue, (val) => {
if (val) {
tbJqIdFunc()
}
})
const tbJqIdFunc = () => {
console.log(props.dataList);
tbJqId(props.dataList.glzjjdbh).then((res) => {
listQuery.value = res
})
}
const close = () => {
elform.value.reset()
emits('update:modelValue', false)
}
</script>