This commit is contained in:
lcw
2025-09-03 14:43:40 +08:00
parent 1c6bbffc3b
commit 24c6a24a4f
6 changed files with 450 additions and 29 deletions

View File

@ -7,7 +7,8 @@
<Editor :style="`height: ${props.heightNumber}px; overflow-y: hidden`" v-model="textContent" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" @onChange="handChange" />
</div>
<template #footer>
<!-- <el-button type="primary"></el-button> -->
<el-button type="primary" @click="SaveReport"></el-button>
<!-- <el-button type="primary" @click="downloadWithStyles">历史报告</el-button> -->
<el-button type="primary" @click="downloadWithStyles">下载</el-button>
<el-button type="primary" @click="close">取消</el-button>
</template>
@ -47,7 +48,7 @@ const mode = "default";
const toolbarConfig = {
excludeKeys: ["blockquote", "codeBlock"] //清除不必要的工具,引用和代码块
};
const emits = defineEmits(["update:textContent", "changeFn","update:modelValue"]);
const emits = defineEmits(["update:textContent", "changeFn","update:modelValue","SaveReport"]);
//编辑器配置
const editorConfig = {
withCredentials: true, //允许跨域
@ -122,6 +123,9 @@ const downloadWithStyles = () => {
saveAs(blob, 'styled-document.doc');
};
const SaveReport = () => {
emits("SaveReport",props.textContent)
}
</script>
<style lang="scss" scoped>

View File

@ -17,7 +17,9 @@
<template #jqlbdm="{ row }">
<DictTag :tag="false" :value="row.jqlbdm" :options="dict.JQLB" />
</template>
<template #controls="{ row }">
<el-link type="primary" @click="addEdit( row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
@ -26,6 +28,7 @@
</div>
</div>
<Particulars ref="particulars" :dic="dict"/>
</div>
</template>
@ -33,6 +36,7 @@
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import Particulars from "./particulars.vue";
import { qcckPost } from "@/api/qcckApi.js";
import { ref, reactive, nextTick, getCurrentInstance } from 'vue';
import { useRouter, useRoute } from 'vue-router'
@ -58,13 +62,12 @@ const onSearch = (val) => {
const router = useRouter()
const route = useRoute()
const pageData = reactive({
tableData: [], //表格数据
tableData: [{ypmc:"xxx"}], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false
},
total: 0,
pageConfiger: {
@ -136,7 +139,10 @@ const init = (val, lxs) => {
tabHeightFn()
})
}
const particulars=ref()
const addEdit = (row) => {
particulars.value.init(row)
}
defineExpose({ init })
</script>

View File

@ -0,0 +1,253 @@
<template>
<el-dialog
:title="titleValue"
width="1400px"
:model-value="modelValue"
append-to-body
@close="closed"
>
<div>
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
<el-form-item label="报告名称">
<el-input
placeholder="请输入报告名称"
v-model="listQuery.bgmc"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
<el-button type="info" @click="reset"> 重置 </el-button>
</el-form-item>
</el-form>
<div
class="tabBox"
:class="props.Single ? 'tabBoxRadio' : ''"
:key="keyVal"
style="margin-top: 0px"
>
<el-table
ref="multipleUserRef"
@selection-change="handleSelectionChange"
:data="tableData"
v-loading="loading"
border
:row-key="keyid"
style="width: 100%"
height="450"
>
<!-- <el-table-column
type="selection"
width="55"
:reserve-selection="true"
/> -->
<el-table-column prop="bgmc" align="center" label="报告名称" />
<el-table-column prop="scsj" align="center" label="保存时间" />
<el-table-column align="center" label="操作">
<template #default="{ row }">
<el-button type="primary" size="mini" @click="deletBg(row)">删除</el-button>
<el-button type="primary" size="mini" @click="onComfirm(row.bgnr)">详情</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="fenye" :style="{ top: tableHeight + 'px' }">
<el-pagination
class="pagination"
@pageSize-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="listQuery.pageCurrent"
:page-sizes="[10, 20, 50, 100]"
:page-pageSize="listQuery.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<!-- <el-button type="primary" @click="onComfirm">确认</el-button> -->
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { qcckGet ,qcckDelete} from "@/api/qcckApi.js";
import { defineProps, ref, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
titleValue: {
type: String,
default: "查看报告"
},
LeaderType: {
type: String,
default: ""
},
//是否单选
Single: {
type: Boolean,
default: true
},
roleIds: {
type: Array,
default: []
}, chageData: {
type: String,
default: ""
}
});
const loading = ref(false);
const total = ref(0);
const listQuery = ref({
pageCurrent: 1,
pageSize: 20
});
const keyVal = ref();
const multipleUserRef = ref(null);
const multipleSelectionUser = ref([]);
const tableData = ref([]);
const emits = defineEmits(["update:modelValue", "choosed"]);
const keyid = (row) => {
return row.id;
};
const closed = () => {
emits("update:modelValue", false);
};
const reset = () => {
listQuery.value = { pageCurrent: 1, pageSize: 20 };
getListData();
};
// 为用户分配角色
const onComfirm = (val) => {
// const userList = multipleSelectionUser.value;
// let list = [];
// let listId = [];
// userList.forEach((val) => {
// if (listId.indexOf(val.id) == -1) {
// list.push(val);
// listId.push(val.id);
// }
// });
emits("choosed", val);
closed();
};
/**
* pageSize 改变触发
*/
const handleSizeChange = (currentSize) => {
listQuery.value.pageSize = currentSize;
getListData();
};
/**
* 页码改变触发
*/
const handleCurrentChange = (currentPage) => {
listQuery.value.pageCurrent = currentPage;
getListData();
};
const chageDatas=ref()
// watch(() => props.chageData, (val) => {
// chageDatas.value = val;
// getListData()
// },{deep:true,immediate:true})
const getListData = () => {
keyVal.value++;
loading.value = true;
const params = { ...listQuery.value,ypid:chageDatas.value};
qcckGet(params, "/mosty-gsxt/gsxtYpbg/getPageList")
.then((res) => {
loading.value = false;
tableData.value = res.records || [];
total.value = res.total;
multipleUser();
})
.catch(() => {
loading.value = false;
});
};
//列表回显
function multipleUser() {
tableData.value.forEach((item) => {
multipleUserRef.value.toggleRowSelection(item, false);
if (props.roleIds.some((id) => id == item.id)) {
multipleUserRef.value.toggleRowSelection(item, true);
}
});
}
const handleFilter = () => {
listQuery.value.pageCurrent = 1;
getListData();
};
const handleSelectionChange = (val) => {
if (props.Single) {
if (val.length > 1) {
let del_row = val.shift();
multipleUserRef.value.toggleRowSelection(del_row, false);
}
multipleSelectionUser.value = val;
} else {
multipleSelectionUser.value = val;
}
};
// 删除
const deletBg = (val) => {
const id = { ids: [val.id] }
proxy.$confirm('确定删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
qcckDelete(id, `/mosty-gsxt/gsxtYpbg/deleteEntity`).then((res) => {
getListData();
ElMessage.success("删除成功");
})
}).catch(() => {
ElMessage({
type: 'info',
message: '已取消删除'
});
});
}
watch(
() => props.modelValue,
(val) => {
if (val) {
chageDatas.value = props.chageData;
console.log(chageDatas.value );
handleFilter();
}
},
{ immediate: true }
);
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
</style>
<style>
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
</style>

View File

@ -0,0 +1,111 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<div></div>
<div>
<el-button @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" />
</div>
</div>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet } from "@/api/qcckApi.js";
import {
ref,
defineExpose,
reactive,
onMounted,
defineEmits,
} from "vue";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
});
const dialogForm = ref(false); //弹窗
const formData = ref([
{ label: "报警电话", prop: "bjdh", type: "input" },
{ label: "报警地址", prop: "bjdz", type: "input" },
{ label: "报警内容", prop: "bjnr", type: "input" },
{ label: "报警人名称", prop: "bjrmc", type: "input" },
{ label: "报警人证件号码", prop: "bjrzjhm", type: "input" },
{ label: "报警时间", prop: "bjsj", type: "input" },
{ label: "接警完成时间", prop: "jjwcsj", type: "input" },
{ label: "警情子类", prop: "jqzldm", type: "select", options: props.dic.JQZL },
{ label: "警情细类", prop: "jqxldm", type: "select", options: props.dic.JQXL },
{ label: "警情类型", prop: "jqlxdm", type: "select",options: props.dic.JQLX },
{ label: "警情来源", prop: "jqlyfs", type: "select",options: props.dic.D_BZ_JQLY },
{ label: "警情类别", prop: "jqlbdm", type: "select", options: props.dic.JQLB },
// { label: "警情等级", prop: "jqdjdm", type: "select", options: props.dic.JQXL },
{ label: "警情处理状态", prop: "jqclztdm", type: "select",options: props.dic.JQCLJG },
]);
const listQuery = ref({}); //表单
const elform = ref();
const pageForm = reactive({});
onMounted(() => {
tabHeightFn();
});
//
// 初始化数据
const init = (row) => {
dialogForm.value = true;
qcckGet({}, `/mosty-gsxt/jjdbYp/getInfo/${row.id}`).then(res => {
listQuery.value = res;
}).catch(() => {
})
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
};
// 表格高度计算
const tabHeightFn = () => {
pageForm.tableHeight = window.innerHeight - 720;
window.onresize = function () {
tabHeightFn();
};
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: 99%;
height: 225px;
margin-top: 10px;
overflow: hidden;
}
::v-deep .avatar-uploader {
display: flex;
align-items: center;
}
::v-deep .el-upload-list {
margin-left: 20px;
display: flex;
align-items: center;
}
::v-deep .el-upload-list__item-name .el-icon {
top: 3px;
}
</style>

View File

@ -25,6 +25,10 @@
</div>
<div class="f14 lh24 pl4 pr4 one_text_detail">数量{{ it.num }}</div>
<div class="foot">
<span class="ml10 pointer" @click.stop="openHistoricalReport(it.id)" style="color:#027ff0 ;"><el-icon
style="top: 2px;">
<Document />
</el-icon>历史报告</span>
<span class="ml10 pointer" @click.stop="funAll(it.id)" style="color:#027ff0 ;"><el-icon style="top: 2px;">
<Document />
</el-icon>报告</span>
@ -41,12 +45,14 @@
</div>
</div>
<!-- 详情 -->
<Detail ref="detailForm" @getData="getLits" :dict="JQLB"></Detail>
<YpModel v-model="showModel" :heightNumber="650" v-model:textContent="textContent"></YpModel>
<Detail ref="detailForm" @getData="getLits" :dict="{ JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQFL, JQCLJG }"></Detail>
<YpModel v-model="showModel" @SaveReport="SaveReport" :heightNumber="650" v-model:textContent="textContent"></YpModel>
<HistoricalReport v-model="showHistoricalReport" @choosed="getHistory" :chageData="chageData"/>
</template>
<script setup>
import YpModel from '@/components/ypModel/index.vue'
import HistoricalReport from './components/historicalReport.vue'
import Detail from './components/detail.vue'
import * as MOSTY from "@/components/MyComponents/index";
import CheckBox from "@/components/checkBox/index.vue";
@ -58,10 +64,11 @@ import { useRoute, useRouter } from 'vue-router';
import { reactive, ref, onMounted, getCurrentInstance, watch, nextTick } from "vue";
import { jqypDywdtj, jqypfxbgJqlxtj, jqypfxbgYdfx, jqypfxbgJqlytj, jqypfxbgTj, jqypfxbgCljgf, jqypfxbgCzlfx, getDictItem } from '@/api/semanticAnalysis'
import { textStyle, Firstlevelheading, Subheading, BiheadlinegTitle, BigTitle, headTitle, report, signature } from './components/content.js'
import { ElMessage, ElMessageBox } from 'element-plus'
const router = useRouter();
const { proxy } = getCurrentInstance();
const { D_SG_SJLY, D_SG_TSYPGZ,JQLB } = proxy.$dict("D_SG_SJLY", "D_SG_TSYPGZ","JQLB"); //获取字典数据
const { D_SG_SJLY, D_SG_TSYPGZ, JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQFL, JQCLJG } = proxy.$dict("D_SG_SJLY", "D_SG_TSYPGZ", "JQLB", "JQLX", "JQXL", "JQZL", "D_BZ_JQLY", "D_BZ_JQFL", "JQCLJG"); //获取字典数据
const searchBox = ref(); //搜索框
const showModel = ref(false);
const textContent = ref('');
@ -87,6 +94,7 @@ const total = ref(0)
const list = ref([])
const loading = ref(false);
const formData = ref({})
const chageData=ref()
watch(() => [D_SG_SJLY.value, D_SG_TSYPGZ.value], val => {
checkData.sjlxBtn.list = val[0].map(v => v.zdmc);
checkData.yplxBtn.list = val[1].map(v => v.zdmc);
@ -230,7 +238,12 @@ const getDictItemList = () => {
}
getDictItemList()
const funAll = (val) => {
console.log(chageData.value);
const dev = getItem('deptId')[0]
sortingRatioValue.value = {}
textContent.value = BigTitle(`${endYears.value}年度西藏公安执法数据分析`) + headTitle({
orgName: dev.deptName,
serialNumber: timeValidate("", "mm"),
@ -243,10 +256,8 @@ const funAll = (val) => {
getfxbgJqlxtj(val)
getfxbgJqlytj(val)
getfxbgDywdtj(val)
getfxgbCljgf(val)
getfxgbCzlfx(val)
console.log(sortingRatioValue.value);
showModel.value = true;
}
@ -255,7 +266,6 @@ watch(() => sortingRatioValue.value, (val) => {
if (val.jqlx && val.jqly && val.dywd && val.ydfx && val.xlwdfx && val.czjgfx) {
textContent.value += val.jqlx + val.jqly + val.dywd + val.ydfx + val.xlwdfx + val.czjgfx + report() + signature()
}
}, { deep: true })
const getfxbgTj = (val) => {
jqypfxbgTj({ ypid: val }).then(res => {
@ -362,11 +372,48 @@ const Time = () => {
timeDate.value = `${endYear}${endMonth}${endDay}`
endYears.value = year
return `${year}${month}${day}日 至${endYear}${endMonth}${endDay}`
}
const showHistoricalReport = ref(false)
const openHistoricalReport = (val) => {
chageData.value = val
showHistoricalReport.value = true
}
// const
const getHistory = (val) => {
textContent.value = val
showHistoricalReport.value = false
showModel.value = true
}
const SaveReport = (val) => {
ElMessageBox.prompt('请输入名称', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
// inputPattern:/[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
// inputErrorMessage: 'Invalid Email',
})
.then(({ value }) => {
const promes = {
bgmc:value,
bgnr: val,
ypid:chageData.value
}
qcckPost( promes , "/mosty-gsxt/gsxtYpbg/addEntity")
.then(() => {
ElMessage.success("保存成功");
})
})
.catch(() => {
ElMessage({
type: 'info',
message: '取消保存',
})
})
.catch(() => { });
}
</script>

View File

@ -4,8 +4,8 @@ function resolve(dir) {
return path.join(__dirname, dir);
}
// const serverHost = "http://192.168.1.32:8006"//波哥
const serverHost = "http://192.168.0.231:8006"//线上
const serverHost = "http://192.168.1.32:8006"//波哥
// const serverHost = "http://192.168.0.231:8006"//线上
// const serverHost = "http://192.168.1.117:8006"//周
// const serverHost = "http://192.168.1.98:8006"//毛毛