This commit is contained in:
lcw
2026-04-28 11:26:26 +08:00
parent 9fa073546b
commit cd8347d3d1
120 changed files with 8751 additions and 3896 deletions

View File

@ -42,7 +42,7 @@ const btns = ref(['重点人','重点群体'])
const active = ref('重点人');
const keywords = ref(''); // 搜索关键字
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT,D_BZ_RYBQ,D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_ZDQT_ZT','D_BZ_RYBQ','D_GS_ZDQT_FXDJ') //获取字典数据
const { D_GS_ZDQT_ZT,/* D_BZ_RYBQ, */D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_ZDQT_ZT',/* 'D_BZ_RYBQ', */'D_GS_ZDQT_FXDJ') //获取字典数据
const pageData = reactive({
tableData: [],
keyCount: 0,

View File

@ -49,8 +49,16 @@ import { onMounted, getCurrentInstance, ref, reactive } from 'vue'
import { useRoute } from 'vue-router'
import { setAddress } from '@/utils/tools'
const { proxy } = getCurrentInstance();
const { D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
proxy.$dict("D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const {
// D_BZ_SF,
D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX,
// D_GS_XS_QTLX
} =
proxy.$dict(
// "D_BZ_SF",
"D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX"
// , "D_GS_XS_QTLX"
); //获取字典数据
// 基础信息
const basicInformation = ref(

View File

@ -86,7 +86,22 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import { qcckGet, qcckPost,qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT,D_GS_ZDR_RYJB, D_BZ_XB,BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT","D_GS_ZDR_RYJB","D_BZ_XB","D_BZ_MZ","D_BZ_XZQHDM","D_GS_ZDR_BK_ZT","D_GS_ZDR_CZZT","D_GS_BQ_ZL","D_GS_BQ_LB","D_GS_BQ_LX","D_GS_BK_SSJZ","D_GS_BK_SQLX","D_BZ_SF","D_GS_XS_LY","D_BZ_SSZT","D_GS_XS_LX","D_GS_XS_QTLX","BD_BK_CLYJBQ","D_GS_ZDR_YJDJ");
const {
D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ,
// D_GS_BK_SQLX,
// D_BZ_SF,
// D_GS_XS_LY,
// D_BZ_SSZT,
// D_GS_XS_LX,
// D_GS_XS_QTLX
} = proxy.$dict("D_GS_ZDQT_ZT","D_GS_ZDR_RYJB","D_BZ_XB","D_BZ_MZ","D_BZ_XZQHDM","D_GS_ZDR_BK_ZT","D_GS_ZDR_CZZT","D_GS_BQ_ZL","D_GS_BQ_LB","D_GS_BQ_LX","D_GS_BK_SSJZ"
// ,"D_GS_BK_SQLX"
// ,"D_BZ_SF"
// ,"D_GS_XS_LY"
// ,"D_BZ_SSZT"
// ,"D_GS_XS_LX"
// ,"D_GS_XS_QTLX"
,"BD_BK_CLYJBQ","D_GS_ZDR_YJDJ");
const obj = ref({});
const showzxs = ref(false);
const zxsDilof = ref();

View File

@ -65,7 +65,26 @@ import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_CZZT,D_GS_BK_SQLX, D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT","D_GS_BK_SQLX", "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const {
D_GS_ZDR_CZZT,
// D_GS_BK_SQLX,
D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT,
// D_BZ_SF,
D_BZ_XB,
// D_GS_XS_LY,
// D_BZ_SSZT,
// D_GS_XS_LX,
// D_GS_XS_QTLX
} = proxy.$dict("D_GS_ZDR_CZZT"
// ,"D_GS_BK_SQLX"
, "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT"
// , "D_BZ_SF"
, "D_BZ_XB"
// , "D_GS_XS_LY"
// , "D_BZ_SSZT"
// , "D_GS_XS_LX"
// , "D_GS_XS_QTLX"
); //获取字典数据
const showzxs = ref(false);
const queryFrom = ref({});
const ids = ref([]);

View File

@ -74,8 +74,23 @@ import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { getItem } from "@/utils/storage.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
proxy.$dict("D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_ZDR_YJDJ", "D_GS_BK_SSJZ", "D_GS_BK_SQLX", "D_BZ_SF", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX");
const {
D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ,
// D_GS_BK_SQLX,
// D_BZ_SF,
// D_GS_XS_LY,
// D_BZ_SSZT,
// D_GS_XS_LX,
// D_GS_XS_QTLX
} =
proxy.$dict("D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_ZDR_YJDJ", "D_GS_BK_SSJZ"
// , "D_GS_BK_SQLX"
// , "D_BZ_SF"
// , "D_GS_XS_LY"
// , "D_BZ_SSZT"
// , "D_GS_XS_LX"
// , "D_GS_XS_QTLX"
);
const obj = ref({});
const show = ref(false);
const addFormDiloag = ref();

View File

@ -19,7 +19,7 @@ import { generateRandom10Digits } from '@/utils/tools'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
const { proxy } = getCurrentInstance();
const { D_ZFNR_MBLX } = proxy.$dict("D_ZFNR_MBLX")
// const { D_ZFNR_MBLX } = proxy.$dict("D_ZFNR_MBLX") // 未使用,已注释
const props = defineProps({
data: {
type: Object,

View File

@ -20,8 +20,8 @@
:class="activeSection === 'character-section' ? 'active' : ''">背景信息</li>
<li @click="scrollToSection('controlInfo-section')"
:class="activeSection === 'controlInfo-section' ? 'active' : ''" v-if="!butShow">管控信息</li>
<li @click="scrollToSection('featinfo-section')"
:class="activeSection === 'featinfo-section' ? 'active' : ''" v-if="!butShow">全要素布控</li>
<li @click="scrollToSection('featinfo-section')" :class="activeSection === 'featinfo-section' ? 'active' : ''"
v-if="!butShow">全要素布控</li>
<li @click="scrollToSection('demandsInfo-section')"
:class="activeSection === 'demandsInfo-section' ? 'active' : ''" v-if="!butShow">密切联系人</li>
<li @click="scrollToSection('requestInfo-section')"
@ -69,13 +69,13 @@
<div id="judgmentRecord-section" v-if="!butShow">
<VisitRecord ref="visitRecord" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="historyAssembly-section" v-if="!butShow" >
<div id="historyAssembly-section" v-if="!butShow">
<CaseInfo ref="caseInfo" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="joblogging-section" v-if="!butShow">
<ActualPerformance ref="actualPerformance" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="joblogging-joblog" v-if="!butShow" >
<div id="joblogging-joblog" v-if="!butShow">
<CzModel ref="czModel" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
</div>
@ -114,7 +114,7 @@ const showBut = ref(false)
const listQuery = ref({});
const butShow = ref(false)
const title = ref('新增')
const showData=ref(false)
const showData = ref(false)
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
@ -207,7 +207,7 @@ const submit = async () => {
info.value.throwData()
// personnelTags.value.throwData(),
]);
tbGsxtZdrySave({...infoData,rylx:'03'}).then(res => {
tbGsxtZdrySave({ ...infoData, rylx: '03' }).then(res => {
proxy.$message({
message: '新增成功',
type: 'success',
@ -221,7 +221,7 @@ const submit = async () => {
// 关闭
const close = () => {
if (route.query.id) {
if (route.query.id) {
const query = { ...route.query };
delete query.id;
router.replace({ query });

View File

@ -69,7 +69,7 @@
}"></Pages>
</div>
<!-- 详情 -->
<AddForm ref="addFormDiloag" @updateDate="getList"
<AddForm ref="addFormDiloag" @updateDate="getList" rylx="03"
:dic="{ D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ }" />
<!-- 选择用户 -->
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
@ -87,15 +87,17 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import WarnDataTable from "@/views/backOfficeSystem/ces/components/WarnDataTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
// import AddForm from "./components/addForm.vue";
import AddForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvPeo/components/addForm.vue";
// src\views\backOfficeSystem\DeploymentDisposal\mpvPeo\components\addForm.vue
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance();
const { D_ZDRGK_GKZT, D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
proxy.$dict('D_ZDRGK_GKZT', "D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_ZDR_YJDJ", "D_GS_BK_SSJZ", "D_GS_BK_SQLX", "D_BZ_SF", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX");
const { D_ZDRGK_GKZT, D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
proxy.$dict('D_ZDRGK_GKZT', "D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_ZDR_YJDJ", "D_GS_BK_SSJZ", "D_BZ_SF", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX");
const obj = ref({});
const showzxs = ref(false);
const zxsDilof = ref();
@ -160,7 +162,7 @@ const pageData = reactive({
{ label: "管控状态", prop: "zdrBkZt", showOverflowTooltip: true, slotName: "zdrBkZt", width: 100 },
{ label: "审核状态", prop: "zdrZt", slotName: "zdrZt", width: 100 },
{ label: "入库时间", prop: "zdrRkkssj", },
{ label: "操作", prop: "controls", slotName: "controls", width: 280 },
{ label: "操作", prop: "controls", slotName: "controls", width: 300 },
]
});

View File

@ -40,7 +40,7 @@ import { ref, getCurrentInstance, onMounted } from 'vue'
import GdMap from "@/components/GdMap/index.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_ZJLX } = proxy.$dict("D_BZ_ZJLX")
// const { D_BZ_ZJLX } = proxy.$dict("D_BZ_ZJLX") // 未使用,已注释
// 搜索表单
const searchForm = ref({

View File

@ -25,7 +25,7 @@ import CaseLodig from "../component/caseLodig.vue";
import { tbGsxtZdryAjxxSaveOrUpdateAjxx, tbGsxtZdryAjxx, tbGsxtZdryAjxxselectAjxx } from '@/api/zdr.js'
import { ElMessage, ElMessageBox } from "element-plus";
const { proxy } = getCurrentInstance();
const { D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP } = proxy.$dict("D_BZ_CLLX", "D_BZ_CLYS", "D_BZ_CLPP"); //获取字典数据
// const { D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP } = proxy.$dict("D_BZ_CLLX", "D_BZ_CLYS", "D_BZ_CLPP"); // 未使用,已注释
const chooseMarksVisible = ref(false)
const props = defineProps({
dataList: {

View File

@ -17,7 +17,7 @@
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { reactive, ref,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const { D_BZ_XB } = proxy.$dict("D_BZ_XB"); // 获取字典数据
// const { D_BZ_XB } = proxy.$dict("D_BZ_XB"); // 未使用,已注释
const elform = ref()
const showDialog = ref(false)
const emit = defineEmits(['change'])

View File

@ -70,7 +70,7 @@ import { ElMessage } from "element-plus";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_CZZT, D_GS_BK_SQLX, D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT", "D_GS_BK_SQLX", "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const { D_GS_ZDR_CZZT, /* D_GS_BK_SQLX, */ D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT", /* "D_GS_BK_SQLX", */ "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const showzxs = ref(false);
const queryFrom = ref({});
const ids = ref([]);

View File

@ -185,7 +185,7 @@ const {
D_GS_BQ_LX,
D_GS_ZDR_YJDJ,
D_GS_BK_SSJZ,
D_GS_BK_SQLX,
/* D_GS_BK_SQLX, */
D_BZ_SF,
D_GS_XS_LY,
D_BZ_SSZT,
@ -205,7 +205,7 @@ const {
"D_GS_BQ_LX",
"D_GS_ZDR_YJDJ",
"D_GS_BK_SSJZ",
"D_GS_BK_SQLX",
/* "D_GS_BK_SQLX", */
"D_BZ_SF",
"D_GS_XS_LY",
"D_BZ_SSZT",

View File

@ -65,7 +65,7 @@ import { IdCard } from "@/utils/validate.js";
import * as MOSTY from "@/components/MyComponents/index";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
import { ref, reactive, onMounted, getCurrentInstance, watch } from "vue";
import { ref, reactive, onMounted, getCurrentInstance, watch, computed } from "vue";
import { tbGsxtZdryUpdate } from "@/api/zdr.js";
const { proxy } = getCurrentInstance();
const {
@ -136,7 +136,7 @@ const rules = reactive({
const listQuery = ref({}); //表单
const chooseMarksVisible = ref(false); // 控制标签选择弹窗显示
const roleIds = ref([]); // 已选择的标签ID
const formData = ref([
const formData = computed(() => [
{ label: "人员照片", prop: "ryzp", type: "slot", width: "100%" },
{ label: "姓名", prop: "ryXm", type: "input", width: "30%" },
{ label: "身份证号", prop: "rySfzh", type: "input", width: "30%" },
@ -144,7 +144,7 @@ const formData = ref([
label: "性别",
prop: "ryXb",
type: "select",
options: D_BZ_XB,
options: D_BZ_XB.value,
width: "30%"
},
{ label: "出生日期", prop: "ryCsrq", type: "date", width: "30%" },
@ -152,7 +152,7 @@ const formData = ref([
label: "民族",
prop: "ryMz",
type: "select",
options: D_BZ_MZ,
options: D_BZ_MZ.value,
width: "30%"
},
{
@ -166,7 +166,7 @@ const formData = ref([
label: "预警等级",
prop: "zdrYjdj",
type: "select",
options: D_GS_ZDR_YJDJ,
options: D_GS_ZDR_YJDJ.value,
width: "30%"
},
{ label: "管控民警", prop: "gkMjXm", type: "slot", width: "30%" },
@ -180,14 +180,14 @@ const formData = ref([
label: "文化程度",
prop: "whcdBm",
type: "select",
options: D_BZ_WHCD,
options: D_BZ_WHCD.value,
width: "30%"
},
{
label: "政治面貌",
prop: "zzmm",
type: "select",
options: D_BZ_ZZMM,
options: D_BZ_ZZMM.value,
width: "30%"
},
{ label: "职业", prop: "zyBm", type: "input", width: "30%" },
@ -195,7 +195,7 @@ const formData = ref([
label: "人员级别",
prop: "zdrRyjb",
type: "select",
options: D_GS_ZDR_RYJB,
options: D_GS_ZDR_RYJB.value,
width: "30%"
},
{ label: "户籍地区划", prop: "hjdQh", type: "input", width: "30%" },
@ -218,14 +218,14 @@ const formData = ref([
label: "所属警种",
prop: "zdrSsjz",
type: "select",
options: D_GS_BK_SSJZ,
options: D_GS_BK_SSJZ.value,
width: "30%"
},
{
label: "涉及警种",
prop: "zdrSjjz",
type: "select",
options: D_GS_BK_SSJZ,
options: D_GS_BK_SSJZ.value,
multiple: true,
width: "30%"
},
@ -233,21 +233,21 @@ const formData = ref([
label: "婚姻状态",
prop: "hyzk",
type: "select",
options: D_BZ_HYZK,
options: D_BZ_HYZK.value,
width: "30%"
},
{
label: "处置状态",
prop: "zdrCzzt",
type: "select",
options: D_GS_ZDR_CZZT,
options: D_GS_ZDR_CZZT.value,
width: "30%"
},
{
label: "布控状态",
prop: "zdrBkZt",
type: "select",
options: D_BZ_RCBKZT,
options: D_BZ_RCBKZT.value,
width: "30%"
},
// { label: "人员类型", prop: "rylx", type: "select", options: D_ZDRY_RYLX },

View File

@ -73,12 +73,16 @@ import Details from './details.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
const { proxy } = getCurrentInstance();
const { D_BZ_RCSHZT, D_GS_RQFJ_LX, D_GS_RQFJ_FXDJ, D_BZ_SF, D_GS_RQFJ_FXLB } =
const { D_BZ_RCSHZT,
// D_GS_RQFJ_LX,
D_GS_RQFJ_FXDJ,
// D_BZ_SF,
D_GS_RQFJ_FXLB } =
proxy.$dict(
"D_BZ_RCSHZT",
"D_GS_RQFJ_LX",
// "D_GS_RQFJ_LX",
"D_GS_RQFJ_FXDJ",
"D_BZ_SF",
// "D_BZ_SF",
"D_GS_RQFJ_FXLB"
);

View File

@ -22,7 +22,8 @@
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { reactive, watch,getCurrentInstance } from "vue";
import { saveAs } from 'file-saver';
import { reactive, watch, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const props = defineProps({
isImg: {
@ -66,10 +67,10 @@ const pageData = reactive({
});
watch(() => listQuery.img, (newVal, oldVal) => {
pageData.tableData = newVal.map(item => {
return {
wjmc: item.name,
wjdx:parseFloat((item.id.fileSize/1024/1024).toFixed(2)),
url: item.id.url
return {
wjmc: item.name,
wjdx: parseFloat((item.id.fileSize / 1024 / 1024).toFixed(2)),
url: item.id.url
}
})
emit("changeData", pageData.tableData);
@ -77,26 +78,25 @@ watch(() => listQuery.img, (newVal, oldVal) => {
watch(() => props.imgMsg, (newVal, oldVal) => {
pageData.tableData = newVal.map(item => {
return {
...item,
...item,
}
})
},{deep:true,immediate:true})
}, { deep: true, immediate: true })
const deleteFile = (row) => {
pageData.tableData = pageData.tableData.filter(item => item.url !== row.url)
const data=pageData.tableData.map(item => {
return {
wjmc: item.wjmc,
wjdx: parseFloat(item.wjdx),
url: item.url
const data = pageData.tableData.map(item => {
return {
wjmc: item.wjmc,
wjdx: parseFloat(item.wjdx),
url: item.url
}
})
emit("changeData",data);
emit("changeData", data);
}
const downloadFile = async (item) => {
console.log(item);
try {
const dataList =[item]
const dataList = [item]
if (dataList.length === 0) {
proxy.$message.warning('没有文件可下载');
return;
@ -108,39 +108,15 @@ const downloadFile = async (item) => {
proxy.$message.info(`开始下载${downloadCount}个文件...`);
// 并行下载所有文件
const downloadPromises = dataList.map(async (fileData, index) => {
try {
// 使用fetch获取文件内容
const response = await fetch(fileData.url);
if (!response.ok) {
throw new Error('文件下载失败');
}
// 将响应转换为Blob对象
const blob = await response.blob();
// 创建下载链接
const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob);
// 设置下载文件的名称,避免冲突
const fileName = dataList.length > 1
? `${item.wjmc}_${index + 1}`
: item.wjmc;
downloadLink.download = fileName;
// 触发下载
document.body.appendChild(downloadLink);
downloadLink.click();
// 清理
setTimeout(() => {
document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadLink.href);
}, 100);
const fileName = dataList.length > 1 ? `${item.wjmc}_${index + 1}` : item.wjmc;
saveAs(blob, fileName);
successCount++;
} catch (error) {
console.error(`文件${index + 1}下载失败:`, error);
@ -148,10 +124,8 @@ const downloadFile = async (item) => {
}
});
// 等待所有下载完成
await Promise.all(downloadPromises);
// 显示下载结果
if (failCount === 0) {
proxy.$message.success(`成功下载${successCount}个文件`);
} else if (successCount === 0) {

View File

@ -57,9 +57,11 @@ import { useRoute } from 'vue-router'
import { reactive, ref, onMounted, getCurrentInstance, watch } from "vue";
import { getItem } from '@//utils/storage.js'
import { deleteWjZzzAddEntity, getWjZzzAddEntity, selectDxzjList } from '@//api/qbcj.js'
import { saveAs } from 'file-saver';
import AddForm from "@/views/backOfficeSystem/HumanIntelligence/fileTransfer/components/addForm.vue";
const { proxy } = getCurrentInstance();
// const { D_BZ_CJLX, D_GS_XS_LX } = proxy.$dict("D_BZ_CJLX", "D_GS_XS_LX"); //获取字典数据
// 未使用: D_GS_XS_LX
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const ids = ref([])
@ -188,27 +190,12 @@ const downloadFile = async (item) => {
proxy.$message.info(`开始下载${downloadCount}个文件...`);
const downloadPromises = dataList.map(async (fileData, index) => {
try {
// fileData.url = "http://47.108.232.77:9000/image/2025-01-06/081102a5418e4146beea277d18018e07.jpeg";
// 使用fetch获取文件内容
const downloadUrl = fileData.url.replace(/^https?:\/\/[^/]+/, '/zyminio');
const response = await fetch(downloadUrl);
if (!response.ok) throw new Error('文件下载失败');
// 将响应转换为Blob对象
const blob = await response.blob();
// 创建下载链接
const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob);
// 设置下载文件的名称,避免冲突
const fileName = dataList.length > 1 ? `${item.wjmc}_${index + 1}` : item.wjmc;
downloadLink.download = fileName;
// 触发下载
document.body.appendChild(downloadLink);
downloadLink.click();
// 清理
setTimeout(() => {
document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadLink.href);
}, 100);
saveAs(blob, fileName);
successCount++;
} catch (error) {
console.error(`文件${index + 1}下载失败:`, error);
@ -216,9 +203,7 @@ const downloadFile = async (item) => {
}
});
// 等待所有下载完成
await Promise.all(downloadPromises);
// 显示下载结果
if (failCount === 0) {
proxy.$message.success(`成功下载${successCount}个文件`);
} else if (successCount === 0) {

View File

@ -8,10 +8,9 @@
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<template #wjdz>
<FileUploadList @changeData="changeData" :imgMsg="imgMsg"/>
<FileUploadList @changeData="changeData" :imgMsg="imgMsg" />
<!-- <div style="width: 100%;">
<UploadFile v-model="imgMsg" :limit="1" :isImg="false" :isAll="false" />
</div> -->
@ -33,7 +32,7 @@ import UploadFile from "@/components/MyComponents/Upload/index.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch } from "vue";
import { postWjZzzAddEntity, putWjZzzAddEntity, deleteWjZzzAddEntity, getWjZzzAddEntity, getWjZzzAddEntityById } from '@//api/qbcj.js'
const emit = defineEmits(["updateDate","getList"]);
const emit = defineEmits(["updateDate", "getList"]);
const props = defineProps({
dic: Object
});
@ -63,7 +62,7 @@ const listQuery = ref({}); //表单
// }
// }, { deep: true })
watch(() => listQuery.value.wjlb, (newVal, oldVal) => {
listQuery.value.wjlb = newVal
listQuery.value.wjlb = newVal
if (newVal == '02') {
formData.value = [
// {
@ -76,14 +75,14 @@ watch(() => listQuery.value.wjlb, (newVal, oldVal) => {
// }]
// },
{ label: "文件", prop: "wjdz", type: "slot", width: "100%" },
{ label: "文件大小", prop: "wjdx", type: "input", width: "30%", placeholder: "单位MB",disabled: true },
{ label: "文件大小", prop: "wjdx", type: "input", width: "30%", placeholder: "单位MB", disabled: true },
{ label: "文件名称", prop: "wjmc", type: "input", width: "30%" },
// { label: "文件文件类型", prop: "wjlx", type: "input", width: "30%" },
{ label: "接收人", prop: "jsrxm", type: "slot", width: "100%" },
{ label: "接收部门", prop: "jsbmdm", type: "department", depMc: "jsbmmc", multiple: true },
{ label: "文件描述", prop: "wjms", type: "textarea", width: "100%" },]
} else {
formData.value = [
formData.value = [
// {
// label: "文件类型", prop: "wjlb", type: "radio", options: [{
// label: "普通文件",
@ -112,7 +111,7 @@ const rules = reactive({
});
// 初始化数据
const init = (type, row,wjlb) => {
const init = (type, row, wjlb) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
if (row) { getDataById(row.id) } else {
@ -123,31 +122,31 @@ const init = (type, row,wjlb) => {
const getDataById = (id) => {
getWjZzzAddEntityById(id).then((res) => {
listQuery.value = res;
imgMsg.value =JSON.parse(res.wjdz)
imgMsg.value = JSON.parse(res.wjdz)
listQuery.value.jsbmdm = res.jsdxList.filter(item => item.jsbmdm).map(item => item.jsbmdm)
listQuery.value.jsbmmc=res.jsdxList.filter(item => item.jsbmdm).map(item => item.jsbmmc)
listQuery.value.jsbmmc = res.jsdxList.filter(item => item.jsbmdm).map(item => item.jsbmmc)
userList.value = res.jsdxList.filter(item => {
if ( item.jsrsfzh) {
return item
if (item.jsrsfzh) {
return item
}
}).map(item => {
return { idEntityCard: item.jsrsfzh, userName: item.jsrxm }
})
listQuery.value.jsrxm=userList.value.map(item => item.userName).join(',')
listQuery.value.jsrxm = userList.value.map(item => item.userName).join(',')
});
};
const wjList=ref({})
const wjList = ref({})
const changeData = (val) => {
console.log(val);
let wjsize=0
let wjsize = 0
for (let i = 0; i < val.length; i++) {
console.log(val[i].wjdx);
wjsize+= val[i].wjdx
wjsize += val[i].wjdx
}
listQuery.value.wjdx = wjsize
wjList.value.wjdz =val
wjList.value.wjdz = val
};
// 提交
const submit = () => {
@ -158,14 +157,14 @@ const submit = () => {
jsrxm: item.userName,
}
}) : []
console.log(ryList);
console.log(ryList);
const bmList =listQuery.value.jsbmdm&&listQuery.value.jsbmdm.length>0? listQuery.value.jsbmdm.map((item, index) => ({
const bmList = listQuery.value.jsbmdm && listQuery.value.jsbmdm.length > 0 ? listQuery.value.jsbmdm.map((item, index) => ({
jsbmdm: item,
jsbmmc: listQuery.value.jsbmmc[index],
})):[]
})) : []
const list = [...ryList, ...bmList]
let params = { ...listQuery.value, jsdxList: list,...wjList.value,wjdz:JSON.stringify(wjList.value.wjdz) };
let params = { ...listQuery.value, jsdxList: list, ...wjList.value, wjdz: JSON.stringify(wjList.value.wjdz) };
try {
loading.value = true;
let res
@ -174,7 +173,7 @@ const submit = () => {
} else {
res = await putWjZzzAddEntity(params)
}
if (res&&res >0) {
if (res && res > 0) {
loading.value = false;
imgMsg.value = []
proxy.$message({ type: "success", message: title.value + "成功" });

View File

@ -59,6 +59,7 @@ import { useRoute } from 'vue-router'
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { getItem } from '@//utils/storage.js'
import { deleteWjZzzAddEntity, getWjZzzAddEntity } from '@//api/qbcj.js'
import { saveAs } from 'file-saver';
import AddForm from "./components/addForm.vue";
const { proxy } = getCurrentInstance();
const detailDiloag = ref();
@ -180,30 +181,14 @@ const downloadFile = async (item) => {
let successCount = 0;
let failCount = 0;
proxy.$message.info(`开始下载${downloadCount}个文件...`);
// 并行下载所有文件
const downloadPromises = dataList.map(async (fileData, index) => {
try {
// fileData.url = "http://47.108.232.77:9000/image/2025-01-06/081102a5418e4146beea277d18018e07.jpeg";
// 使用fetch获取文件内容
const downloadUrl = fileData.url.replace(/^https?:\/\/[^/]+/, '/zyminio');
const response = await fetch(downloadUrl);
if (!response.ok) throw new Error('文件下载失败');
// 将响应转换为Blob对象
const blob = await response.blob();
// 创建下载链接
const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob);
// 设置下载文件的名称,避免冲突
const fileName = dataList.length > 1 ? `${item.wjmc}_${index + 1}` : item.wjmc;
downloadLink.download = fileName;
// 触发下载
document.body.appendChild(downloadLink);
downloadLink.click();
// 清理
setTimeout(() => {
document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadLink.href);
}, 100);
saveAs(blob, fileName);
successCount++;
} catch (error) {
console.error(`文件${index + 1}下载失败:`, error);
@ -211,10 +196,8 @@ const downloadFile = async (item) => {
}
});
// 等待所有下载完成
await Promise.all(downloadPromises);
// 显示下载结果
if (failCount === 0) {
proxy.$message.success(`成功下载${successCount}个文件`);
} else if (successCount === 0) {

View File

@ -24,6 +24,12 @@
</div>
</div>
</template> -->
<template #scfj>
<div style="width: 100%;padding-left: 50px;">
<div>上传附件:<span class="f12">可附电子表格Word文档图像音视频文件</span> </div>
<MOSTY.Upload :showBtn="true" :isAll="true" :isImg="false" :limit="10" v-model="fjdz" />
</div>
</template>
<template #shzt>
<div v-if="disabled">
<h3 class="tags-title">审核状态</h3>
@ -186,7 +192,7 @@ watch(() => dialogForm.value, (val) => {
formData.value = [
{ label: "情报标题", prop: "qbmc", type: "input", width: '45%' },
{ label: "情报内容", prop: "qbnr", type: "textarea", width: '100%', rows: 100 },
{ label: "附件上传", prop: "fjdz", type: "upload", width: '100%', isImg: false },
{ prop: "scfj", type: "slot", width: '100%' },
{ label: "", prop: "jbxx", type: "slot", width: '100%',},
{ label: "", prop: "shzt", type: "slot", width: '100%' },
]
@ -242,7 +248,14 @@ const getDataById = (id) => {
lcList.value = res.czlcList || []
listQuery.value = res;
listQuery.value.fjdz = res.fjdz ? res.fjdz?.split(",") : []
// 解析附件兼容JSON字符串和逗号分隔两种格式
try {
const parsed = res.fjdz ? JSON.parse(res.fjdz) : []
listQuery.value.fjdz = Array.isArray(parsed) ? parsed : []
} catch (e) {
listQuery.value.fjdz = res.fjdz ? res.fjdz.split(",") : []
}
fjdz.value = listQuery.value.fjdz
});
};
@ -252,11 +265,18 @@ const submitForm = () => {
elform.value.submit(valid => {
if (valid) {
loading.value = true
// 将附件转为JSON字符串
let fjdzList = []
fjdz.value.forEach(item => {
if (Object.prototype.toString.call(item) === '[object Object]') {
fjdzList.push({ id: item.id, name: item.name })
} else {
fjdzList.push({ id: item })
}
})
const promes = {
...listQuery.value,
fjdz: listQuery.value.fjdz && listQuery.value.fjdz.length > 0 ? listQuery.value.fjdz.map(item => {
return item.id
}).join(',') : '',
fjdz: fjdzList.length > 0 ? JSON.stringify(fjdzList) : '',
qbly: 0,
}
if (title.value == '新增') {

View File

@ -1,7 +1,7 @@
<!--文件导出 -->
<template>
<el-dialog :model-value="modelValue" :title="title" :width="width" top="5vh" @close="close" append-to-body>
<div style="height: 70vh;">
<div ref="tableContainer" class="table-container">
<MyTable ref="tableData" :tableData="pageForm.tableData" :tableColumn="pageForm.tableColumn"
:tableHeight="pageForm.tableHeight" :key="pageForm.keyCount" :tableConfiger="pageForm.tableConfiger"
@ -26,7 +26,7 @@
</template>
<script setup>
import * as XLSX from 'xlsx'
import { onMounted, reactive, watch, ref } from 'vue'
import { onMounted, reactive, watch, ref, nextTick, onUnmounted } from 'vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import { template } from 'lodash';
const props = defineProps({
@ -52,12 +52,26 @@ const props = defineProps({
default: () => ([])
}
})
const tableContainer = ref(null)
const tableData = ref(null)
onMounted(() => {
{ { props.dict } }
})
// 计算表格高度
const calcTableHeight = () => {
nextTick(() => {
if (tableContainer.value) {
pageForm.tableHeight = tableContainer.value.offsetHeight - 20
}
})
}
watch(() => props.modelValue, (newVal, oldVal) => {
if(newVal){
pageForm.tableData = props.dataModel
calcTableHeight()
}
})
const emit = defineEmits(['update:modelValue'])
@ -94,7 +108,6 @@ watch(() => props.modelValue, (newVal) => {
const close = () => {
emit('update:modelValue', false)
}
const tableData = ref(null)
// 导出当前表格的数据
const exportCurrentTable = () => {
try {
@ -157,3 +170,9 @@ const exportCurrentTable = () => {
}
}
</script>
<style lang="scss" scoped>
.table-container {
height: 70vh;
overflow: hidden;
}
</style>

View File

@ -0,0 +1,599 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<el-button type="primary" @click="addEdit('add')" size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
<span class="vertical-middle">新增</span>
</el-button>
<el-button type="primary" @click="exportFileModel = true;" size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
<span class="vertical-middle">导出</span>
</el-button>
<el-button type="primary" :disabled="ids.length === 0" @click="handleSumbit(ids)" v-if="qxkz.deptLevel != '01'"
size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
<span class="vertical-middle">上报</span>
</el-button>
<el-button type="primary" :disabled="ids.length === 0" @click="provDepar(ids)" v-if="qxkz.deptLevel == '01'"
size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
<span class="vertical-middle">上报区厅</span>
</el-button>
<el-button type="primary" :disabled="ids.length === 0" @click="delDictItem(ids)" size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
<span class="vertical-middle">删除</span>
</el-button>
<!-- <el-button type="primary" size="small" @click="handleReport">
<el-icon class="vertical-middle"><Edit /></el-icon>
<span class="vertical-middle">情报信息报告</span>
</el-button> -->
</Searchs>
</div>
<!-- 表格 -->
<div class="margTop">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData" @handleCellClick="openXxqk">
<template #qblx="{ row }">
<DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
</template>
<template #qbly="{ row }">
<DictTag :tag="false" :value="row.qbly" :options="D_BZ_CJLX" />
</template>
<template #czzt="{ row }">
<DictTag :tag="false" :value="row.czzt" :options="D_BZ_QBCZZT" />
</template>
<template #lczt="{ row }">
<DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" />
</template>
<template #glbqList="{ row }">
<div>
<el-tag v-for="(item, idx) in row.glbqList" :key="idx">{{ item.bqmc }}</el-tag>
</div>
</template>
<template #cyqk="{ row }">
<el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)"
:disabled="butcontroll('04', row.lczt)">采纳</el-link>
<!-- 只有上报状态才能回退 -->
<el-link v-if="isShowBtn('回退')" size="small" type="danger" @click="rollbackNewspapers(row)"
:disabled="butcontroll('04', row.lczt)">回退</el-link>
</template>
<!-- 所有按钮采纳前不能操作回退后也不能操作 -->
<!-- 操作 -->
<!-- "市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门", "送审"], -->
<!-- "县情指人员": ["上报", "回退", "修改", "详情", "送审"], -->
<template #controls="{ row }">
<el-link @click="handleSbqt(row)" size="small" type="primary" v-if="qxkz.deptLevel == '01'"
:disabled="row.lczt == '10'">上报区厅</el-link>
<el-link v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01' && row.lczt == '04'"
:disabled="!(row.lczt == '04') || row.sldshzt != '00'" size="small" type="primary"
@click="postXxcjXxcjTjsh(row)">送审</el-link>
<!-- <el-link
v-if="isShowBtn('送审', row) && qxkz.deptLevel == '02'"
:disabled="row.xldshzt != '00' "
size="small" type="primary"
@click="postXxcjXxcjTjsh(row)">
送审
</el-link> -->
<!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" -->
<el-link v-if="isShowBtn('上报') && qxkz.deptLevel == '03'" size="small" type="primary"
@click="appearNewspapers(row)" :disabled="row.lczt != '01'">上报</el-link>
<el-link v-else-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)"
:disabled="!(row.lczt == '02')">上报</el-link>
<!-- && row.lczt != '02' -->
<el-link v-if="isShowBtn('分组') && (row.lczt == '04' || row.lczt == '08' || row.lczt == '10')" size="small"
type="primary" @click="opneMsg(row)">分组</el-link>
<!-- 只有领导有肯定 -->
<!-- <el-link v-if="isShowBtn('肯定')" size="small" type="primary" @click="affirm(row)">肯定</el-link> -->
<el-link v-if="isShowBtn('删除')" size="small" type="primary" @clic.stopk="delDictItem(row.id)">删除</el-link>
<el-link v-if="isShowBtn('修改', row)" size="small" type="primary" @click="addEdit('edit', row)">修改</el-link>
<el-link v-if="isShowBtn('续报', row) && row.lczt == '04'" size="small" type="primary"
@click="addEdit('followUpReport', row)">续报</el-link>
<el-link v-if="isShowBtn('详情')" size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<!-- 所有状态都能进行转线索 -->
<el-link v-if="isShowBtn('转线索') && (row.lczt == '04' || row.lczt == '06')" size="small" type="primary"
@click="FollowUpOnLeads(row)" :disabled="row.lczt == '08'">转线索</el-link>
<!-- 所有状态都能进行转合成 -->
<!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" :disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
<!-- 所有状态都能进行转会商 -->
<!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" :disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
<el-link v-if="isShowBtn('关注部门') && row.qbjb == '01' && row.lczt == '04'" :disabled="row.sldshzt != '02'"
size="small" type="primary" @click="FollowUpOnDept(row)">定向关注</el-link>
<!-- 市局能给所有数据创建标签 -->
<el-link
v-if="isShowBtn('打标签') && (row.lczt == '04' || row.lczt == '06' || row.lczt == '07' || row.lczt == '08' || row.lczt == '09' || row.lczt == '10') && qxkz.deptLevel == '01'"
size="small" type="primary" @click="openCustomTag(row)" :disabled="row.sldshzt != '02'">打标签</el-link>
<el-link size="small" type="primary" @click="handleAttention(row)">{{ row.sfgz == '1'
? '取消关注' : '关注' }}</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 新增 -->
<AddForm ref="detailDiloag" @getList="getList" :titleData="titleData" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" />
</div>
<ExportFile v-model="exportFileModel" :tableColumn="tableColumn" :dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
:dataModel="pageData.tableData" />
<MakeTag v-model="chooseRow" :dataList="dataList" :dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }"
@getList="getList" />
<Fszl v-model="fszlShow" path="/xxcj/sendFqzl" :itemData="dataList" />
<CustomTag v-model="customTagShow" :dataList="dataList" @getList="getList" :dict="{ D_XXCJ_BQLX }" />
<Configuration v-model="configurationShow" :dataList="dataList" @getList="getList" />
<!-- 转会商 -->
<transferMerchant v-if="isShowTransferMerchantTc" :row="currRow" title="转会商" @close="isShowTransferMerchantTc = false"
@ok="getList" />
<!-- 情报信息报告 -->
<InforReport v-if="inforReportShow" v-model="inforReportShow" :data="tableList" />
</template>
<script setup>
import InforReport from './components/inforReport.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import { useRouter, useRoute } from 'vue-router'
import { qbcjSelectQbsbPage, qbcjDeletes, qbcjCzzt, qbcjPlsb } from "@/api/Intelligence.js";
import { xxcjSelectXxsbPage, xxcjDeletes, xxcjXxzsx, xxcjUpdateCzlc, xxcjXxqd, xxcjXxcjTjsh, xxcjCare, xxcjReportGat, xxcjPlsb } from '@/api/xxcj.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import MakeTag from '../components/maketag.vue'
import ExportFile from './components/exportFile.vue'
import { ElMessageBox } from 'element-plus'
import Fszl from '@/views/backOfficeSystem/HumanIntelligence/components/fszl.vue'
import CustomTag from '../components/customTag.vue'
import Configuration from '../components/configuration.vue'
import transferMerchant from "./components/transferMerchant.vue";
import { Edit } from "@element-plus/icons";
import { useInfoCollectionPermission, FlowStatus } from './useInfoCollectionPermission.ts'
const { proxy } = getCurrentInstance();
const { D_BZ_SF, D_GS_XS_LY, /* D_BZ_SSSHZT, */ D_GS_XS_LX, D_BZ_BQJB, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT, D_XXCJ_BQLX } = proxy.$dict("D_BZ_SF", "D_GS_XS_LY" /*, 'D_BZ_SSSHZT' */, "D_GS_XS_LX", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据
const route = useRoute()
const titleData = ref()
const exportFileModel = ref(false)
// 使用权限管理模块
const permission = useInfoCollectionPermission()
const { state: qxkz, isCityLevel, canShowBtn, butcontroll, canSubmitAudit, canReport, canTag, canFollowDept, canTransferClue, canFollowUpReport } = permission
const fszlShow = ref(false)// 发送指令
const detailDiloag = ref();
const inforReportShow = ref(false) //情报信息报告
const customTagShow = ref(false)// 打标签
const configurationShow = ref(false)// 配置关注部门
const searchBox = ref(); //搜索框
const ids = ref([])
const tableList = ref([]);
const currRow = ref({})
const isShowTransferMerchantTc = ref(false)
const isShow = ref(false)
const searchConfiger = ref([
{ label: "录入人", prop: 'xssbr', placeholder: "请输入录入人", showType: "input" },
{ label: "录入单位", prop: "ssbmdm", placeholder: "请选择录入单位", showType: "department" },
{ label: "编号", prop: 'xsBh', placeholder: "请输入编号", showType: "input" },
{ label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" },
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
{ label: "标签内容", prop: 'bqdmList', placeholder: "请选择标签内容", showType: "select", options: D_XXCJ_BQLX, multiple: true },
{ label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select", options: D_BZ_BQJB },
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
{ label: "是否上报区厅", prop: 'sfsbqt', placeholder: "请选择是否上报区厅", showType: "select", options: D_BZ_SF },
{ label: "是否关注", prop: 'sfgz', placeholder: "请选择是否关注", showType: "select", options: D_BZ_SF },
]);
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 300,
tableColumn: [
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true },
{ label: "上报人", prop: "xssbr" },
{ label: "上报单位", prop: "ssbm" },
{ label: "流程状态", prop: "lczt", showSolt: true },
{ label: "采用情况", prop: "cyqk", showSolt: true },
{ label: "关联标签", prop: "glbqList", showSolt: true },
]
});
// 导出数据
const tableColumn = reactive([
{ label: "上报人姓名", prop: "xssbr" },
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true, zd: 'D_BZ_CJLX' },
])
const queryFrom = ref({});
const chooseRow = ref(false)
const dataList = ref()
const chooseData = (val) => {
ids.value = val.map(item => item.id)
tableList.value = val
}
// 采纳
const cnMsg = (item) => {
proxy.$confirm("确定要采纳", "警告", { type: "warning" }).then(() => {
xxcjUpdateCzlc({ id: item.id, lczt: '04' }).then(res => {
proxy.$message({ type: "success", message: "采纳成功" });
getList();
})
}).catch(() => { });
}
const handleReport = () => {
if (tableList.value.length == 0) return proxy.$message({ type: "warning", message: "请选择情报信息" });
inforReportShow.value = true
}
// 关注
const handleAttention = (val) => {
let data = { id: val.id, sfgz: val.sfgz == '1' ? '0' : '1' }
xxcjCare(data).then(res => {
let text = data.sfgz == '1' ? '关注成功' : '已取消'
proxy.$message({ type: "success", message: text });
getList();
}).catch(() => {
let text = data.sfgz == '1' ? '关注失败' : '取消失败'
proxy.$message({ type: "error", message: text });
})
}
// 回退
const rollbackNewspapers = (item) => {
// if (item.lczt == '04') {
// proxy.$message({
// message: '已经采纳的信息无法回退',
// type: 'warning',
// showClose: true,
// })
// return
// }
// if (item.lczt == '03') {
// proxy.$message({
// message: '无法回退市局上报信息',
// type: 'warning',
// showClose: true,
// })
// return
// }
if (item.qbjb == '00') {
ElMessageBox.prompt('请输入回退原因', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
})
.then(({ value }) => {
xxcjUpdateCzlc({ id: item.id, lczt: '05', czthyy: value }).then(res => {
proxy.$message({ type: "success", message: "回退成功" });
getList();
})
})
.catch(() => {
})
} else {
proxy.$message({
message: '只能回退已上报的情报',
type: 'warning',
showClose: true,
})
}
}
// 上报
const appearNewspapers = (item) => {
console.log(item);
if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') {
proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
let promes = { id: item.id }
promes.lczt = qxkz.deptLevel == '02' ? '03' : '02';
xxcjUpdateCzlc(promes).then(res => {
proxy.$message({ type: "success", message: "上报成功" });
getList();
})
}).catch(() => { });
} else {
proxy.$message({ type: "warning", message: "市局无法进行上报" });
}
}
// 分组
const opneMsg = (item) => {
chooseRow.value = true
dataList.value = [item]
}
const openCustomTag = (item) => {
if (qxkz.depBool) {
customTagShow.value = true
dataList.value = item
} else {
proxy.$message.warning('暂无权限')
}
}
// 肯定
const affirm = (item) => {
proxy.$confirm("确定要肯定吗?", "警告", { type: "warning" }).then(() => {
xxcjXxqd({ ids: item.id }).then(res => {
proxy.$message({ type: "success", message: "肯定成功" });
getList();
})
})
}
const FollowUpOnDept = (item) => {
if (qxkz.depBool) {
configurationShow.value = true
dataList.value = item
} else {
proxy.$message.warning('暂无权限')
}
}
// 批量分组
// const batchMark = () => {
// const listDb = tableList.value.filter(item => item.lczt != '04')
// if (listDb.length == 0) {
// chooseRow.value = true
// dataList.value = tableList.value
// } else {
// proxy.$message({
// message: '还有情报未采纳',
// type: 'warning',
// showClose: true,
// })
// }
// }
const handleSumbit = () => {
const listDb = tableList.value.filter(item => item.czzt != '01' && item.czzt != '04')
if (listDb.length == 0) {
proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
const lczt = qxkz.deptLevel == '02' ? '03' : '02';
xxcjPlsb({ ids: ids.value, lczt: lczt }).then(res => {
proxy.$message({ type: "success", message: "上报成功" });
getList();
})
}).catch(() => { });
} else {
proxy.$message({ message: '请选择正确数据', type: 'warning', showClose: true })
}
}
// 上报区厅
const provDepar = () => {
const listDb = tableList.value.filter(item => item.czzt != '10').map(item => item.id)
if (listDb.length > 0) {
proxy.$confirm("确定要上报区厅吗", "提示", { type: "warning" }).then(() => {
xxcjReportGat({ ids: listDb }).then(res => {
proxy.$message({ type: "success", message: "上报区厅成功" });
getList();
})
}).catch(() => { })
// proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
// xxcjPlsb({ ids: ids.value, lczt: "10" }).then(res => {
// proxy.$message({ type: "success", message: "上报成功" });
// getList();
// })
// }).catch(() => { });
} else {
proxy.$message({ message: '请选择正确数据', type: 'warning', showClose: true })
}
}
// 按钮状态控制已迁移至 useInfoCollectionPermission
// 搜索
const onSearch = (val) => {
const promes = {
...pageData.pageConfiger,
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.endTime ? val.endTime[1] : '',
bqdmList: val.bqdmList ? val.bqdmList.join(',') : ""
}
queryFrom.value = { ...promes }
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value };
xxcjSelectXxsbPage(data).then(res => {
pageData.tableData = (res.records || []).map(item => {
item.glbqList = item.glbqList || [];
return item;
});
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => { pageData.tableConfiger.loading = false; })
}
// 删除
const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
xxcjDeletes({ ids: Array.isArray(id) ? id : [id] }).then((res) => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
}).catch(() => {
})
}).catch(() => { });
}
// 详情
const addEdit = (type, row) => {
isShow.value = true;
setTimeout(() => {
detailDiloag.value.init(type, row);
}, 500)
};
const openXxqk = (row) => {
if (row.column.property == 'qbmc' || row.column.property == 'xsBh') {
isShow.value = true;
setTimeout(() => {
detailDiloag.value.init('info', row.row);
}, 500)
}
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
};
// 转线索
const FollowUpOnLeads = (row) => {
if (!qxkz.depBool) return proxy.$message({ message: '权限不足', type: 'warning', showClose: true, })
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
proxy.$message({ type: "success", message: "转线索成功" });
getList();
})
})
}
const openFkDialogszl = (row) => {
if (!qxkz.depBool) {
proxy.$message({
message: '权限不足',
type: 'warning',
showClose: true,
})
return
} else {
fszlShow.value = true
dataList.value = row
}
}
// 权限相关函数已迁移至 useInfoCollectionPermission
const handleTransferMerchant = (row) => {
currRow.value = row
isShowTransferMerchantTc.value = true
}
// 送审
const postXxcjXxcjTjsh = (row) => {
proxy.$confirm("确定要送审吗", "提示", { type: "warning" }).then(() => {
xxcjXxcjTjsh({ xxid: row.id }).then(res => {
proxy.$message({ type: "success", message: "送审成功" });
getList();
})
}).catch(() => { })
}
// 上报区厅
const handleSbqt = (row) => {
proxy.$confirm("确定要上报区厅吗", "提示", { type: "warning" }).then(() => {
xxcjReportGat({ ids: [row.id] }).then(res => {
proxy.$message({ type: "success", message: "上报区厅成功" });
getList();
})
}).catch(() => { })
}
onMounted(() => {
// 初始化权限
permission.initPermission()
titleData.value = route.meta.title
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', { id: route.query.id });
}
getList()
});
</script>
<style lang="scss" scoped>
.label-pop {
position: relative;
&::before {
position: absolute;
content: '*';
top: 0;
left: -7px;
color: red;
}
}
</style>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
:v-deep .el-dialog {
width: 90% !important;
}
.zdy-model-dialogs {
/* background-color: rgb(50, 148, 214); */
background: url("~@/assets/images/bg46.png") no-repeat center center;
background-size: 100% 100%;
padding: 8px 10px;
box-sizing: border-box;
pointer-events: auto !important;
height: calc(100% - 50px);
overflow: auto;
}
.vertical-middle {
vertical-align: middle;
}
</style>

View File

@ -15,15 +15,14 @@
</el-icon>
<span class="vertical-middle">导出</span>
</el-button>
<el-button type="primary" :disabled="ids.length === 0" @click="handleSumbit(ids)" v-if="qxkz.deptLevel != '01'"
<el-button type="primary" :disabled="ids.length === 0" @click="handleSumbit(ids)" v-if="!isCityLevel"
size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
<span class="vertical-middle">上报</span>
</el-button>
<el-button type="primary" :disabled="ids.length === 0" @click="provDepar(ids)" v-if="qxkz.deptLevel == '01'"
size="small">
<el-button type="primary" :disabled="ids.length === 0" @click="provDepar(ids)" v-if="isCityLevel" size="small">
<el-icon class="vertical-middle">
<CirclePlus />
</el-icon>
@ -50,8 +49,8 @@
<template #qblx="{ row }">
<DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
</template>
<template #qbly="{ row }">
<DictTag :tag="false" :value="row.qbly" :options="D_BZ_CJLX" />
<template #qbjb="{ row }">
<DictTag :tag="false" :value="row.qbjb" :options="D_BZ_BQJB" />
</template>
<template #czzt="{ row }">
<DictTag :tag="false" :value="row.czzt" :options="D_BZ_QBCZZT" />
@ -65,60 +64,40 @@
</div>
</template>
<template #cyqk="{ row }">
<el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)"
:disabled="butcontroll('04', row.lczt)">采纳</el-link>
<!-- 只有上报状态才能回退 -->
<el-link v-if="isShowBtn('回退')" size="small" type="danger" @click="rollbackNewspapers(row)"
:disabled="butcontroll('04', row.lczt)">回退</el-link>
<template v-if="isCityLevel">
<el-link v-if="row.clhtzt == '0' || row.clhtzt == '1'" size="small" type="danger" @click="cnMsg(row)"
:disabled="row.clhtzt == '1'">{{ row.clhtzt == '1' ? "已采纳" : "采纳" }}</el-link>
<el-link v-if="row.clhtzt == '0' || row.clhtzt == '2'" size="small" type="danger"
@click="rollbackNewspapers(row)" :disabled="row.clhtzt == '2'">{{ row.clhtzt == '2' ? "已回退" : "回退"
}}</el-link>
</template>
</template>
<!-- 所有按钮采纳前不能操作回退后也不能操作 -->
<!-- 操作 -->
<!-- "市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门", "送审"], -->
<!-- "县情指人员": ["上报", "回退", "修改", "详情", "送审"], -->
<template #controls="{ row }">
<el-link @click="handleSbqt(row)" size="small" type="primary" v-if="qxkz.deptLevel == '01'"
:disabled="row.lczt == '10'">上报区厅</el-link>
<el-link v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01' && row.lczt == '04'"
:disabled="!(row.lczt == '04') || row.sldshzt != '00'" size="small" type="primary"
@click="postXxcjXxcjTjsh(row)">送审</el-link>
<el-link @click="handleSbqt(row)" size="small" type="primary" v-if="isShiQzRole && row.sfsbqt == '0'"
:disabled="row.sfsbqt != '0'">上报区厅</el-link>
<el-link v-if="canShowBtn('送审', row) && isCityLevel && row.lczt == '04'" :disabled="row.sldshzt != '00'"
size="small" type="primary" @click="postXxcjXxcjTjsh(row)">送审</el-link>
<!-- <el-link
v-if="isShowBtn('送审', row) && qxkz.deptLevel == '02'"
:disabled="row.xldshzt != '00' "
size="small" type="primary"
@click="postXxcjXxcjTjsh(row)">
送审
</el-link> -->
<el-link v-if="canShowBtn('上报') && !isCityLevel" size="small" type="primary" @click="appearNewspapers(row)"
:disabled="!canReport(row)">上报</el-link>
<!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" -->
<el-link v-if="isShowBtn('上报') && qxkz.deptLevel == '03'" size="small" type="primary"
@click="appearNewspapers(row)" :disabled="row.lczt != '01'">上报</el-link>
<el-link v-else-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)"
:disabled="!(row.lczt == '02')">上报</el-link>
<!-- && row.lczt != '02' -->
<el-link v-if="isShowBtn('分组') && (row.lczt == '04' || row.lczt == '08' || row.lczt == '10')" size="small"
type="primary" @click="opneMsg(row)">分组</el-link>
<!-- 只有领导有肯定 -->
<!-- <el-link v-if="isShowBtn('肯定')" size="small" type="primary" @click="affirm(row)">肯定</el-link> -->
<el-link v-if="isShowBtn('删除')" size="small" type="primary" @clic.stopk="delDictItem(row.id)">删除</el-link>
<el-link v-if="isShowBtn('修改', row)" size="small" type="primary" @click="addEdit('edit', row)">修改</el-link>
<el-link v-if="isShowBtn('续报', row) && row.lczt == '04'" size="small" type="primary"
<el-link v-if="canShowBtn('分组') && canGroup(row)" size="small" type="primary"
@click="opneMsg(row)">分组</el-link>
<el-link v-if="canShowBtn('删除')" size="small" type="primary" @click.stop="delDictItem(row.id)">删除</el-link>
<el-link v-if="canShowBtn('修改', row)" size="small" type="primary" @click="addEdit('edit', row)">修改</el-link>
<el-link v-if="canShowBtn('续报', row) && canFollowUpReport(row)" size="small" type="primary"
@click="addEdit('followUpReport', row)">续报</el-link>
<el-link v-if="isShowBtn('详情')" size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<!-- 所有状态都能进行转线索 -->
<el-link v-if="isShowBtn('转线索') && (row.lczt == '04' || row.lczt == '06')" size="small" type="primary"
@click="FollowUpOnLeads(row)" :disabled="row.lczt == '08'">转线索</el-link>
<!-- 所有状态都能进行转合成 -->
<!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" :disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
<!-- 所有状态都能进行转会商 -->
<!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" :disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
<el-link v-if="canShowBtn('详情')" size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<el-link v-if="isShowBtn('关注部门') && row.qbjb == '01' && row.lczt == '04'" :disabled="row.sldshzt != '02'"
size="small" type="primary" @click="FollowUpOnDept(row)">定向关注</el-link>
<!-- 市局能给所有数据创建标签 -->
<el-link v-if="isShowBtn('打标签') && (row.lczt == '04' || row.lczt == '06' || row.lczt == '08')" size="small"
type="primary" @click="openCustomTag(row)" :disabled="row.sldshzt != '02'">打标签</el-link>
<el-link v-if="isShiQzRole && row.sfzxs == '0'" size="small" type="primary" @click="FollowUpOnLeads(row)"
:disabled="row.sfzxs != '0'">转线索</el-link>
<el-link v-if="isShiQzRole" size="small" type="primary" @click="FollowUpOnDept(row)">@</el-link>
<el-link v-if="canShowBtn('打标签') && canTag(row)" size="small" type="primary"
@click="openCustomTag(row)">打标签</el-link>
<el-link size="small" type="primary" @click="handleAttention(row)">{{ row.sfgz == '1'
? '取消关注' : '关注' }}</el-link>
</template>
@ -166,23 +145,23 @@ import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import MakeTag from '../components/maketag.vue'
import ExportFile from './components/exportFile.vue'
import { ElMessageBox } from 'element-plus'
import { getItem } from '@//utils/storage.js'
import Fszl from '@/views/backOfficeSystem/HumanIntelligence/components/fszl.vue'
import CustomTag from '../components/customTag.vue'
import Configuration from '../components/configuration.vue'
import transferMerchant from "./components/transferMerchant.vue";
import { Edit } from "@element-plus/icons";
import { useInfoCollectionPermission } from './useInfoCollectionPermission.js'
const { proxy } = getCurrentInstance();
const { D_BZ_SF, D_GS_XS_LY, D_BZ_SSSHZT, D_GS_XS_LX, D_BZ_BQJB, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT, D_XXCJ_BQLX } = proxy.$dict("D_BZ_SF", "D_GS_XS_LY", 'D_BZ_SSSHZT', "D_GS_XS_LX", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据
const { D_BZ_SF, D_GS_XS_LY, /* D_BZ_SSSHZT, */ D_GS_XS_LX, D_BZ_BQJB, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT, D_XXCJ_BQLX } = proxy.$dict("D_BZ_SF", "D_GS_XS_LY" /*, 'D_BZ_SSSHZT' */, "D_GS_XS_LX", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据
const route = useRoute()
const titleData = ref()
const exportFileModel = ref(false)
const qxkz = reactive({
deptBizType: '',
deptLevel: '',
roleCode: false,
depBool: false
});
// 使用权限管理模块
const permission = useInfoCollectionPermission()
const { state: qxkz, isCityLevel, isShiQzRole, canShowBtn, butcontroll, canReport, canTag, canFollowDept, canTransferClue, canGroup, canFollowUpReport, isPostAdopt } = permission
const fszlShow = ref(false)// 发送指令
const detailDiloag = ref();
const inforReportShow = ref(false) //情报信息报告
@ -225,7 +204,7 @@ const pageData = reactive({
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true },
{ label: "分组状态", prop: "qbjb", showSolt: true },
{ label: "上报人", prop: "xssbr" },
{ label: "上报单位", prop: "ssbm" },
{ label: "流程状态", prop: "lczt", showSolt: true },
@ -423,22 +402,7 @@ const provDepar = () => {
proxy.$message({ message: '请选择正确数据', type: 'warning', showClose: true })
}
}
// <!-- [04、06、07、08、09] -->打标签
// <!-- [03、05] -->采纳
// <!-- [04] -->回退
// <!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" -->
const butcontroll = (val, zt) => {
switch (val) {
case '01':
return !(['04', '06', '07', '08', '09'].includes(zt))
case '02':
return !(['03', '05'].includes(zt))
case '03':
return !(['02', '03', '04'].includes(zt))
case '04':
return (['04', '05', '06', '07', '08', '09'].includes(zt))
}
}
// 按钮状态控制已迁移至 useInfoCollectionPermission
// 搜索
const onSearch = (val) => {
@ -446,7 +410,7 @@ const onSearch = (val) => {
...pageData.pageConfiger,
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.endTime ? val.endTime[1] : '',
endTime: val.startTime ? val.startTime[1] : '',
bqdmList: val.bqdmList ? val.bqdmList.join(',') : ""
}
queryFrom.value = { ...promes }
@ -535,42 +499,7 @@ const openFkDialogszl = (row) => {
}
}
/** 获取当前角色 */
function getRole() {
const { deptBizType, deptLevel } = getItem('deptId')[0]
/** 是否是市情指领导 */
const isShiQzLeader = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
if (isShiQzLeader) return '市情指领导'
/** 是否是市情指人员 */
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) return '市情指挥人员'
/** 是否是县情指人员 */
const isXianQz = getItem('roleList').find(item => item.roleCode == 'JS_888888') != undefined
if (isXianQz) return '县情指人员'
return '部门'
}
/** 是否展示按钮 */
const isShowBtn = (btnName, row = {}) => {
/** @type {String} 流程状态01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 08 转线索) */
const lczt = row.lczt
/** 按钮权限 */
const buttonPermissions = {
"市情指领导": ["肯定", "采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门"],
"市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门", "送审"],
"县情指人员": ["上报", "回退", "修改", "详情", "送审"],
"部门": ["上报", "新增", "修改", "续报", "详情"]
};
const role = getRole(); // 角色
const isHadAuth = buttonPermissions[role]?.includes(btnName) // 当前角色所有会显示的按钮
if (!isHadAuth) return false
// 拦截部分逻辑
if (role === '部门') {
if (btnName === '续报') return lczt != '01'
if (btnName === '修改') return lczt == '01'
}
return true
}
// 权限相关函数已迁移至 useInfoCollectionPermission
const handleTransferMerchant = (row) => {
currRow.value = row
isShowTransferMerchantTc.value = true
@ -596,18 +525,8 @@ const handleSbqt = (row) => {
}
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.roleCode = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
if (deptBizType == '23' && Jb == '01') {
qxkz.depBool = true
} else {
qxkz.depBool = false
}
console.log(qxkz, '=======qxkz');
// 初始化权限
permission.initPermission()
titleData.value = route.meta.title
tabHeightFn()

View File

@ -0,0 +1,261 @@
import { reactive, computed } from 'vue'
import { getItem } from '@//utils/storage.js'
/** 流程状态常量 */
export const FlowStatus = {
SUBMIT: '01', // 提交
REPORT_COUNTY: '02', // 上报县局
REPORT_CITY: '03', // 上报市局
ADOPT: '04', // 采纳
ROLLBACK: '05', // 退回
TAG: '06', // 打标签
TRANSFER_SYNTHESIS: '07', // 转合成
TRANSFER_CLUE: '08', // 转线索
TRANSFER_MERCHANT: '09', // 转会商
REPORT_PROVINCE: '10' // 上报区厅
}
/** 按钮权限配置 */
const BUTTON_PERMISSIONS = {
'市情指领导': ['肯定', '采纳', '回退', '分组', '转线索', '转合成', '转会商', '打标签', '修改', '详情', '关注部门'],
'市情指挥人员': ['采纳', '回退', '分组', '转线索', '转合成', '转会商', '打标签', '修改', '详情', '关注部门', '送审'],
'县情指人员': ['上报', '回退', '修改', '详情', '送审'],
'部门': ['上报', '新增', '修改', '续报', '详情']
}
/** 部门级别映射 */
const DEPT_LEVEL_MAP = {
'2': '01', // 市局
'3': '02', // 县局
}
/** 角色代码映射 */
const ROLE_CODE_MAP = {
'JS_666666': '市情指领导',
'JS_777777': '市情指挥人员',
'JS_888888': '县情指人员',
}
/** 采纳后的状态排除回退05 */
const POST_ADOPT_STATUS = [FlowStatus.ADOPT, FlowStatus.TAG, FlowStatus.TRANSFER_SYNTHESIS, FlowStatus.TRANSFER_CLUE, FlowStatus.TRANSFER_MERCHANT, FlowStatus.REPORT_PROVINCE]
/** 按钮可操作的状态配置 */
const BTN_STATUS_RULES = {
// 转合成/转会商 - 需要已采纳
synthesis: [FlowStatus.ADOPT, FlowStatus.TAG, FlowStatus.TRANSFER_SYNTHESIS, FlowStatus.TRANSFER_CLUE, FlowStatus.TRANSFER_MERCHANT],
// 采纳 - 需要上报状态
adopt: [FlowStatus.REPORT_CITY, FlowStatus.ROLLBACK],
// 回退 - 需要上报状态
rollback: [FlowStatus.ADOPT, FlowStatus.ROLLBACK, FlowStatus.TAG, FlowStatus.TRANSFER_SYNTHESIS, FlowStatus.TRANSFER_CLUE, FlowStatus.TRANSFER_MERCHANT],
// 分组 - 需要已采纳或已转
group: [FlowStatus.ADOPT, FlowStatus.TRANSFER_CLUE, FlowStatus.REPORT_PROVINCE],
}
/**
* 情报信息采集权限管理 Composable
*/
export function useInfoCollectionPermission() {
/** 权限状态 */
const state = reactive({
deptBizType: '',
deptLevel: '',
roleCode: false,
depBool: false
})
/** 当前角色 */
const currentRole = computed(() => getRole())
/** 是否为市局 */
const isCityLevel = computed(() => state.deptLevel === '01')
/** 是否为县局 */
const isCountyLevel = computed(() => state.deptLevel === '02')
/** 是否有市情指操作权限JS_666666 或 JS_777777 */
const isShiQzRole = computed(() => {
const roleList = getItem('roleList') || []
return roleList.some(item => item.roleCode === 'JS_666666' || item.roleCode === 'JS_777777')
})
/** 获取当前角色 */
function getRole() {
const roleList = getItem('roleList') || []
for (const role of roleList) {
if (ROLE_CODE_MAP[role.roleCode]) {
return ROLE_CODE_MAP[role.roleCode]
}
}
return '部门'
}
/** 初始化权限 */
function initPermission() {
const deptInfo = getItem('deptId')?.[0]
if (!deptInfo) return
const { deptBizType, deptLevel } = deptInfo
const levelCode = deptLevel?.[0]
// 计算部门级别
state.deptLevel = DEPT_LEVEL_MAP[levelCode] || levelCode
state.deptBizType = deptBizType
// 是否为市情指领导
state.roleCode = getItem('roleList')?.some(item => item.roleCode === 'JS_666666') ?? false
// 是否有市情指操作权限
state.depBool = deptBizType === '23' && state.deptLevel === '01'
}
/**
* 判断按钮是否显示
* @param {string} btnName 按钮名称
* @param {object} row 行数据(可选)
* @returns {boolean}
*/
function canShowBtn(btnName, row = {}) {
const role = currentRole.value
const permissions = BUTTON_PERMISSIONS[role] || []
if (!permissions.includes(btnName)) return false
// 部门角色特殊逻辑
if (role === '部门') {
const lczt = row?.lczt
if (btnName === '续报') return lczt !== FlowStatus.SUBMIT
if (btnName === '修改') return lczt === FlowStatus.SUBMIT
}
return true
}
/**
* 判断按钮是否禁用
* @param {string} btnType 按钮类型
* @param {string} lczt 流程状态
* @returns {boolean}
*/
function isBtnDisabled(btnType, lczt) {
const allowedStatus = BTN_STATUS_RULES[btnType]
return !allowedStatus?.includes(lczt)
}
/**
* 判断单个按钮是否禁用(兼容旧逻辑)
* @param {string} val 类型代码
* @param {string} zt 流程状态
* @returns {boolean}
*/
function butcontroll(val, zt) {
switch (val) {
case '01': // 转合成/转会商
return !BTN_STATUS_RULES.synthesis.includes(zt)
case '02': // 采纳
return !BTN_STATUS_RULES.adopt.includes(zt)
case '03': // 提交
return ![FlowStatus.REPORT_COUNTY, FlowStatus.REPORT_CITY, FlowStatus.ADOPT].includes(zt)
case '04': // 采纳 - 只有01,02,03状态才不禁用
return !['01', '02', '03'].includes(zt)
default:
return false
}
}
/**
* 判断送审按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canSubmitAudit(row) {
return isCityLevel.value && row.lczt === FlowStatus.ADOPT && row.sldshzt === '00'
}
/**
* 判断上报按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canReport(row) {
if (isCityLevel.value) {
return row.lczt === FlowStatus.SUBMIT
}
return row.lczt === FlowStatus.REPORT_COUNTY
}
/**
* 判断是否为采纳后状态(排除回退)
* @param {string} lczt 流程状态
* @returns {boolean}
*/
function isPostAdopt(lczt) {
return POST_ADOPT_STATUS.includes(lczt)
}
/**
* 判断打标签按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canTag(row) {
return isPostAdopt(row.lczt) && isCityLevel.value
}
/**
* 判断关注部门按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canFollowDept(row) {
return row.qbjb === '01' && isPostAdopt(row.lczt)
}
/**
* 判断转线索按钮状态 - 采纳后可转,转过则不再显示
* @param {object} row 行数据
* @returns {boolean}
*/
function canTransferClue(row) {
// 只允许从采纳状态直接转线索,转过则不再显示
return row.lczt === FlowStatus.ADOPT
}
/**
* 判断分组按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canGroup(row) {
return isPostAdopt(row.lczt)
}
/**
* 判断续报按钮状态
* @param {object} row 行数据
* @returns {boolean}
*/
function canFollowUpReport(row) {
return row.lczt === FlowStatus.ADOPT
}
return {
state,
currentRole,
isCityLevel,
isCountyLevel,
isShiQzRole,
initPermission,
canShowBtn,
isBtnDisabled,
butcontroll,
canSubmitAudit,
canReport,
canTag,
canFollowDept,
canTransferClue,
canGroup,
canFollowUpReport,
isPostAdopt,
}
}

View File

@ -94,8 +94,9 @@ const formData = ref([
{ label: "线索地点", prop: "zxdz", type: "input" },
{ label: "所属专题", prop: "sszt", type: "select", options: props.dic.D_BZ_SSZT },
{ prop: "gapline", type: "slot", width: '100%' },
{ prop: "scfj", type: "slot", width: '100%' },
{ label: "线索内容", prop: "qbnr", type: "textarea", width: '100%' },
{ prop: "scfj", type: "slot", width: '100%' },
]);
const fjdz = ref()
const listQuery = ref({}); //表单

View File

@ -49,7 +49,7 @@
</div>
<!-- 新增 -->
<AddForm ref="detailDiloag" @change="getList" v-if="isShow"
:dic="{ D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX }" />
:dic="{ /* D_BZ_SF, */ D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX /*, D_GS_XS_QTLX */ }" />
</div>
<SubmissionProcess v-model="showSp" :data="rowData"
:userData="{ ajmc: '线索数据采集审批', flowType: 'XSSJCJSP', modelName: '线索' }" :path="fixedValue" @getList="getList" />
@ -70,7 +70,7 @@ import { useRoute } from 'vue-router'
const router = useRouter();
const route = useRoute()
const { proxy } = getCurrentInstance();
const { D_GS_XS_XSCZZT, D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_GS_XS_QTLX, D_BZ_XB, D_BZ_XSSHZT } = proxy.$dict("D_GS_XS_XSCZZT", "D_GS_XS_LY", "D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX", "D_BZ_XB", "D_BZ_XSSHZT"); //获取字典数据
const { D_GS_XS_XSCZZT, D_GS_XS_LY, D_BZ_SSZT, /* D_BZ_SF, */ D_GS_XS_LX, /* D_GS_XS_QTLX, */ D_BZ_XB, D_BZ_XSSHZT } = proxy.$dict("D_GS_XS_XSCZZT", "D_GS_XS_LY", "D_BZ_SSZT" /*, "D_BZ_SF" */, "D_GS_XS_LX" /*, "D_GS_XS_QTLX" */, "D_BZ_XB", "D_BZ_XSSHZT"); //获取字典数据
const detailDiloag = ref(null);
const searchBox = ref(); //搜索框
const isShow = ref(false)

View File

@ -1,28 +1,22 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" >
<el-button type="primary" @click="dologCancel()" size="small">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">导出</span>
</el-button>
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<el-button type="primary" @click="dologCancel()" size="small">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">导出</span>
</el-button>
</Search>
</div>
<!-- 表格 -->
<div class="margTop">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<template #qblx="{ row }">
<DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
</template>
@ -40,11 +34,12 @@
<!-- <el-link size="small" type="primary" @click="FollowUpOnLeads(row)">转线索</el-link>
<el-link size="small" type="primary" @click="openFszl(row)">转合成</el-link> -->
<el-link size="small" type="primary" @click="openCheckProcess(row)">补充信息</el-link>
<!-- <el-link size="small" type="primary" @click="openCheckProcessXb(row)"> 续报</el-link> -->
<!-- <el-link size="small" type="primary" @click="openCheckProcessXb(row)"> 续报</el-link> -->
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<el-link size="small" type="primary" @click="handleCase(row)">
<span :style="{'color': row.sfgz == '0' ? 'rgb(242,7,7)' : '#dede17'}">{{ row.sfgz == '0' ? '关注' : '取消关注' }}</span>
</el-link>
<span :style="{ 'color': row.sfgz == '0' ? 'rgb(242,7,7)' : '#dede17' }">{{ row.sfgz == '0' ? '关注' : '取消关注'
}}</span>
</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -72,8 +67,8 @@
<MakeTag v-model="chooseRow" :dataList="dataList" :dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }"
@getList="getList" />
<pursueContent v-model="pursueShow" :dataList="dataList" :title="processtitle" />
<Fszl v-model="fszlShow" :itemData="dataList" path="/mosty-gsxt/qbcjZhc/sendFqzl" />
<!-- <SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
<Fszl v-model="fszlShow" :itemData="dataList" path="/mosty-gsxt/qbcjZhc/sendFqzl" />
<!-- <SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" /> -->
</template>
@ -90,7 +85,7 @@ import ExportFile from '@/views/backOfficeSystem/HumanIntelligence/infoCollectio
import pursueContent from "../components/pursueContent.vue";
import Fszl from '../components/fszl.vue'
import { getItem } from '@//utils/storage.js'
import {xxcjSelectPage,xxcjXxzsx} from '@/api/xxcj.js'
import { xxcjSelectPage, xxcjXxzsx } from '@/api/xxcj.js'
import { color } from "echarts";
const { proxy } = getCurrentInstance();
const {
@ -107,7 +102,7 @@ const {
D_BZ_CLLX,
D_BZ_XZQHDM,
D_BZ_QBCZZT,
D_BZ_CJLX ,D_BZ_LCZT } =
D_BZ_CJLX, D_BZ_LCZT } =
proxy.$dict(
"D_BZ_BMJB",
"D_GS_XS_LY",
@ -132,7 +127,7 @@ const tableList = ref([]);
const qxkz = reactive({
deptBizType: "",
deptLevel: "",
userName:''
userName: ''
})
const list = ref()
const searchConfiger = ref();
@ -143,7 +138,7 @@ onMounted(() => {
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
qxkz.depBool = deptBizType == '23' && Jb == '01' ? true : false;
qxkz.depBool = deptBizType == '23' && Jb == '01' ? true : false;
getRouter()
tabHeightFn()
if (route.query.id) {
@ -188,11 +183,16 @@ const pageData = reactive({
},
controlsWidth: 240,
tableColumn: [
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true },
{ label: "流程状态", prop: "lczt", showSolt: true },
{ label: "上报人", prop: "xssbr" },
{ label: "所属部门", prop: "ssbm" },
{ label: "分组人", prop: "fzrxm" },
{ label: "分组时间", prop: "fzsj" },
// { label: "情报来源", prop: "qbly", showSolt: true },
// { label: "流程状态", prop: "lczt", showSolt: true },
// { label: "消息状态", prop: "czzt", showSolt: true },
]
});
@ -254,12 +254,12 @@ const addEdit = (type, row) => {
};
const handleCase = (row) => {
let text = row.sfgz == '0' ? '关注' : '取消关注';
proxy.$confirm("确定要" + text + "吗?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: row.id,sfgz: row.sfgz == '0' ? '1' : '0' },'/mosty-gsxt/xxcj/cjgz').then(res => {
proxy.$message({ type: "success", message: text + "成功" });
getList();
})
let text = row.sfgz == '0' ? '关注' : '取消关注';
proxy.$confirm("确定要" + text + "吗?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: row.id, sfgz: row.sfgz == '0' ? '1' : '0' }, '/mosty-gsxt/xxcj/cjgz').then(res => {
proxy.$message({ type: "success", message: text + "成功" });
getList();
})
})
}
// 表格高度计算
@ -292,9 +292,9 @@ const openCheckProcess = (item) => {
// 续报
const openCheckProcessXb = (item) => {
if (qxkz.userName == item.xssbr) {
processtitle.value = '信息续报'
pursueShow.value = true
dataList.value = item
processtitle.value = '信息续报'
pursueShow.value = true
dataList.value = item
} else {
proxy.$message({
message: '您不是该情报的上报人,不能续报',
@ -314,12 +314,12 @@ const FollowUpOnLeads = (row) => {
showClose: true,
})
} else {
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
proxy.$message({ type: "success", message: "转线索成功" });
getList();
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
proxy.$message({ type: "success", message: "转线索成功" });
getList();
})
})
})
}
}
@ -332,8 +332,10 @@ const openFszl = (item) => {
type: 'warning',
showClose: true,
})
} else { fszlShow.value = true
dataList.value = item }
} else {
fszlShow.value = true
dataList.value = item
}
}
</script>

View File

@ -87,7 +87,7 @@ import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_SF,D_GS_BK_BKYS,D_BZ_XB,D_GS_BK_SJLX,D_GS_BK_DJ, D_GS_BK_DX, D_GS_BK_ZT,D_GS_BK_CZYQ,D_GS_BK_CZJSDWLX,D_GS_BK_TJFS } = proxy.$dict("D_BZ_SF","D_GS_BK_BKYS","D_BZ_XB","D_GS_BK_SJLX","D_GS_BK_DJ","D_GS_BK_DX","D_GS_BK_ZT","D_GS_BK_CZYQ","D_GS_BK_CZJSDWLX","D_GS_BK_TJFS"); //获取字典数据
const { D_BZ_SF,D_GS_BK_BKYS,D_BZ_XB,/*D_GS_BK_SJLX,*/D_GS_BK_DJ, D_GS_BK_DX, D_GS_BK_ZT,D_GS_BK_CZYQ,D_GS_BK_CZJSDWLX,D_GS_BK_TJFS } = proxy.$dict("D_BZ_SF","D_GS_BK_BKYS","D_BZ_XB"/*,"D_GS_BK_SJLX"*/,"D_GS_BK_DJ","D_GS_BK_DX","D_GS_BK_ZT","D_GS_BK_CZYQ","D_GS_BK_CZJSDWLX","D_GS_BK_TJFS"); //获取字典数据
const searchBox = ref();
const chooseRow = ref({})
const btns = ref();

View File

@ -87,7 +87,7 @@ import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_SF,D_GS_BK_BKYS,D_BZ_XB,D_GS_BK_SJLX,D_GS_BK_DJ, D_GS_BK_DX, D_GS_BK_ZT,D_GS_BK_CZYQ,D_GS_BK_CZJSDWLX,D_GS_BK_TJFS } = proxy.$dict("D_BZ_SF","D_GS_BK_BKYS","D_BZ_XB","D_GS_BK_SJLX","D_GS_BK_DJ","D_GS_BK_DX","D_GS_BK_ZT","D_GS_BK_CZYQ","D_GS_BK_CZJSDWLX","D_GS_BK_TJFS"); //获取字典数据
const { D_BZ_SF,D_GS_BK_BKYS,D_BZ_XB,/*D_GS_BK_SJLX,*/D_GS_BK_DJ, D_GS_BK_DX, D_GS_BK_ZT,D_GS_BK_CZYQ,D_GS_BK_CZJSDWLX,D_GS_BK_TJFS } = proxy.$dict("D_BZ_SF","D_GS_BK_BKYS","D_BZ_XB"/*,"D_GS_BK_SJLX"*/,"D_GS_BK_DJ","D_GS_BK_DX","D_GS_BK_ZT","D_GS_BK_CZYQ","D_GS_BK_CZJSDWLX","D_GS_BK_TJFS"); //获取字典数据
const searchBox = ref();
const chooseRow = ref({})
const btns = ref();

View File

@ -83,7 +83,17 @@
import { qcckGet } from "@/api/qcckApi.js";
import { defineProps, ref, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_BQ_DJ, D_GS_SSYJ,D_GS_BQ_LB,D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ", "D_GS_SSYJ","D_GS_BQ_LB","D_GS_BQ_LX"); //获取字典数据
const {
D_GS_BQ_DJ,
// D_GS_SSYJ,
D_GS_BQ_LB,
D_GS_BQ_LX
} = proxy.$dict(
"D_GS_BQ_DJ",
// "D_GS_SSYJ",
"D_GS_BQ_LB",
"D_GS_BQ_LX"
); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,

View File

@ -54,7 +54,17 @@
import { qcckGet } from "@/api/qcckApi.js";
import { defineProps, ref, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB, D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ", "D_GS_SSYJ", "D_GS_BQ_LB", "D_GS_BQ_LX"); //获取字典数据
const {
D_GS_BQ_DJ,
D_GS_SSYJ,
// D_GS_BQ_LB,
D_GS_BQ_LX
} = proxy.$dict(
"D_GS_BQ_DJ",
"D_GS_SSYJ",
// "D_GS_BQ_LB",
"D_GS_BQ_LX"
); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,

View File

@ -111,7 +111,7 @@ const props = defineProps({
})
const emits = defineEmits(["update:modelValue", "choosed", "choosedAdd"]);
const { proxy } = getCurrentInstance();
const { D_BZ_XB, D_GS_ZDR_YJDJ } = proxy.$dict("D_BZ_XB", "D_GS_ZDR_YJDJ"); // 获取字典数据
const { D_BZ_XB, /* D_GS_ZDR_YJDJ */ } = proxy.$dict("D_BZ_XB", /* "D_GS_ZDR_YJDJ" */); // 获取字典数据
const input = ref('')
const value1 = ref('')
const value2 = ref('')

View File

@ -2,77 +2,74 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" >
<Search :searchArr="searchConfiger" @submit="onSearch">
<el-button type="primary" size="small" @click="handleAdd('add', null)">发起布控</el-button>
</Search>
</div>
<!-- 按钮组 -->
<!-- 表格 -->
<div class="margTop">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth">
<!-- 表格 -->
<div class="margTop">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #bkZt="{ row }">
<DictTag :tag="false" :value="row.bkZt" :options="D_GS_BK_ZT" />
</template>
<template #bkDj="{ row }">
<DictTag :tag="false" :value="row.bkDj" :options="D_GS_SSYJ" v-if="route.name == 'myControl'" />
<DictTag :tag="false" :value="row.bkDj" :options="D_BZ_JQDJ" v-else />
</template>
<template #bkDx="{ row }">
<DictTag :tag="false" :value="row.bkDx" :options="D_GS_BK_NEWDX" />
</template>
<template #bkdxList="{ row }">
<span v-if="row.bkdxList"><span class="nowrap" v-for="(it, idx) in row.bkdxList" :key="idx">
{{ it.ryXm ? it.ryXm : it.imei ? it.imei : it.imsi ? it.imsi : '' }}
<!-- :it.ryXm?it.mac:it.imsi?it.imsi:'xxxx' -->
<span v-if="idx < row.bkdxList.length - 1"></span></span></span>
<span v-else>暂无</span>
</template>
<!-- <template #sjrs="{ row }">
<template #bkZt="{ row }">
<DictTag :tag="false" :value="row.bkZt" :options="D_GS_BK_ZT" />
</template>
<template #bkDj="{ row }">
<DictTag :tag="false" :value="row.bkDj" :options="D_GS_SSYJ" v-if="route.name == 'myControl'" />
<DictTag :tag="false" :value="row.bkDj" :options="D_BZ_JQDJ" v-else />
</template>
<template #bkDx="{ row }">
<DictTag :tag="false" :value="row.bkDx" :options="D_GS_BK_NEWDX" />
</template>
<template #bkdxList="{ row }">
<span v-if="row.bkdxList"><span class="nowrap" v-for="(it, idx) in row.bkdxList" :key="idx">
{{ it.ryXm ? it.ryXm : it.imei ? it.imei : it.imsi ? it.imsi : '' }}
<!-- :it.ryXm?it.mac:it.imsi?it.imsi:'xxxx' -->
<span v-if="idx < row.bkdxList.length - 1"></span></span></span>
<span v-else>暂无</span>
</template>
<!-- <template #sjrs="{ row }">
<span v-if="row.bkdxList"> {{ row.bkdxList.length }} </span>
<span v-else>0</span>
</template> -->
<!-- <template #qyList="{ row }">
<!-- <template #qyList="{ row }">
<span v-for="(it,idx) in row.qyList" :key="idx"> {{ it.qymc }} <span v-if="idx < row.qyList.length-1"></span></span>
</template> -->
<!-- <template #yjcs="{row}">
<!-- <template #yjcs="{row}">
<span @click="openWarning(row)" style="color: #00ffff;" class="mr5 pointer">{{ row.yjcs || 0}}</span>
</template> -->
<!-- 操作 -->
<template #controls="{ row }">
<template v-if="!row.gzlid">
<!-- 工作流的送审 -->
<!-- <el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
<!-- 操作 -->
<template #controls="{ row }">
<template v-if="!row.gzlid">
<!-- 工作流的送审 -->
<!-- <el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="createProcess(row)">送审</el-link> -->
<!-- 不走工作流的送审 -->
<el-link type="primary" size="small" v-if="['01', '03', '06'].includes(row.bkZt)" @click="hadleSendSH(row)">送审</el-link>
<el-link type="primary" size="small" @click="tbGsxtBkQuashList(row)" v-if="!!!(['01', '03', '06'].includes(row.bkZt))">撤控</el-link>
<el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="handleAdd('edit', row)">编辑</el-link>
<!-- 不走工作流的送审 -->
<el-link type="primary" size="small" v-if="['01', '03', '06'].includes(row.bkZt)"
@click="hadleSendSH(row)">送审</el-link>
<el-link type="primary" size="small" @click="tbGsxtBkQuashList(row)"
v-if="!!!(['01', '03', '06'].includes(row.bkZt))">撤控</el-link>
<el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="handleAdd('edit', row)">编辑</el-link>
</template>
<!-- 审核通过后才有轨迹 -->
<el-link type="primary" size="small" @click="openShowHzd(row)" v-if="row.bkZt == '05'">回执单</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)"
v-if="['01', '03', '06'].includes(row.bkZt)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 审核通过后才有轨迹 -->
<el-link type="primary" size="small" @click="openShowHzd(row)" v-if="row.bkZt == '05'">回执单</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)"
v-if="['01', '03', '06'].includes(row.bkZt)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<!-- 布控类型 -->
<AddBkdx ref="addBkdxForm" @change="getList" :name="route.name" :dic="{
@ -82,19 +79,10 @@
<!-- 预警弹窗 -->
<YjDialog ref="warningkdxForm"></YjDialog>
<SubmissionProcess
v-model="showSp"
:data="rowData"
:userData="{ ajmc: '布控审批', flowType: 'BKSP', modelName: '布控' }"
:path="fixedValue"
@getList="getList"
/>
<Hzd
v-model="hzdVisible"
:dataList="dataList"
:dict="{D_GS_BK_NEWDX,D_BZ_BKLYS,D_GS_SSYJ,D_BZ_JQDJ,D_GZL_SHZT,D_GS_BK_CZYQ}"
:name="route.name"
/>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '布控审批', flowType: 'BKSP', modelName: '布控' }"
:path="fixedValue" @getList="getList" />
<Hzd v-model="hzdVisible" :dataList="dataList"
:dict="{ D_GS_BK_NEWDX, D_BZ_BKLYS, D_GS_SSYJ, D_BZ_JQDJ, D_GZL_SHZT, D_GS_BK_CZYQ }" :name="route.name" />
</template>
<script setup>
@ -113,9 +101,9 @@ const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance();
const { D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_SJLX, D_GS_SSYJ, BD_BK_CLYJBQ, D_GS_ZDR_YJDJ,
D_GS_BK_NEWDX, D_GS_BK_ZT, D_GS_BK_CZYQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS, D_BZ_BKLYS,D_GZL_SHZT,
D_GS_BK_NEWDX, D_GS_BK_ZT, D_GS_BK_CZYQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS, D_BZ_BKLYS, D_GZL_SHZT,
D_BZ_JQDJ, D_BZ_SF } = proxy.$dict("D_GS_ZDR_YJDJ", "D_GS_BK_BKYS", "D_BZ_XB", "D_GS_BK_SJLX",
"D_GS_SSYJ", "D_GS_BK_NEWDX", "D_GS_BK_ZT", "D_GS_BK_CZYQ", "D_GS_BK_CZJSDWLX", "D_GS_BK_TJFS",'D_GZL_SHZT',
"D_GS_SSYJ", "D_GS_BK_NEWDX", "D_GS_BK_ZT", "D_GS_BK_CZYQ", "D_GS_BK_CZJSDWLX", "D_GS_BK_TJFS", 'D_GZL_SHZT',
'BD_BK_CLYJBQ', 'D_BZ_JQDJ', "D_BZ_BKLYS", "D_BZ_SF"); //获取字典数据
const addBkdxForm = ref(null); //布控对象组件
const warningkdxForm = ref(); //布控对象组件
@ -153,6 +141,29 @@ const searchConfiger = ref([
placeholder: "请选择布控部门",
showType: "department",
},
{
label: "布控对象",
prop: "bkBt",
placeholder: "请输入身份证号",
showType: "input"
}, {
label: "布控对象身份证号",
prop: "bkrsfzh",
placeholder: "请输入布控对象身份证号",
showType: "input"
},
{
label: "发起人姓名",
prop: "bkfqrXm",
placeholder: "请输入姓名",
showType: "input"
},
{
label: "发起人身份证号",
prop: "bkfqrSfzh",
placeholder: "请输入身份证号",
showType: "input"
}
]);
const queryFrom = ref({});
const pageData = reactive({
@ -197,28 +208,17 @@ const createProcess = (row) => {
onMounted(() => {
getList();
tabHeightFn();
if(route.name == 'PrivateSurveillance'){
if (route.name == 'PrivateSurveillance') {
// 临时布控
searchConfiger.value = [
...searchConfiger.value,
{
label: "姓名",
prop: "bkfqrXm",
placeholder: "请输入姓名",
showType: "input"
},
{
label: "身份证号",
prop: "bkfqrSfzh",
placeholder: "请输入身份证号",
showType: "input"
}
...searchConfiger.value,
]
}
});
// 搜索
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
@ -256,16 +256,16 @@ const getList = () => {
});
};
function hadleSendSH (row) {
function hadleSendSH(row) {
proxy.$confirm("确定要送审吗?", "提示", { type: "warning" }).then(() => {
qcckGet({}, '/mosty-gsxt/tbGsxtBk/subExamine/'+row.id).then(res => {
qcckGet({}, '/mosty-gsxt/tbGsxtBk/subExamine/' + row.id).then(res => {
proxy.$message({ type: "success", message: "送审成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "送审失败" });
proxy.$message({ type: "error", message: "送审失败" });
})
})
}
const shForm = ref({
@ -282,10 +282,10 @@ const shFormRules = {
// 提交送审
const submitSh = () => {
try {
shFormRef.value.validate(valida=>{
if(!valida) return;
const params = {...shForm.value }
shFormRef.value.validate(valida => {
if (!valida) return;
const params = { ...shForm.value }
})
} catch (err) {
if (err !== false) {
@ -309,7 +309,7 @@ const handleRow = (id) => {
};
// 回执单
const hzdVisible = ref(false)
const dataList= ref({})
const dataList = ref({})
const openShowHzd = (row) => {
hzdVisible.value = true
dataList.value = row

View File

@ -10,15 +10,30 @@
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
<div class="report-section">
<div class="section-title">报告</div>
<MyTable :tableData="reportTableData" :tableColumn="reportTableColumn" :tableConfiger="reportTableConfiger"
:tableHeight="'400px'" :controlsWidth="120">
<template #controls="{ row }">
<el-link size="small" type="primary" @click="viewReport(row)">查看</el-link>
</template>
</MyTable>
</div>
</div>
</div>
<!-- 报告详情弹窗 -->
<ReportDialog ref="reportDialogRef" v-model="reportDialogVisible" />
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import ReportDialog from "./components/ReportDialog.vue";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue";
import { addJudgmentCommandList, editJudgmentCommand, getJudgmentCommandDetail } from "@/api/huiShangyp/judgmentCommand.js"
// import { getItem } from '@//utils/storage.js'
import { useRouter } from 'vue-router'
const emit = defineEmits(["updateDate", "getList"]);
@ -44,6 +59,28 @@ const title = ref("");
/** 外面行数据 */
const outRow = ref({})
// 报告表格配置
const reportTableData = computed(() => Array.isArray(listQuery.value.xfbmList) ? listQuery.value.xfbmList : []);
const reportTableColumn = [
{ label: "下发部门", prop: "ssbm" },
{ label: "操作人", prop: "xtCjr" },
];
const reportTableConfiger = {
showSelectType: "null",
showIndex: false,
haveControls: true,
controls: "操作",
loading: false
};
// 报告详情弹窗
const reportDialogVisible = ref(false);
const reportDialogRef = ref();
const viewReport = (row) => {
reportDialogRef.value.open(row.ypid);
};
const rules = reactive({
zlbt: [{ required: true, message: "请输入标题", trigger: "blur" }],
// zlnr: [{ required: true, message: "请输入内容", trigger: "change" }],
@ -79,6 +116,7 @@ const getDataById = (id) => {
// const xfbmMc = res.xfbmMc
});
};
// http://localhost:9530/mosty-api/mosty-gsxt/gsxtYpbg/0aeb4f6b814b4b05a49f472dd1234935
// 提交
@ -149,4 +187,16 @@ defineExpose({ init });
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
// z-index: 1000;
}
.report-section {
margin-top: 20px;
.section-title {
font-size: 16px;
font-weight: bold;
margin-bottom: 10px;
padding-left: 10px;
border-left: 3px solid #409eff;
}
}
</style>

View File

@ -13,11 +13,7 @@
<!-- 研判报告选择 -->
<div class="form-item">
<label class="form-label">研判报告</label>
<ReportSelectInput
v-model="formData.ypmc"
:bglx="formData.bglx"
@change="handleReportChange"
/>
<ReportSelectInput v-model="formData.ypmc" :bglx="formData.bglx" @change="handleReportChange" />
</div>
</div>

View File

@ -0,0 +1,60 @@
<template>
<el-dialog v-model="visible" title="报告详情" width="80%" destroy-on-close @closed="handleClosed">
<div v-loading="loading" class="report-content">
<div v-if="reportDetail" v-html="reportDetail.bgnr"></div>
<el-empty v-else-if="!loading" description="暂无报告内容" />
</div>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref, computed } from 'vue';
import { qcckGet } from '@/api/qcckApi.js';
const props = defineProps({
modelValue: {
type: Boolean,
default: false
}
});
const emit = defineEmits(['update:modelValue', 'closed']);
const visible = computed({
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
});
const reportDetail = ref(null);
const loading = ref(false);
const open = (ypbgid) => {
visible.value = true;
loading.value = true;
reportDetail.value = null;
qcckGet({}, '/mosty-gsxt/gsxtYpbg/' + ypbgid).then((res) => {
reportDetail.value = res || {};
}).finally(() => {
loading.value = false;
});
};
const handleClosed = () => {
reportDetail.value = null;
emit('closed');
};
defineExpose({ open });
</script>
<style lang="scss" scoped>
.report-content {
min-height: 45vh;
max-height: 60vh;
overflow-y: auto;
padding: 10px;
}
</style>

View File

@ -68,7 +68,7 @@ const handleConfirm = () => {
return
}
inputValue.value = selectedReport.value.ypyt || selectedReport.value.zlbt || ''
inputValue.value = selectedReport.value.bgmc || selectedReport.value.ypyt || selectedReport.value.zlbt || ''
emit('update:modelValue', inputValue.value)
emit('change', selectedReport.value)
showDialog.value = false

View File

@ -19,10 +19,10 @@
</el-radio>
</template>
</el-table-column>
<el-table-column label="研判议题" prop="ypyt" />
<el-table-column label="研判要求" prop="ypyq" />
<el-table-column label="研判时间" prop="ypsj" />
<el-table-column label="研判议题" prop="bgmc" />
<el-table-column label="研判时间" prop="scsj" />
<el-table-column label="发起部门" prop="ssbm" />
<el-table-column label="创建人" prop="cjrxm" />
</el-table>
</div>
@ -38,7 +38,7 @@
<script setup>
import { ref, watch, onMounted } from 'vue'
import { tacticalGet } from '@/api/huiShangyp/tacticalApi.js'
import { qcckGet } from '@/api/qcckApi'
const props = defineProps({
bglx: {
type: String,
@ -87,10 +87,14 @@ const loadData = async () => {
pageSize: pageSize.value,
pageCurrent: currentPage.value
}
// / gsxtYpbg / getPageList
// const res = await tacticalGet(params)
qcckGet(params, '/mosty-gsxt/gsxtYpbg/getPageList').then(res => {
tableData.value = res.records || []
total.value = res.total || 0
})
const res = await tacticalGet(params)
tableData.value = res.records || []
total.value = res.total || 0
} catch (error) {
tableData.value = []
total.value = 0

View File

@ -29,11 +29,11 @@
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link>
<el-link size="small" type="primary" @click="getDataById('edit', row)" :disabled="!canEdit(row)">修改</el-link>
<el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link>
<el-link v-if="showBtn(row) == 'sign'" size="small" type="success" @click="sign(row)">签收</el-link>
<el-link v-if="showBtn(row) == 'feedback'" size="small" type="warning" @click="feedback(row)">反馈</el-link>
<el-link size="small" type="danger" @click="deleteFile(row)" :disabled="!canDelete(row)">删除</el-link>
<el-link v-if="canSign(row)" size="small" type="success" @click="sign(row)">签收</el-link>
<el-link v-if="canFeedback(row)" size="small" type="warning" @click="feedback(row)">反馈</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -198,25 +198,46 @@ const handleFeedbackSuccess = () => {
// 权限控制
// 显示签收
// 获取当前用户在xfbmList中的部门项
const getMyDeptItem = (row) => {
return row.xfbmList?.find(v => v.ssbmdm == userInfo.value?.deptCode)
}
// 显示签收状态
const showSign = (row) => {
let item = row.xfbmList.find(v => v.ssbmdm == userInfo.value.deptCode)
const item = getMyDeptItem(row)
if (item) {
return item.zlzt == '01' ? '未签收' : item.zlzt == '02' ? '已签收' : '已反馈'
} else {
return row.zlzt == '01' ? '未签收' : row.zlzt == '02' ? '已签收' : '已反馈'
}
return row.zlzt == '01' ? '未签收' : row.zlzt == '02' ? '已签收' : '已反馈'
}
// sign--签收
// feedback--反馈
// 显示按钮
const showBtn = (row) => {
let item = row.xfbmList.find(v => v.ssbmdm == userInfo.value.deptCode)
if (item) {
return item.zlzt == '01' ? 'sign' : item.zlzt == '02' ? 'feedback' : ''
} else {
return ''
}
// 删除权限JS_666666/JS_777777可删除所有其余只能删除自己的
const canDelete = (row) => {
const roleList = getItem('roleList') || []
const roleCodes = roleList.map(r => r.roleCode)
if (roleCodes.includes('JS_666666') || roleCodes.includes('JS_777777')) return true
return row.ssbmdm == userInfo.value?.deptCode
}
// 修改权限:只能自己修改,且未签收未反馈
const canEdit = (row) => {
const item = getMyDeptItem(row)
if (!item) return false
return item.zlzt == '01'
}
// 签收权限:当前部门在列表中且未签收
const canSign = (row) => {
const item = getMyDeptItem(row)
return item?.zlzt == '01'
}
// 反馈权限:当前部门在列表中且已签收或已反馈(可多次反馈)
const canFeedback = (row) => {
const item = getMyDeptItem(row)
return item && (item.zlzt == '02' || item.zlzt == '03')
}
</script>

View File

@ -3,30 +3,21 @@
<div class="head_box">
<span class="title">报告{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit" v-if="title!='详情'">保存</el-button>
<el-button type="primary" size="small" :loading="loading" @click="submit" v-if="title != '详情'">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage :formList="formData" :disabled="title=='详情'" v-model="listQuery" ref="elform" :rules="rules">
<FormMessage :formList="formData" :disabled="title == '详情'" v-model="listQuery" ref="elform" :rules="rules">
<template #fj><el-button type="primary" @click="showText = true">附件上传</el-button></template>
</FormMessage>
<div class="cntBox">
<!-- 工具栏 -->
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editorRef"
:defaultConfig="toolbarConfig"
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig"
:mode="mode" />
<!-- 编辑器 -->
<Editor
:style="`height: 480px; overflow-y: hidden`"
v-model="textContent"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="handleCreated"
@onChange="handChange"
/>
<Editor :style="`height: 480px; overflow-y: hidden`" v-model="textContent" :defaultConfig="editorConfig"
:mode="mode" @onCreated="handleCreated" @onChange="handChange" />
</div>
<div v-if="listQuery.id" style="display: flex; justify-content: center;">
<!-- <el-button style="display: block;" type="primary" @click="ConsultationShow = true">网上会商</el-button> -->
@ -120,7 +111,7 @@ const title = ref("");
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" :type == "edit"? "编辑" : "详情";
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
if (row) {
@ -132,8 +123,9 @@ const init = (type, row) => {
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({},'/mosty-gsxt/gsxtYpbg/'+id).then((res) => {
qcckGet({}, '/mosty-gsxt/gsxtYpbg/' + id).then((res) => {
listQuery.value = res || {};
textContent.value = res.bgnr
// /** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
// const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []
// listQuery.value.jsdxBmDm = cyypList.map(item => {
@ -150,18 +142,18 @@ const getText = (val) => {
setEditorTextContent()
}
function stripReportHeader(html) {
const source = typeof html === "string" ? html : "";
if (!source) return "";
const hrMatch = source.match(/<hr\b[^>]*\/?>/i);
if (hrMatch && typeof hrMatch.index === "number") {
return source.slice(hrMatch.index + hrMatch[0].length).trim();
}
if (typeof dataBt.value === "string" && source.startsWith(dataBt.value)) {
return source.slice(dataBt.value.length).trim();
}
return source.trim();
}
// function stripReportHeader(html) {
// const source = typeof html === "string" ? html : "";
// if (!source) return "";
// const hrMatch = source.match(/<hr\b[^>]*\/?>/i);
// if (hrMatch && typeof hrMatch.index === "number") {
// return source.slice(hrMatch.index + hrMatch[0].length).trim();
// }
// if (typeof dataBt.value === "string" && source.startsWith(dataBt.value)) {
// return source.slice(dataBt.value.length).trim();
// }
// return source.trim();
// }
function setEditorTextContent() {
let html = dataBt.value;
@ -172,11 +164,11 @@ function setEditorTextContent() {
// 提交
const submit = () => {
elform.value.submit( async (data) => {
elform.value.submit(async (data) => {
loading.value = true;
const params = {
...data,
bgnr: stripReportHeader(textContent.value)
bgnr: textContent.value
};
const apiFun = !listQuery.value.id ? gsxtYpbgAddEntity : gsxtYpbgEditEntity;
if (!listQuery.value.id) delete params.id;
@ -211,7 +203,7 @@ const close = () => {
loading.value = false;
dialogForm.value = false;
listQuery.value = {}
router.replace({ path: '/strategicResearchs' })// 移除id 避免刷新一直带参数
router.replace({ path: '/strategicResearchs' })// 移除id 避免刷新一直带参数
};

View File

@ -10,7 +10,7 @@
</div>
<div class="form_cnt">
<EarlyWarning v-if="item.mxlx == YJGZ" ref="regulationRef"
:dict="{D_BB_AJLB,D_BZ_WPLX}"
:dict="{/* D_BB_AJLB, */ D_BZ_WPLX}"
:defaultData="defaultData" :disabled="false" />
<Regulation v-if="item.mxlx ==SSYJ" ref="regulationRef" :dict="{D_BZ_RYBQ}"
:defaultData="defaultData" :disabled="false" />
@ -34,7 +34,7 @@ const props = defineProps({
})
const { proxy } = getCurrentInstance();
const { D_BB_AJLB,D_BZ_WPLX,D_BZ_RYBQ} = proxy.$dict("D_BB_AJLB","D_BZ_WPLX","D_BZ_RYBQ")
const { /* D_BB_AJLB, */ D_BZ_WPLX, D_BZ_RYBQ } = proxy.$dict(/* "D_BB_AJLB", */ "D_BZ_WPLX", "D_BZ_RYBQ")
const title = ref("新增")
const emit = defineEmits(['getList'])
const listQuery = ref()

View File

@ -46,7 +46,7 @@ const props = defineProps({
})
const { proxy } = getCurrentInstance();
const { D_BB_AJLB,D_BZ_WPLX} = proxy.$dict("D_BB_AJLB","D_BZ_WPLX")
const { /* D_BB_AJLB, */ D_BZ_WPLX } = proxy.$dict(/* "D_BB_AJLB", */ "D_BZ_WPLX")
const regulation = ref(null)
const queryFrom = ref({})
const searchBox = ref(); //搜索框

View File

@ -14,7 +14,7 @@ import WarningList from "./components/AddModel/warningList.vue"
const { proxy } = getCurrentInstance();
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, getCurrentInstance } from "vue";
const { D_BZ_TPYJLX,D_BZ_YJLX ,D_BZ_JQLY} = proxy.$dict("D_BZ_TPYJLX","D_BZ_YJLX","D_BZ_JQLY")
const { /* D_BZ_TPYJLX, */D_BZ_YJLX /* ,D_BZ_JQLY */} = proxy.$dict(/* "D_BZ_TPYJLX", */"D_BZ_YJLX"/* ,"D_BZ_JQLY" */)
const showModel = ref('研判首页')
const itemData = ref({})

View File

@ -1,9 +1,9 @@
<template>
<el-dialog :model-value="modelValue" :title="title" width="80%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div style="width: 100%;height: 500px;">
<div class="table-container">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
:tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :tableHeight="480">
<template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="dict.D_GS_BQ_DJ" />
</template>
@ -51,7 +51,9 @@ const pageData = reactive({
tableConfiger: {
rowHieght: 61,
showSelectType: "null", //选择类型
loading: false
loading: false,
haveControls: false,
},
total: 0,
pageConfiger: {
@ -98,4 +100,10 @@ const submitForm = () => {
};
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.table-container {
width: 100%;
height: 500px;
overflow: hidden;
}
</style>

View File

@ -23,6 +23,23 @@
</div>
</template>
</FormMessage>
<el-table v-if="title == '详情' && listQuery.czlcList && listQuery.czlcList.length > 0" :data="listQuery.czlcList"
border size="small" style="width: 100%;margin-top: 10px;">
<el-table-column prop="czrrxm" label="反馈人" min-width="100" />
<el-table-column prop="fknr" label="反馈内容" min-width="200" />
<el-table-column prop="ssbm" label="所属部门" min-width="150" />
<el-table-column label="附件" min-width="200">
<template #default="{ row }">
<div v-if="parseFkfj(row.fkfj).length">
<el-link v-for="(file, idx) in parseFkfj(row.fkfj)" :key="idx" type="primary" :underline="false"
@click="downloadFile(file)" style="margin-right: 10px;">
{{ file.name || file.id }}
</el-link>
</div>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
</div>
<div v-if="title == '详情'" class="timeline-container">
<el-timeline class="timeline-wrapper" v-if="listQuery.czlcLis && listQuery.czlcList.length > 0">
@ -57,8 +74,9 @@ import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
import FormMessage from '@/components/aboutTable/FormMessage.vue'
import * as MOSTY from '@/components/MyComponents/index'
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { saveAs } from 'file-saver';
import { useRouter } from 'vue-router'
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick ,watch} from "vue";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick, watch } from "vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: {
@ -83,13 +101,13 @@ watch(() => props.dic, (newVal) => {
{ label: "联系人", prop: "zllxr", type: "input" },
{ label: "联系电话", prop: "zllxdh", type: "input" },
{ label: "关联线索", prop: "glxsid", type: "slot" },
{ label: "主送单位", prop: "zsdw", type: "department" },
{ label: "主送单位", prop: "zsdw", type: "department", depMc: "zsdwMc" },
{ label: "抄送单位", prop: "csdw", type: "department" },
{ label: "指令内容", prop: "zlnr", type: "textarea", width: '100%' },
{ label: "附件", prop: "fjzd", type: "slot", width: '100%' },
]
}
},{deep: true})
}, { deep: true })
const listQuery = ref({}); //表单
const loading = ref(false);
@ -118,9 +136,17 @@ const init = (type, row,) => {
// 根据id查询详情
const getDataById = (id) => {
qcckGet({ id }, '/mosty-gsxt/zlxx/selectByid').then((res) => {
res.fjzd = res.fjzd ? res.fjzd.split(',') : [];
// 解析附件兼容JSON字符串和逗号分隔两种格式
let fjzdList = []
try {
const parsed = res.fjzd ? JSON.parse(res.fjzd) : []
fjzdList = Array.isArray(parsed) ? parsed : []
} catch (e) {
fjzdList = res.fjzd ? res.fjzd.split(',') : []
}
listQuery.value = {
...res,
fjzd: fjzdList,
czlcList: res.czlcList ? res.czlcList.reverse() : []
};
});
@ -139,7 +165,18 @@ const submit = () => {
let url = title.value == "新增" ? '/mosty-gsxt/zlxx/add' : '/mosty-gsxt/zlxx/update';
let params = { ...data }
loading.value = true;
params.fjzd = params.fjzd ? params.fjzd.join(',') : ''
// 将附件转为JSON字符串包含id和name
let fjzdList = []
if (Array.isArray(params.fjzd)) {
params.fjzd.forEach(item => {
if (Object.prototype.toString.call(item) === '[object Object]') {
fjzdList.push({ id: item.id, name: item.name })
} else {
fjzdList.push({ id: item })
}
})
}
params.fjzd = fjzdList.length > 0 ? JSON.stringify(fjzdList) : ''
// 将主送单位和抄送单位转换为下发部门列表
let xfbmList = [];
const zsdwArr = Array.isArray(params.zsdw) ? params.zsdw : (params.zsdw ? [params.zsdw] : []);
@ -167,6 +204,34 @@ const close = () => {
loading.value = false;
router.replace({ path: '/InstructionInformation' })// 移除id 避免刷新一直带参数
};
// 解析附件JSON字符串为数组
const parseFkfj = (fkfj) => {
if (!fkfj) return []
try {
const parsed = typeof fkfj === 'string' ? JSON.parse(fkfj) : fkfj
return Array.isArray(parsed) ? parsed : []
} catch (e) {
return []
}
}
// 下载文件
const downloadFile = (file) => {
const url = `/mosty-api/mosty-base/minio/image/download/${file.id}`
const filename = file.name || file.id
fetch(url)
.then(response => {
if (!response.ok) throw new Error('下载失败')
return response.blob()
})
.then(blob => {
saveAs(blob, filename)
})
.catch(() => {
proxy.$message({ type: 'error', message: '下载失败' })
})
}
defineExpose({ init });
</script>

View File

@ -1,7 +1,14 @@
<template>
<el-dialog :model-value="modelValue" title="线索反馈" width="50%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 15vh; overflow: auto;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" />
<div style="height: 50vh; overflow: auto;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<template #fkfj>
<div>
<div>上传附件:<span class="f12">可附电子表格Word文档图像音视频文件</span> </div>
<MOSTY.Upload :showBtn="true" :isAll="true" :isImg="false" :limit="10" v-model="fkfj" />
</div>
</template>
</FormMessage>
</div>
<template #footer>
<div class="dialog-footer">
@ -13,6 +20,7 @@
</template>
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
@ -32,16 +40,19 @@ const emit = defineEmits(['update:modelValue', 'getList'])
const elform = ref(null)
const closeDialog = (formEl) => {
elform.value.reset()
fkfj.value = []
emit('update:modelValue', false)
}
const rules = reactive({
fknr: [{ required: true, message: '请输入反馈内容', trigger: 'blur' }],
})
const fkfj = ref([])
const listQuery = ref({})
const formData = ref(
[
{ label: "反馈内容", prop: "fknr", type: "textarea" ,width:'90%'},
{ label: "反馈内容", prop: "fknr", type: "textarea", width: '90%' },
{ label: "反馈附件", prop: "fkfj", width: '90%', type: "slot" },
]
)
watch(() => props.modelValue, (newVal, oldVal) => {
@ -55,8 +66,17 @@ const submitForm = (formEl) => {
console.log(listQuery.value);
elform.value.submit((valid) => {
if (valid) {
let fkfjList = [];
fkfj.value.forEach(item => {
if (Object.prototype.toString.call(item) === '[object Object]') {
fkfjList.push({ id: item.id, name: item.name })
} else {
fkfjList.push({ id: item })
}
})
const params = {
...listQuery.value,
fkfj: JSON.stringify(fkfjList)
}
qcckPost(params, '/mosty-gsxt/zlxx/fk').then((res) => {
proxy.$message({ type: "success", message: "反馈成功" });

View File

@ -1,62 +1,53 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch">
<el-button type="primary" size="small" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<el-button type="primary" size="small" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</Search>
</div>
<!-- 表格 -->
<div class="margTop">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #zllx="{row}">
<template #zllx="{ row }">
<DictTag :tag="false" :value="row.zllx" :options="D_GS_XS_ZLLX" />
</template>
<template #zldj="{row}">
<template #zldj="{ row }">
<DictTag :tag="false" :value="row.zldj" :options="D_GS_ZDQT_FXDJ" />
</template>
<template #czzt="{row}">
<template #czzt="{ row }">
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
</template>
<template #sffk="{row}">
{{ row.sffk == '1' ? '已反馈' : '未反馈' }}
<template #sffk="{ row }">
{{ row.sffk == '1' ? '已反馈' : '未反馈' }}
</template>
<template #sfqs="{row}">
{{ row.sfqs == '0' ? '未签收' : '已签收' }}
<template #sfqs="{ row }">
{{ row.sfqs == '0' ? '未签收' : '已签收' }}
</template>
<template #controls="{ row }">
<el-link size="small" type="primary" v-if="row.sfqs == '0'" @click="signRow(row)">签收</el-link>
<el-link size="small" type="primary" v-if="row.sfqs == '0'" @click="signRow(row)">签收</el-link>
<el-link size="small" type="warning" @click="fkRow(row)">反馈</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)" v-if="showBtn(row)">编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="showBtn(row)">删除</el-link>
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" :disabled="!canDelete(row)">删除</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 详情 -->
</div>
<DetailForm ref="detailDiloag" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
<Fk v-model="isShowFk" :dataList="dataList" @getList="getList"/>
<DetailForm ref="detailDiloag" @updateDate="getList" :dic="{ D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ }" />
<Fk v-model="isShowFk" :dataList="dataList" @getList="getList" />
</template>
<script setup>
@ -71,50 +62,51 @@ import { useRoute } from "vue-router";
import { reactive, ref, onMounted, getCurrentInstance, nextTick, watch } from "vue";
import { getItem } from '@/utils/storage'
const { proxy } = getCurrentInstance();
const {D_GS_XS_SJLY,D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ,D_GS_XS_CZZT} = proxy.$dict('D_GS_XS_SJLY','D_GS_XS_ZLLX','D_GS_ZDQT_FXDJ','D_GS_XS_CZZT')
const { /*D_GS_XS_SJLY,*/ D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ, D_GS_XS_CZZT } = proxy.$dict(/*'D_GS_XS_SJLY',*/ 'D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ', 'D_GS_XS_CZZT')
const detailDiloag = ref();
const isShow = ref(false);
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{ label: "指令标题", prop: 'zlbt', placeholder: "请输入指令标题", showType: "input" },
{ label: "指令类型", prop: 'zllx', placeholder: "请选择指令类型", showType: "select",options:D_GS_XS_ZLLX },
{ label: "指令等级", prop: 'zldj', placeholder: "请选择指令等级", showType: "select" ,options:D_GS_ZDQT_FXDJ},
{ label: "处置状态", prop: 'czzt', placeholder: "请选择处置状态", showType: "select" ,options:D_GS_XS_CZZT},
{ label: "指令类型", prop: 'zllx', placeholder: "请选择指令类型", showType: "select", options: D_GS_XS_ZLLX },
{ label: "指令等级", prop: 'zldj', placeholder: "请选择指令等级", showType: "select", options: D_GS_ZDQT_FXDJ },
{ label: "处置状态", prop: 'czzt', placeholder: "请选择处置状态", showType: "select", options: D_GS_XS_CZZT },
{ label: "反馈时间", prop: 'time', placeholder: "请选择反馈时间", showType: "datetimerange" },
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 240,
tableColumn: [
{ label: '指令标题', prop: 'zlbt' },
{ label: '指令类型', prop: 'zllx',showSolt:true },
{ label: '指令等级', prop: 'zldj',showSolt:true },
{ label: '反馈截止时间', prop: 'jssj' },
{ label: '处置状态', prop: 'czzt', showSolt: true },
{ label: '是否反馈', prop: 'sffk', showSolt: true },
{ label: '是否签收', prop: 'sfqs', showSolt: true },
]
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 240,
tableColumn: [
{ label: '指令标题', prop: 'zlbt' },
{ label: '指令类型', prop: 'zllx', showSolt: true },
{ label: '指令等级', prop: 'zldj', showSolt: true },
{ label: '主送单位', prop: 'sfqs', showSolt: true },
{ label: '反馈截止时间', prop: 'jssj' },
{ label: '处置状态', prop: 'czzt', showSolt: true },
{ label: '是否反馈', prop: 'sffk', showSolt: true },
{ label: '是否签收', prop: 'sfqs', showSolt: true },
]
});
const route=useRoute()
const userInfo=ref();
const route = useRoute()
const userInfo = ref();
onMounted(() => {
if (route.query.id) {
addEdit('detail', {id:route.query.id});
addEdit('detail', { id: route.query.id });
}
userInfo.value=getItem('deptId')[0]
userInfo.value = getItem('deptId')[0]
getList()
tabHeightFn();
});
@ -122,89 +114,97 @@ onMounted(() => {
// 搜索
const onSearch = (val) =>{
queryFrom.value = {...val}
queryFrom.value.kssj = val.time ? val.time[0]:'';
queryFrom.value.jssj = val.time ? val.time[1]:'';
const onSearch = (val) => {
queryFrom.value = { ...val }
queryFrom.value.kssj = val.time ? val.time[0] : '';
queryFrom.value.jssj = val.time ? val.time[1] : '';
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) =>{
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) =>{
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
// 获取列表
const getList = (val) =>{
const getList = (val) => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value };
delete data.time;
qcckGet(data,'/mosty-gsxt/zlxx/selectPage').then(res=>{
qcckGet(data, '/mosty-gsxt/zlxx/selectPage').then(res => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(()=>{ pageData.tableConfiger.loading = false; })
}).catch(() => { pageData.tableConfiger.loading = false; })
}
const deleteRow = (id) =>{
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
qcckPost({id},'/mosty-gsxt/zlxx/delete').then(()=>{
proxy.$message({ type: "success", message: "删除成功" });
const deleteRow = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckPost({ id }, '/mosty-gsxt/zlxx/delete').then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
})
}).catch(() => {});
}).catch(() => { });
}
// 详情
const addEdit = (type, row) => {
isShow.value = true;
nextTick(()=>{
nextTick(() => {
detailDiloag.value.init(type, row);
})
};
watch(() => route.query.id, (val) => {
if (val) {
addEdit('detail', {id:route.query.id});
addEdit('detail', { id: route.query.id });
}
},{deep:true})
}, { deep: true })
// 签收
const signRow = (row) =>{
proxy.$confirm("确定要签收", "警告", {type: "warning"}).then(() => {
qcckGet({id:row.id},'/mosty-gsxt/zlxx/qs').then(()=>{
proxy.$message({ type: "success", message: "签收成功" });
const signRow = (row) => {
proxy.$confirm("确定要签收", "警告", { type: "warning" }).then(() => {
qcckGet({ id: row.id }, '/mosty-gsxt/zlxx/qs').then(() => {
proxy.$message({ type: "success", message: "签收成功" });
getList();
})
}).catch(() => {});
}).catch(() => { });
}
// 反馈
const isShowFk = ref(false)
const dataList = ref()
const fkRow = (row) => {
if (row.sfqs=='0') {
proxy.$message({ type: "error", message: "请先签收" });
if (row.sfqs == '0') {
proxy.$message({ type: "error", message: "请先签收" });
return;
}
isShowFk.value = true;
dataList.value = {...row};
dataList.value = { ...row };
}
const showBtn = (row) => {
let item = row.xfbmList.find(v => v.ssbmdm == userInfo.value.deptCode)
return item?true:false
return item ? true : false
// // if (item) {
// // return item.zlzt == '01' ? 'sign' : item.zlzt == '02' ? 'feedback' : ''
// // } else {
// // return ''
// // }
}
const canDelete = (row) => {
const roleList = getItem('roleList') || []
const roleCodes = roleList.map(r => r.roleCode)
if (roleCodes.includes('JS_666666') || roleCodes.includes('JS_777777')) return true
if (roleCodes.includes('JS_888888')) return row.ssbmdm == userInfo.value?.deptCode
return false
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 220;

View File

@ -81,7 +81,7 @@ import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import { qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const {D_GS_ZDQT_FXDJ,D_GS_XS_ZLLX,D_GS_XS_CZZT,D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_ZDQT_FXDJ","D_GS_XS_ZLLX","D_GS_XS_CZZT","D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
const {D_GS_ZDQT_FXDJ,D_GS_XS_ZLLX,/*D_GS_XS_CZZT,*/D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_ZDQT_FXDJ","D_GS_XS_ZLLX",/*"D_GS_XS_CZZT",*/"D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const isShow = ref(false)

View File

@ -90,7 +90,7 @@ import Detail from "./components/detail.vue";
import { qcckGet, qcckPost, ParsingText } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const {D_GS_ZDQT_FXDJ,D_GS_XS_ZLLX,D_GS_XS_CZZT,D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_ZDQT_FXDJ","D_GS_XS_ZLLX","D_GS_XS_CZZT","D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
const {/*D_GS_ZDQT_FXDJ,*//*D_GS_XS_ZLLX,*//*D_GS_XS_CZZT,*/D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB/*,D_BZ_XSSHZT*/} = proxy.$dict(/*"D_GS_ZDQT_FXDJ",*//*"D_GS_XS_ZLLX",*//*"D_GS_XS_CZZT",*/"D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB"/*,"D_BZ_XSSHZT"*/); //获取字典数据
const detailDiloag = ref();
const detailForm = ref();
const searchBox = ref(); //搜索框

View File

@ -1,91 +1,38 @@
<template>
<section class="query-wrap">
<div class="query-title">{{ title }}</div>
<div class="query-grid">
<div class="query-title" @click="toggleCollapse">
<span class="title-text">{{ title }}</span>
<el-icon class="collapse-icon" :class="{ 'is-collapsed': isCollapsed }">
<ArrowDown />
</el-icon>
</div>
<div class="query-grid" v-show="!isCollapsed">
<div v-for="field in renderFields" :key="field.key" class="query-cell">
<div class="cell-label">{{ field.label }}</div>
<div
class="cell-control"
:class="{ 'is-checkbox': field.type === 'checkbox' }"
>
<el-input
clearable
v-if="field.type === 'input'"
v-model="formState[field.key]"
class="control-input"
:placeholder="field.placeholder || ''"
/>
<el-input
clearable
v-else-if="field.type === 'number'"
v-model="formState[field.key]"
class="control-input"
type="number"
:placeholder="field.placeholder || ''"
/>
<el-select
clearable
v-else-if="field.type === 'select'"
v-model="formState[field.key]"
class="control-select"
:placeholder="field.placeholder || '请选择'"
:multiple="field.multiple || false"
collapse-tags
collapse-tags-tooltip
>
<el-option
v-for="item in field.options || []"
:key="item.value ?? item"
:label="item.label ?? item"
:value="item.value ?? item"
/>
<div class="cell-control" :class="{ 'is-checkbox': field.type === 'checkbox' }">
<el-input clearable v-if="field.type === 'input'" v-model="formState[field.key]" class="control-input"
:placeholder="field.placeholder || ''" />
<el-input clearable v-else-if="field.type === 'number'" v-model="formState[field.key]" class="control-input"
type="number" :placeholder="field.placeholder || ''" />
<el-select clearable v-else-if="field.type === 'select'" v-model="formState[field.key]" class="control-select"
:placeholder="field.placeholder || '请选择'" :multiple="field.multiple || false" collapse-tags
collapse-tags-tooltip>
<el-option v-for="item in field.options || []" :key="item.value ?? item" :label="item.label ?? item"
:value="item.value ?? item" />
</el-select>
<el-date-picker
clearable
v-else-if="field.type === 'date'"
v-model="formState[field.key]"
class="control-date"
type="date"
:placeholder="field.placeholder || '请选择日期'"
value-format="YYYY-MM-DD"
/>
<el-date-picker
clearable
v-else-if="field.type === 'datetime'"
v-model="formState[field.key]"
class="control-date"
type="datetime"
:placeholder="field.placeholder || '请选择时间'"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<el-date-picker
clearable
v-else-if="field.type === 'daterange'"
v-model="formState[field.key]"
class="control-date"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
/>
<el-date-picker
clearable
v-else-if="field.type === 'datetimerange'"
v-model="formState[field.key]"
class="control-date"
type="datetimerange"
range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<el-date-picker clearable v-else-if="field.type === 'date'" v-model="formState[field.key]"
class="control-date" type="date" :placeholder="field.placeholder || '请选择日期'" value-format="YYYY-MM-DD" />
<el-date-picker clearable v-else-if="field.type === 'datetime'" v-model="formState[field.key]"
class="control-date" type="datetime" :placeholder="field.placeholder || '请选择时间'"
value-format="YYYY-MM-DD HH:mm:ss" />
<el-date-picker clearable v-else-if="field.type === 'daterange'" v-model="formState[field.key]"
class="control-date" type="daterange" range-separator="" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="YYYY-MM-DD" />
<el-date-picker clearable v-else-if="field.type === 'datetimerange'" v-model="formState[field.key]"
class="control-date" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" value-format="YYYY-MM-DD HH:mm:ss" />
<template v-else-if="field.type === 'department'">
<MOSTY.Department
clearable
v-model="formState[field.key]"
class="control-select"
/>
<MOSTY.Department clearable v-model="formState[field.key]" class="control-select" />
</template>
<div v-else-if="field.type === 'checkbox'" class="checkbox-wrap">
<el-checkbox v-model="formState[field.key]" />
@ -104,8 +51,7 @@
<el-button size="small" type="primary" @click="handleSearch">{{
searchText
}}</el-button>
<el-button size="small" type="button" @click="handleReset"
>重置
<el-button size="small" type="button" @click="handleReset">重置
</el-button>
</div>
</div>
@ -113,7 +59,8 @@
</template>
<script setup>
import { computed, reactive, watch } from "vue";
import { computed, reactive, ref, watch } from "vue";
import { ArrowDown } from '@element-plus/icons-vue';
import * as MOSTY from "@/components/MyComponents/index";
const props = defineProps({
title: {
@ -132,15 +79,33 @@ const props = defineProps({
type: Array,
default: () => []
},
defaultCollapsed: {
type: Boolean,
default: true
},
collapsedHeight: {
type: Number,
default: 34
},
expandedHeight: {
type: Number,
default: 276
}
});
const emit = defineEmits(['update:modelValue',"search", "submit", "reset"]);
const emit = defineEmits(['update:modelValue', "search", "submit", "reset", "collapse"]);
const formState = reactive({});
const isCollapsed = ref(props.defaultCollapsed);
watch(()=>formState,val=>{
emit('update:modelValue',val)
},{immediate:true})
const toggleCollapse = () => {
isCollapsed.value = !isCollapsed.value;
emit('collapse', isCollapsed.value);
};
watch(() => formState, val => {
emit('update:modelValue', val)
}, { immediate: true })
const renderFields = computed(() => {
@ -236,7 +201,9 @@ watch(
defineExpose({
formState,
handleSearch,
handleReset
handleReset,
isCollapsed,
collapsedHeight: props.collapsedHeight
});
</script>
@ -244,22 +211,46 @@ defineExpose({
.query-wrap {
border: 1px solid #b8d3ff;
background: #fff;
overflow: hidden;
display: flex;
flex-direction: column;
}
.query-title {
height: 32px;
background: linear-gradient(to right, #9ed7ff, #e6f0f8);
line-height: 32px;
padding-left: 10px;
padding: 0 10px;
font-size: 16px;
font-weight: 700;
color: #0d2148;
border-bottom: 1px solid #b8d3ff;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
user-select: none;
.title-text {
flex: 1;
}
.collapse-icon {
font-size: 16px;
color: #0d2148;
transition: transform 0.3s;
&.is-collapsed {
transform: rotate(-90deg);
}
}
}
.query-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
flex: 1;
align-content: start;
}
.query-cell {
@ -366,6 +357,7 @@ defineExpose({
.query-action {
height: 36px;
flex-shrink: 0;
display: flex;
// justify-content: flex-end;
justify-content: space-between;

View File

@ -7,9 +7,9 @@
:align="selectionColumnAlign" />
<el-table-column v-for="column in columns" :key="column.prop || column.label || column.type" :prop="column.prop"
:type="column.type" :label="column.label" :width="column.width" :min-width="column.minWidth"
:align="column.align" :show-overflow-tooltip="true">
:align="column.align" :show-overflow-tooltip="isColumnOverflow(column)">
<template v-if="column.slotName" #default="scope">
<slot v-if="column.slotName" :name="column.slotName" :row="scope.row" :column="column"
<slot :name="column.slotName" :row="scope.row" :column="column"
:$index="scope.$index">
{{ column.prop ? scope.row[column.prop] : '' }}
</slot>
@ -87,6 +87,15 @@ const onSelectionChange = (selection) => {
emit('selection-change', selection)
emit('row-change', selection[0] || null)
}
// 判断列是否需要overflow tooltip只有当列有值时才启用
const isColumnOverflow = (column) => {
if (!column.prop) return false
return props.data.some(row => {
const val = row[column.prop]
return val !== undefined && val !== null && val !== ''
})
}
</script>
<style scoped lang="scss">

View File

@ -1,7 +1,9 @@
<template>
<div class="ces-page">
<QueryFormPanel :fields="queryFields" @search="handleSearch" />
<WarnDataTable :data="tableData" :columns="columns" :selection-mode="selectionMode" :loading="loading">
<div ref="queryFormRef">
<QueryFormPanel :fields="queryFields" @search="handleSearch" @collapse="handleCollapse" />
</div>
<WarnDataTable :data="tableData" :columns="columns" :selection-mode="selectionMode" :loading="loading" :tableHeight="tableHeight">
<template #status="{ row }">
<span class="status" :class="row.statusClass">{{ row.status }}</span>
</template>
@ -18,14 +20,37 @@
</div>
</template>
<script setup>
import { ref } from 'vue'
import { ref, onMounted, nextTick } from 'vue'
import QueryFormPanel from './components/QueryFormPanel.vue'
import WarnDataTable from './components/WarnDataTable.vue'
const queryFormRef = ref()
const tableHeight = ref('600px')
const selectionMode = ref('multiple')
const loading = ref(false)
const lastQueryParams = ref({})
const calcTableHeight = () => {
nextTick(() => {
const queryEl = queryFormRef.value
if (queryEl) {
const queryHeight = queryEl.offsetHeight
const pageHeight = window.innerHeight
const padding = 40
tableHeight.value = pageHeight - queryHeight - padding
}
})
}
const handleCollapse = () => {
setTimeout(calcTableHeight, 350)
}
onMounted(() => {
calcTableHeight()
window.addEventListener('resize', calcTableHeight)
})
const handleSearch = (params) => {
lastQueryParams.value = params
}

View File

@ -1,12 +1,6 @@
<template>
<div>
<PageTitle
:malginLeft="10"
:height="35"
backgroundColor="#ffff"
:marginBottom="5"
:marginTop="5"
>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<!-- -->
<template v-for="(item, index) in butList" :key="index">
@ -24,17 +18,13 @@
>{{ item }}</el-button
>
</template>
<el-select
v-model="value"
placeholder="请选择预警类型"
@change="qh = value"
>
<el-option label="人像预警" value="人像预警" />
<el-option label="车辆预警" value="车辆预警" />
<el-option label="区域预警" value="区域预警" />
<el-option label="布控预警" value="布控预警" />
</el-select>
</el-popover> -->
<el-select v-model="value" placeholder="请选择预警类型" @change="qh = value">
<el-option label="人像预警" value="人像预警" />
<el-option label="车辆预警" value="车辆预警" />
<el-option label="区域预警" value="区域预警" />
<el-option label="布控预警" value="布控预警" />
</el-select>
</el-popover> -->
<!-- <el-popover
placement="right"
:width="240"
@ -59,12 +49,7 @@
<el-option label="组合预警" value="组合预警" />
</el-select>
</el-popover> -->
<el-button
:type="qh == item ? 'primary' : 'default'"
@click="qh = item"
size="small"
>{{ item }}</el-button
>
<el-button :type="qh == item ? 'primary' : 'default'" @click="qh = item" size="small">{{ item }}</el-button>
</template>
</template>
</PageTitle>
@ -93,7 +78,6 @@ import BehaviorWarning from "@/views/backOfficeSystem/fourColorManage/warningCon
import CombinedWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/combinedWarning/index.vue";
import PortraitWarning from "@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/index.vue";
import VehicleWarning from "@/views/backOfficeSystem/fourColorManage/warningList/vehicleWarning/index.vue";
// import ControlWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index.vue";
import RegionalControl from "@/views/backOfficeSystem/fourColorManage/warningControl/regionalControl/index.vue";
import WrjWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/wrjWarning/index.vue";
import PoliticalSecurityWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/politicalSecurity/index.vue";

View File

@ -2,9 +2,9 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<el-button size="small" type="primary" @click="addEdit('add', '')">
<el-button size="small" type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
@ -12,7 +12,7 @@
</el-button>
</Search>
</div>
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button>
<span style="vertical-align: middle">调级</span>
@ -25,7 +25,7 @@
</el-button>
</template>
</PageTitle> -->
</PageTitle> -->
<!-- 表格 -->
<div class="margTop">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
@ -38,7 +38,7 @@
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
@ -51,8 +51,8 @@
<!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :dic="{ D_GS_BQ_LX, D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB }"
@updateDate="getList" />
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/tbGsxtBqzh/sjxspz" :roleIds="roleIds"/>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/tbGsxtBqzh/sjxspz"
:roleIds="roleIds" />
</div>
</template>
@ -155,13 +155,13 @@ const addEdit = (type, row) => {
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
chooseJfBh.value = val.id
tbGsxtBqzhId(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算

View File

@ -12,12 +12,12 @@
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
@ -35,7 +35,7 @@
<template #xwfz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="xwfz" width="90" align="center" label="计算分值"/>
<el-table-column prop="xwfz" width="90" align="center" label="计算分值" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
@ -45,10 +45,11 @@
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs ">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')"
v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
@ -65,20 +66,16 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="02" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl
ref="semdFqzlRef"
:itemData="itemData"
@handleClose="handleClose"
identification="yj"
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"></AddFrom>
<!-- 处置建议 -->
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
@ -91,7 +88,7 @@ import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import {yjzxXwyjSelectList } from "@/api/yj.js";
import { yjzxXwyjSelectList } from "@/api/yj.js";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
@ -109,7 +106,7 @@ const czjyRef = ref()
const permission_sfqs = ref(false)
const roleCode = ref(false)
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB,D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB',"D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
const { D_BZ_YJJB, D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB', "D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
// 字典数据集合
const dict = ref({
@ -130,7 +127,7 @@ const searchConfiger = ref(
{ label: "电话号码", prop: 'dh', placeholder: "请输入电话号码", showType: "input" },
{ label: "预警标签", prop: 'xwms', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
@ -159,8 +156,8 @@ const pageData = reactive({
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "xwms" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "xwcs", showSolt: true,width: 90 },
{ label: "预警分值", prop: "xwfz",showSolt: true },
{ label: "活动频次", prop: "xwcs", showSolt: true, width: 90 },
{ label: "预警分值", prop: "xwfz", showSolt: true },
]
});
@ -178,11 +175,11 @@ const gettbGsxtBqglSelectList = (val) => {
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
@ -193,12 +190,12 @@ onMounted(() => {
});
const handleCzjy = (row) => {
czjyRef.value.init( row)
czjyRef.value.init(row)
}
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value,...val };
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
pageData.pageConfiger.pageCurrent = 1;
@ -265,7 +262,7 @@ const bqYs = (val) => {
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx,val) // 全息档案跳转
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
@ -327,20 +324,20 @@ const openAddModel = (row) => {
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
chooseJfBh.value = val.id
yjzxXwyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function() {
window.onresize = function () {
tabHeightFn();
};
};
@ -375,14 +372,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -406,10 +403,9 @@ const handleQs = () => {
outline-color: #0000ff;
}
.tabBox_zdy{
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
@ -41,7 +41,7 @@
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系</span>
<span class="primary" @click="chooseJfFun(row)">配置系</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddModel(row)">详情</span>
@ -87,7 +87,7 @@ import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import emitter from "@/utils/eventBus.js";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import AddFrom from './components/addFrom.vue'
import { holographicProfileJump } from "@/utils/tools.js"
import { getMultiDictVal } from "@/utils/dict.js"
@ -194,6 +194,7 @@ const onSearch = (val) => {
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
nextTick(tabHeightFn);
}
const reset = () => {
delete queryFrom.value.ksfz
@ -302,12 +303,12 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
/** 触发选中 */

View File

@ -1,61 +1,26 @@
<template>
<el-dialog
:draggable="true"
v-model="showDialog"
:append-to-body="true"
:destroy-on-close="true"
:title="title"
:close-on-click-modal="false"
>
<FormMessage
v-model="listQuery"
:disabled="title == '反馈' ? false : true"
:formList="formData"
labelWidth="160px"
ref="elform"
:rules="rules"
>
<el-dialog :draggable="true" v-model="showDialog" :append-to-body="true" :destroy-on-close="true" :title="title"
:close-on-click-modal="false">
<FormMessage v-model="listQuery" :disabled="title == '反馈' ? false : true" :formList="formData" labelWidth="160px"
ref="elform" :rules="rules">
<template #mbzrmjxm>
<MOSTY.Other
width="100%"
@click="handleChoose('mbzrmjxm')"
clearable
v-model="listQuery.mbzrmjxm"
placeholder="请选择民警"
:readonly="true"
/>
<MOSTY.Other width="100%" @click="handleChoose('mbzrmjxm')" clearable v-model="listQuery.mbzrmjxm"
placeholder="请选择民警" :readonly="true" />
</template>
<template #czzrmj>
<MOSTY.Other
width="100%"
@click="handleChoose('czzrmj')"
clearable
v-model="listQuery.czzrmj"
placeholder="请选择民警"
:readonly="true"
/>
<MOSTY.Other width="100%" @click="handleChoose('czzrmj')" clearable v-model="listQuery.czzrmj"
placeholder="请选择民警" :readonly="true" />
</template>
</FormMessage>
<template #footer>
<div class="flex just-center">
<el-button @click="close">取消</el-button>
<el-button
type="primary"
@click="submitForm"
:loading="loading"
v-if="title == '反馈'"
>确认</el-button
>
<el-button type="primary" @click="submitForm" :loading="loading" v-if="title == '反馈'">确认</el-button>
</div>
</template>
</el-dialog>
<ChooseUser
v-model="chooseUserVisible"
v-if="chooseUserVisible"
@choosedUsers="handleUserSelected"
:roleIds="roleIds"
:Single="true"
/>
<ChooseUser v-model="chooseUserVisible" v-if="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds"
:Single="true" />
</template>
<script setup>
@ -64,6 +29,7 @@ import * as MOSTY from "@/components/MyComponents/index";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { getItem } from "@/utils/storage";
import { onMounted, reactive, ref, getCurrentInstance, onUnmounted, watch } from "vue";
const props = defineProps({
lx: {
@ -88,6 +54,9 @@ const showDialog = ref(false);
const loading = ref(false);
const choosetype = ref("");
const listQuery = ref({});
const userIfo = ref('')
const idEntityCard = ref()
const USERNAME = ref()
const formData = ref([
{ label: "发现目标状态", prop: "mbzt", type: "select", options: D_BZ_SF },
{
@ -96,6 +65,7 @@ const formData = ref([
type: "select",
options: D_YJXX_CKCZJG
},
{ label: "处置经过描述", prop: "czjgms", type: "textarea", width: "100%" },
{
label: "发现目标责任单位",
prop: "mbzrdwdm",
@ -172,7 +142,8 @@ const rules = reactive({
// ckczcsxl: [
// { required: true, message: "请选择常控处置措施细类", trigger: "change" }
// ],
ckczjg: [{ required: true, message: "请输入常控处置结果", trigger: "blur" }]
ckczjg: [{ required: true, message: "请输入常控处置结果", trigger: "blur" }],
czjgms: [{ required: true, message: "请输入常控处置反馈补充信息", trigger: "blur" }]
// cklxzcpg: [
// { required: true, message: "请输入常控立线侦察评估", trigger: "blur" }
// ],
@ -186,43 +157,54 @@ const rules = reactive({
});
const title = ref("");
// 事件处理函数引用,用于正确取消监听
const handleOpenFkDialog = (val) => {
showDialog.value = true;
listQuery.value = { yjid: val.id };
let url = "";
console.log(props.lx);
switch (props.lx) {
case "01":
url = "/mosty-gsxt/tbYjxx/getInfo/";
break;
case "02":
url = "/mosty-gsxt/yjzxXwyj/";
break;
case "03":
url = "/mosty-gsxt/yjzxSfyj/";
break;
case "04":
url = "/mosty-gsxt/yjzxZhyj/";
break;
case "05":
url = "/mosty-gsxt/tbYjxx/getInfo/";
break;
}
title.value = val.type;
if (val.type == "查看反馈") {
qcckGet({}, url + val.id).then((res) => {
let list = res.fkList || [];
listQuery.value = list.length > 0 ? list[0] : {};
});
}
};
// watch 应该在 setup 顶层定义,不要放在 onMounted 内部
watch(() => listQuery.value.mbzt, (newVal) => {
const ckczcslxField = formData.value.find(item => item.prop === 'ckczcslx');
const ckczcsxlField = formData.value.find(item => item.prop === 'ckczcsxl');
if (ckczcslxField) ckczcslxField.show = newVal === '1';
if (ckczcsxlField) ckczcsxlField.show = newVal === '1';
});
// 事件监听应该在 setup 顶层注册,确保组件创建后立即可用
emitter.on("openFkDialog", handleOpenFkDialog);
onMounted(() => {
// 监听 mbzt 变化,动态显示/隐藏常控处置措施字段
watch(() => listQuery.value.mbzt, (newVal) => {
const ckczcslxField = formData.value.find(item => item.prop === 'ckczcslx');
const ckczcsxlField = formData.value.find(item => item.prop === 'ckczcsxl');
if (ckczcslxField) ckczcslxField.show = newVal === '1';
if (ckczcsxlField) ckczcsxlField.show = newVal === '1';
});
emitter.on("openFkDialog", (val) => {
showDialog.value = true;
listQuery.value = { yjid: val.id };
let url = "";
console.log(props.lx);
switch (props.lx) {
case "01":
url = "/mosty-gsxt/tbYjxx/getInfo/";
break;
case "02":
url = "/mosty-gsxt/yjzxXwyj/";
break;
case "03":
url = "/mosty-gsxt/yjzxSfyj/";
break;
case "04":
url = "/mosty-gsxt/yjzxZhyj/";
break;
}
title.value = val.type;
if (val.type == "查看反馈") {
qcckGet({}, url + val.id).then((res) => {
let list = res.fkList || [];
listQuery.value = list.length > 0 ? list[0] : {};
});
}
});
userIfo.value = getItem('deptId') ? getItem('deptId')[0] : {}
idEntityCard.value = getItem('idEntityCard')
USERNAME.value = getItem('USERNAME')
});
const handleChoose = (type) => {
@ -247,7 +229,8 @@ const submitForm = () => {
elform.value.submit((val) => {
loading.value = true;
const prome = {
...listQuery.value
...listQuery.value,
xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode
};
let url = "";
switch (props.lx) {
@ -287,7 +270,8 @@ const close = () => {
};
onUnmounted(() => {
emitter.off("openFkDialog");
// 传递具体的处理函数引用,确保正确移除监听器
emitter.off("openFkDialog", handleOpenFkDialog);
});
</script>

View File

@ -36,7 +36,7 @@
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<el-table-column prop="sffz" width="90" align="center" label="计算分值" />
</template>
<template #expand="{ props }">
<div>
@ -46,7 +46,7 @@
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
@ -148,8 +148,8 @@ const pageData = reactive({
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width:'90' },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ label: "活动频次", prop: "sfcs", width: '90' },
{ label: "预警分值", prop: "sffz", showSolt: true },
]
});
@ -356,14 +356,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {

View File

@ -3,7 +3,7 @@
<!-- 搜索 -->
<div ref="searchBox">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
@ -42,7 +42,7 @@
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系</span>
<span class="primary" @click="chooseJfFun(row)">配置系</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
@ -84,7 +84,7 @@ import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import AddFrom from "./components/addFrom.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js"
@ -175,6 +175,7 @@ const onSearch = (val) => {
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const reset = () => {
@ -305,12 +306,12 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
const handleChooseData = (val) => {

View File

@ -2,93 +2,43 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<QueryFormPanel
v-model="listQuery"
:fields="searchConfiger"
@search="onSearch"
>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search="onSearch" @collapse="tabHeightFn">
<template #but>
<el-button type="primary" @click="exportExl" size="small"
>导出</el-button
>
<el-button type="primary" size="small" @click="handleQs"
>签收</el-button
>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<!-- 表格 -->
<div
class="tabBox_zdy"
:style="{ height: pageData.tableHeight + 40 + 'px' }"
>
<WarnDataTable
:loading="pageData.tableConfiger.loading"
:tableHeight="pageData.tableHeight"
:data="pageData.tableData"
:columns="pageData.tableColumn"
table-class="warn-table"
@selectionChange="handleChooseData"
>
<div class="tabBox_zdy" :style="{ height: pageData.tableHeight + 40 + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img
src="@/assets/images/car.png"
width="30"
height="30"
v-if="row.yjLx == 2"
/>
<img
src="@/assets/images/default_male.png"
width="30"
height="30"
v-else
/>
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image
v-else
style="width: 30px; height: 30px"
:src="row.yjTp"
:preview-src-list="[row.yjTp]"
show-progress
>
<el-image v-else style="width: 30px; height: 30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img
src="@/assets/images/car.png"
width="30"
height="30"
v-if="row.yjLx == 2"
/>
<img
src="@/assets/images/default_male.png"
width="30"
height="30"
v-else
/>
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #czzt="{ row }">
<DictTag
:value="row.czzt"
:color="row.czzt === '01' ? '#ff2424' : '#1d72e8'"
:tag="false"
:options="D_GSXT_YJXX_CZZT"
/>
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" style="cursor: pointer" @click="openBox(row)" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag
:value="row.yjJb"
color="#fff"
:tag="false"
:options="D_BZ_YJJB"
/>
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
@ -107,61 +57,37 @@
<template #operation="{ row }">
<div style="display: flex; justify-content: space-between">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode"
>处置建议</span
>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span
class="success"
@click="handleQsFk(row, '签收')"
v-if="row.czzt == '01'"
>签收</span
>
<span
class="success"
@click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02'"
>反馈</span
>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
</WarnDataTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<FkDialog @change="getList" lx="05" />
<AddFrom
ref="addModelRef"
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"
/>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination
v-model="paginationOpen"
:dataList="dataPres"
:dict="{
D_BZ_XB,
D_BZ_YJJB,
D_GS_QLZDRLX,
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ
}"
/>
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{
D_BZ_XB,
D_BZ_YJJB,
D_GS_QLZDRLX,
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ
}" />
</template>
<script setup>
@ -187,34 +113,34 @@ const { proxy } = getCurrentInstance();
const searchBox = ref();
const {
D_GS_QLZDRLX,
D_BZ_YJLY,
// D_BZ_YJLY,
D_GSXT_YJXX_CZZT,
D_GS_SSYJ,
D_BZ_YJJB,
D_BZ_BKLYS,
// D_BZ_BKLYS,
D_BZ_XB,
D_BZ_SF,
D_GS_CSZT,
D_GS_BKZT,
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ,
D_BZ_SJLY
D_GS_BK_CZYQ
// D_BZ_SJLY
} = proxy.$dict(
"D_GS_QLZDRLX",
"D_BZ_YJLY",
// "D_BZ_YJLY",
"D_GSXT_YJXX_CZZT",
"D_GS_SSYJ",
"D_BZ_YJJB",
"D_BZ_BKLYS",
// "D_BZ_BKLYS",
"D_BZ_XB",
"D_BZ_SF",
"D_GS_CSZT",
"D_GS_BKZT",
"D_GS_ZDR_RYJB",
"D_GS_ZDR_GJLB",
"D_GS_BK_CZYQ",
"D_BZ_SJLY"
"D_GS_BK_CZYQ"
// "D_BZ_SJLY"
);
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ });
// 搜索配置
@ -404,7 +330,7 @@ const pageData = reactive({
{ label: "相似度", slotName: "xsd", align: "center", width: 50 },
{ label: "所属部门", prop: "ssbm", align: "center" },
{ label: "数据来源", slotName: "yjLylx", align: "center" },
{ label: "操作", width: 180, slotName: "operation" },
{ label: "操作", width: 260, slotName: "operation" },
{ label: "超时状态", width: 80, align: "center", slotName: "cszt" },
{ label: "在控状态", width: 70, align: "center", slotName: "zkzt" }
]
@ -437,6 +363,7 @@ const onSearch = (val) => {
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const reset = () => {
@ -523,13 +450,12 @@ const handleCzjy = (row) => {
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
// 指派
const dataList = ref(null);
const warningShow = ref(false);
@ -603,7 +529,7 @@ const handleQs = () => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
};
// 详情

View File

@ -2,71 +2,48 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<QueryFormPanel
v-model="listQuery"
:fields="searchConfiger"
@search="onSearch"
>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search="onSearch" @collapse="tabHeightFn">
<template #but>
<el-button type="primary" @click="exportExl" size="small"
>导出</el-button
>
<el-button
type="primary"
:loading="btnLoading"
size="small"
@click="exportExcelAll"
>筛选导出</el-button
>
<el-button type="primary" size="small" @click="handleQs"
>签收</el-button
>
<el-button type="primary" size="small" @click="handleRelatedWarning"
>关联预警</el-button
>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" :loading="btnLoading" size="small" @click="exportExcelAll">筛选导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleRelatedWarning">关联预警</el-button>
</template>
</QueryFormPanel>
</div>
<!-- 表格 -->
<div
class="tabBox_zdy"
:style="{ height: pageData.tableHeight + 40 + 'px' }"
>
<WarnDataTable
:loading="pageData.tableConfiger.loading"
:tableHeight="pageData.tableHeight"
:data="pageData.tableData"
:columns="pageData.tableColumn"
table-class="warn-table"
@selectionChange="handleChooseData"
>
<div class="tabBox_zdy" :style="{ height: pageData.tableHeight + 40 + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #czzt="{ row }">
<DictTag
:value="row.czzt"
:color="row.czzt === '01' ? '#ff2424' : '#1d72e8'"
:tag="false"
:options="D_GSXT_YJXX_CZZT"
/>
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : row.czzt === '02' ? '#1d72e8' : '#000'"
:tag="false" :options="D_GSXT_YJXX_CZZT" style="cursor: pointer" @click="openBox(row)" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #bkyj="{ row }">
<DictTag :value="row.yjly" :tag="false" :options="D_BZ_SF" v-if="row.yjly" />
<span v-else></span>
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag
:value="row.yjJb"
color="#fff"
:tag="false"
:options="D_BZ_YJJB"
/>
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_GS_ZDR_YJDJ" />
</div>
</template>
<template #qblyjb="{ row }">
<DictTag :value="row.qblyjb" :tag="false" :options="D_BZ_QBLYJB" />
</template>
<template #bksj="{ row }">
<!-- <template #bksj="{ row }">
{{ row.bkkssj && row.bkjssj ? `${row.bkkssj} - ${row.bkjssj}` : "" }}
</template> -->
<template #bkkssj="{ row }">
{{ row.bkkssj ? `${row.bkkssj} ` : "未知" }}
</template>
<template #bkjssj="{ row }">
{{ row.bkjssj ? `${row.bkjssj}` : "未知" }}
</template>
<template #xsd="{ row }">
{{ row.xsd ? row.xsd + "%" : "" }}
@ -82,64 +59,39 @@
<template #operation="{ row }">
<div style="display: flex; justify-content: space-between">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode"
>处置建议</span
>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span
class="success"
@click="handleQsFk(row, '签收')"
v-if="row.czzt == '01'"
>签收</span
>
<span class="success" @click="handleQsFk(row, '反馈')" v-else
>反馈</span
>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')" v-else>反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
</WarnDataTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<FkDialog @change="getList" lx="05" />
<AddFrom
ref="addModelRef"
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"
/>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_GS_ZDR_YJDJ, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination
v-model="paginationOpen"
:dataList="dataPres"
:dict="{
D_BZ_XB,
D_BZ_YJJB,
D_GS_QLZDRLX,
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ
}"
/>
<DeploymentDataDialog
v-model="selectDataVisible"
title="关联预警"
@confirm="handleSelectConfirm"
:currentRelatedRow="currentRelatedRow"
/>
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{
D_BZ_XB,
D_GS_ZDR_YJDJ,
D_GS_QLZDRLX,
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ
}" />
<DeploymentDataDialog v-model="selectDataVisible" title="关联预警" @confirm="handleSelectConfirm"
:currentRelatedRow="currentRelatedRow" />
</template>
<script setup>
@ -152,7 +104,7 @@ import Pages from "@/components/aboutTable/Pages.vue";
import AddFrom from "./components/addFrom.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick, onUnmounted } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js";
@ -160,17 +112,16 @@ import { exportExlByObj } from "@/utils/exportExcel.js";
import { getMultiDictVal } from "@/utils/dict.js";
import Pagination from "./components/particulars.vue";
import DeploymentDataDialog from "../../YjData/DeploymentDataDialog.vue";
const czjyRef = ref();
const { proxy } = getCurrentInstance();
const searchBox = ref();
const {
D_GS_QLZDRLX,
D_BZ_YJLY,
// D_BZ_YJLY,
D_GSXT_YJXX_CZZT,
D_GS_SSYJ,
D_BZ_YJJB,
D_BZ_BKLYS,
D_GS_ZDR_YJDJ,
// D_BZ_BKLYS,
D_BZ_XB,
D_BZ_SF,
D_GS_CSZT,
@ -178,16 +129,16 @@ const {
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ,
D_BZ_SJLY,
// D_BZ_SJLY,
D_BZ_QBLYJB,
D_BZ_BKYJLX
} = proxy.$dict(
"D_GS_QLZDRLX",
"D_BZ_YJLY",
// "D_BZ_YJLY",
"D_GSXT_YJXX_CZZT",
"D_GS_SSYJ",
"D_BZ_YJJB",
"D_BZ_BKLYS",
"D_GS_ZDR_YJDJ",
// "D_BZ_BKLYS",
"D_BZ_XB",
"D_BZ_SF",
"D_GS_CSZT",
@ -195,91 +146,90 @@ const {
"D_GS_ZDR_RYJB",
"D_GS_ZDR_GJLB",
"D_GS_BK_CZYQ",
"D_BZ_SJLY",
// "D_BZ_SJLY",
"D_BZ_QBLYJB",
"D_BZ_BKYJLX"
);
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ });
// 搜索配置
const searchConfiger = ref([
{
label: "处置状态",
prop: "czzt",
showType: "select",
options: D_GSXT_YJXX_CZZT
},
{
label: "预警时间",
prop: "datetime",
showType: "datetimerange",
placeholder: "请选择预警时间"
},
{
label: "姓名",
prop: "yjRyxm",
showType: "input",
placeholder: "请输入姓名"
},
{
label: "身份证号",
prop: "yjRysfzh",
showType: "input",
placeholder: "请输入身份证号"
},
{
label: "管控级别",
prop: "qblyjb",
showType: "select",
options: D_BZ_QBLYJB
},
{
label: "预警级别",
prop: "yjJb",
showType: "select",
options: D_BZ_YJJB,
placeholder: "请选择预警级别",
multiple: true
},
{
label: "布控时间",
prop: "bksj",
showType: "daterange",
placeholder: "请选择布控开始时间"
},
{
label: "接收单位",
prop: "ssbmdm",
showType: "department",
placeholder: "请选择接收单位"
},
{
label: "布控单位",
prop: "gkbmdm",
showType: "department",
placeholder: "请选择布控单位"
},
const searchConfiger = ref([{
label: "姓名",
prop: "yjRyxm",
showType: "input",
placeholder: "请输入姓名"
},
{
label: "身份证号",
prop: "yjRysfzh",
showType: "input",
placeholder: "请输入身份证号"
}, {
label: "预警时间",
prop: "datetime",
showType: "datetimerange",
placeholder: "请选择预警时间"
},
{
label: "布控时间",
prop: "bksj",
showType: "daterange",
placeholder: "请选择布控开始时间"
}, {
label: "处置状态",
prop: "czzt",
showType: "select",
options: D_GSXT_YJXX_CZZT
},
{
label: "管控级别",
prop: "qblyjb",
showType: "select",
options: D_BZ_QBLYJB
},
{
label: "预警级别",
prop: "yjJb",
showType: "select",
options: D_GS_ZDR_YJDJ,
placeholder: "请选择预警级别",
multiple: true
},
{
label: "比对源",
prop: "bkyjlx",
showType: "select",
options: D_BZ_BKYJLX,
placeholder: "请选择比对源"
},
{
label: "超时状态",
prop: "cszt",
placeholder: "请选择超时状态",
showType: "select",
options: D_GS_CSZT
},
{
label: "在控状态",
prop: "zkzt",
showType: "select",
options: D_GS_BKZT,
placeholder: "请选择在控状态"
}
{
label: "布控单位",
prop: "gkbmdm",
showType: "department",
placeholder: "请选择布控单位"
},
{
label: "接收单位",
prop: "ssbmdm",
showType: "department",
placeholder: "请选择接收单位"
},
{
label: "比对源",
prop: "bkyjlx",
showType: "select",
options: D_BZ_BKYJLX,
placeholder: "请选择比对源"
},
{
label: "超时状态",
prop: "cszt",
placeholder: "请选择超时状态",
showType: "select",
options: D_GS_CSZT
},
{
label: "在控状态",
prop: "zkzt",
showType: "select",
options: D_GS_BKZT,
placeholder: "请选择在控状态"
}
]);
const ORDIMG = "https://89.40.7.122:38496/image";
const IMGYM = "https://sg.lz.dsj.xz/dhimage";
@ -308,20 +258,26 @@ const pageData = reactive({
tableColumn: [
{ type: "index", label: "序号", width: 55, align: "center" },
{ label: "处置状态", align: "center", width: 70, slotName: "czzt" },
{ prop: "yjSj", label: "预警时间", width: 150 },
{ prop: "yjSj", label: "预警时间" },
{ prop: "yjRyxm", label: "人员姓名", width: 70, align: "center" },
{ label: "性别", width: 50, align: "center", slotName: "xbdm" },
{ prop: "nl", label: "年龄", width: 50, align: "center" },
{ prop: "yjRysfzh", label: "身份证号", width: 150, align: "center" },
{ prop: "yjRysfzh", label: "身份证号", align: "center" },
{ label: "管控级别", width: 80, align: "center", slotName: "qblyjb" },
{ label: "预警级别", width: 80, align: "center", slotName: "yjJb" },
{ label: "布控时间", width: 80, align: "center", slotName: "bksj" },
{ prop: "ssbm", label: "接收单位", width: 100, align: "center" },
{ label: "布控单位", prop: "gkbmmc", align: "center", width: 100 },
{ prop: "bkyjlx", label: "比对源", align: "center", width: 80 },
// { label: "布控开始时间", width: 80, align: "center", slotName: "bksj" },
// { label: "布控结束时间", width: 80, align: "center", slotName: "bksj" },
{ label: "布控开始时间", width: 80, align: "center", slotName: "bkkssj" },
{ label: "布控结束时间", width: 80, align: "center", slotName: "bkjssj" },
// row.bkkssj && row.bkjssj
{ prop: "ssbm", label: "接收单位", width: 80, align: "center" },
// { prop: "bkyjlx", label: "比对源", align: "center", width: 80 },
{ label: "本地布控", align: "center", width: 80, slotName: "bkyj" },
{ label: "相似度", slotName: "xsd", align: "center", width: 50 },
{ label: "布控单位", prop: "gkbmmc", align: "center", width: 100 },
{ label: "预警内容", prop: "yjNr", align: "center" },
{ label: "操作", width: 180, slotName: "operation" },
{ prop: "zjfknr", label: "最近反馈", width: 100, align: "center" },
{ label: "操作", width: 200, slotName: "operation" },
{ label: "超时状态", width: 80, align: "center", slotName: "cszt" },
{ label: "在控状态", width: 70, align: "center", slotName: "zkzt" }
// { prop: "bkkssj", label: "布控开始时间", align: "center" },
@ -339,18 +295,6 @@ const pageData = reactive({
]
});
onMounted(() => {
let str = getItem("deptId") ? getItem("deptId")[0].deptLevel : "";
permission_sfqs.value = str.startsWith("2" || "3") ? false : true;
let rols = getItem("roleList") ? getItem("roleList") : [];
let obj = rols.find((item) => {
return ["JS_666666", "JS_777777", "JS_888888"].includes(item.roleCode);
});
roleCode.value = obj ? true : false;
tabHeightFn();
getList();
});
const onSearch = (val) => {
queryFrom.value = {
@ -365,6 +309,7 @@ const onSearch = (val) => {
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const reset = () => {
@ -410,7 +355,7 @@ const handleQsFk = (val, type) => {
proxy
.$confirm("是否确定要签收?", "警告", { type: "warning" })
.then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
qcckPost({ id: val.id, xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = "02";
getList();
proxy.$message({ type: "success", message: "签收成功" });
@ -454,13 +399,12 @@ const handleCzjy = (row) => {
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
// 指派
const dataList = ref(null);
const warningShow = ref(false);
@ -518,7 +462,8 @@ const handleExportData = (arr) => {
xsd_name: "相似度",
yjNr: "预警内容",
cszt_name: "超时状态",
zkzt_name: "在控状态"
zkzt_name: "在控状态",
zjfknr: "最近反馈"
};
const data = arr.map((item, index) => {
return {
@ -526,7 +471,7 @@ const handleExportData = (arr) => {
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
xbdm_name: getMultiDictVal(item.xbdm, D_BZ_XB),
qblyjb_name: getMultiDictVal(item.qblyjb, D_BZ_QBLYJB),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
yjJb_name: getMultiDictVal(item.yjJb, D_GS_ZDR_YJDJ),
bkyjlx_name: getMultiDictVal(item.bkyjlx, D_BZ_BKYJLX),
xsd_name: (item.xsd > 0 ? item.xsd : 0) + "%",
cszt_name: getMultiDictVal(item.cszt, D_GS_CSZT),
@ -556,7 +501,7 @@ const handleQs = () => {
.$confirm(texy, "警告", { type: "warning" })
.then(() => {
let ids = wqs.map((item) => item.id);
qcckPost({ ids }, "/mosty-gsxt/tbYjxx/batchQs")
qcckPost({ ids, xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode }, "/mosty-gsxt/tbYjxx/batchQs")
.then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
@ -565,7 +510,7 @@ const handleQs = () => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
};
// 详情
@ -601,6 +546,41 @@ const handleSelectConfirm = (selectedData) => {
// 这里可以调用接口进行关联操作
// qcckPost({ ... }, "/api/xxx").then(res => { ... })
};
const userIfo = ref('')
const idEntityCard = ref()
const USERNAME = ref()
// 新增一个定时器
const timer = ref(null)
onMounted(() => {
let str = getItem("deptId") ? getItem("deptId")[0].deptLevel : "";
permission_sfqs.value = str.startsWith("2" || "3") ? false : true;
let rols = getItem("roleList") ? getItem("roleList") : [];
let obj = rols.find((item) => {
return ["JS_666666", "JS_777777", "JS_888888"].includes(item.roleCode);
});
roleCode.value = obj ? true : false;
userIfo.value = getItem('deptId') ? getItem('deptId')[0] : {}
idEntityCard.value = getItem('idEntityCard')
USERNAME.value = getItem('USERNAME')
tabHeightFn();
getList();
// 先清除再创建,防止重复
if (timer.value) {
clearInterval(timer.value);
}
timer.value = setInterval(() => {
getList();
}, 1000 * 60 * 5);
});
onUnmounted(() => {
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
});
</script>
<style lang="scss" scoped>

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' />
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn" />
</div>
<!-- 表格 -->
@ -58,7 +58,7 @@ import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPan
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { bqYs } from '@/utils/tools.js'
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB, D_BZ_YJLX, D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB", "D_BZ_YJLX", 'D_BZ_YJLY'); //获取字典数据
@ -120,6 +120,7 @@ const onSearch = (val) => {
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
nextTick(tabHeightFn);
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
@ -178,9 +179,12 @@ const pushAssess = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 240;
window.onresize = function () { tabHeightFn(); };
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 240;
});
};
window.addEventListener('resize', tabHeightFn);
</script>
<style scoped lang="scss">

View File

@ -12,7 +12,7 @@
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
@ -37,12 +37,12 @@
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<el-table-column prop="sffz" width="90" align="center" label="计算分值" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
@ -137,13 +137,13 @@ const pageData = reactive({
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" ,width: 180},
{ label: "预警时间", prop: "yjsj", width: 180 },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" ,width: 180},
{ label: "身份证号", prop: "sfzh", width: 180 },
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width: 90 },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ label: "活动频次", prop: "sfcs", width: 90 },
{ label: "预警分值", prop: "sffz", showSolt: true },
]
});
@ -370,14 +370,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {

View File

@ -2,109 +2,57 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<QueryFormPanel :fields="searchConfiger" @search="onSearch">
<QueryFormPanel :fields="searchConfiger" @search="onSearch" @collapse="tabHeightFn">
<template #yjfz>
<div>
<el-input
v-model="queryFrom.yjksfz"
type="number"
placeholder="开始分值"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input
v-model="queryFrom.yjjsfz"
type="number"
placeholder="结束分值"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input v-model="queryFrom.yjksfz" type="number" placeholder="开始分值" style="width: 130px" clearable
:min="0"></el-input>
<el-input v-model="queryFrom.yjjsfz" type="number" placeholder="结束分值" style="width: 130px" clearable
:min="0"></el-input>
</div>
</template>
<template #yjcs>
<div>
<el-input
v-model="queryFrom.ksyjcs"
type="number"
placeholder="开始次数"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input
v-model="queryFrom.jsyjcs"
type="number"
placeholder="结束次数"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input v-model="queryFrom.ksyjcs" type="number" placeholder="开始次数" style="width: 130px" clearable
:min="0"></el-input>
<el-input v-model="queryFrom.jsyjcs" type="number" placeholder="结束次数" style="width: 130px" clearable
:min="0"></el-input>
</div>
</template>
<template #but>
<el-button type="primary" @click="exportExl" size="small"
>导出</el-button
>
<el-button
type="primary"
:loading="btnLoading"
size="small"
@click="exportExcelAll"
>筛选导出</el-button
>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs"
>签收</el-button
>
<el-button type="primary" :loading="btnLoading" size="small" @click="exportExcelAll">筛选导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<!-- 表格 -->
<div :style="{ height: pageData.tableHeight + 40 + 'px' }" class="bgTable">
<WarnDataTable
:loading="pageData.tableConfiger.loading"
:tableHeight="pageData.tableHeight"
:data="pageData.tableData"
:columns="pageData.tableColumn"
table-class="warn-table"
@selectionChange="handleChooseData"
>
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff" @click="handleClick(row)">{{
row.sfcs
}}</span>
</template>
<template #yjcs="{ row }">
<span
style="color: #0072ff; cursor: pointer"
@click="openYjDetail(row)"
>{{ row.yjcs }}</span
>
<span style="color: #0072ff; cursor: pointer" @click="openYjDetail(row)">{{ row.yjcs }}</span>
</template>
<template #czzt="{ row }">
<DictTag
:value="row.czzt"
:color="row.czzt === '01' ? '#ff2424' : '#1d72e8'"
:tag="false"
:options="D_GSXT_YJXX_CZZT"
/>
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJBQLX" />
</template>
<template #yjjb="{ row }">
<div :style="{ 'background-color': ys(row) }">
<DictTag
:value="row.yjjb"
color="#fff"
:tag="false"
:options="D_BZ_YJJB"
/>
<DictTag :value="row.yjjb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #nl="{ row }">
@ -116,79 +64,40 @@
<template #operation="{ row }">
<div style="display: flex; justify-content: space-between">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode"
>处置建议</span
>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span
class="success"
@click="handleQsFk(row, '签收')"
v-if="row.czzt == '01' && permission_sfqs"
>签收</span
>
<span
class="success"
@click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs"
>反馈</span
>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系数</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddFrom(row)">详情</span>
</div>
</template>
</WarnDataTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="03" />
<Information
v-model="showDialog"
title="发送指令"
@submit="submit"
@close="closeFszl"
>
<SemdFqzl
ref="semdFqzlRef"
:itemData="itemData"
@handleClose="handleClose"
identification="yj"
:tacitly="tacitly"
/>
<Information v-model="showDialog" title="发送指令" @submit="submit" @close="closeFszl">
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<AddFrom
ref="addModelRef"
:dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"
/>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<Xwbq ref="xwbqRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<Sfbq ref="sfbqRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf
v-model="chooseJfShow"
titleValue="选择系数"
:Single="false"
:chooseJfBh="chooseJfBh"
url="/yjzxSfyj/sjxspz"
:roleIds="roleIds"
/>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxSfyj/sjxspz"
:roleIds="roleIds" />
<!-- 预警详情弹窗 -->
<dialogYjList
v-model="yjDetailVisible"
:dataList="yjDetailData"
:dict="{ D_BZ_JQLY, JQLB, D_BZ_JQDJ, JQXL, JQLX }"
/>
<dialogYjList v-model="yjDetailVisible" :dataList="yjDetailData" :dict="{ D_BZ_JQLY, JQLB, D_BZ_JQDJ, JQXL, JQLX }" />
</template>
<script setup>
@ -203,7 +112,7 @@ import Xwbq from "./components/xwbq.vue";
import Sfbq from "./components/sfbq.vue";
import ChooseJf from "@/components/ChooseList/ChooseJf/index.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList, yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from "@/api/zdr";
@ -227,7 +136,7 @@ const {
D_BZ_YJJB,
D_BZ_YJBQLX,
D_BZ_JQDJ,
D_GS_BQ_DJ,
// D_GS_BQ_DJ,
JQLB,
D_BZ_JQLY,
JQXL
@ -237,7 +146,7 @@ const {
"D_BZ_YJJB",
"D_BZ_YJBQLX",
"D_BZ_JQDJ",
"D_GS_BQ_DJ",
// "D_GS_BQ_DJ",
"JQLB",
"D_BZ_JQLY",
"JQXL"
@ -360,6 +269,7 @@ const onSearch = (val) => {
}
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const changeNo = (val) => {
@ -406,21 +316,21 @@ const gettbGsxtBqglSelectList = (val) => {
queryFrom.value.bqxl = "";
bqLbData.value.bqXl = res.data
? res.data.map((item) => {
return {
label: item.bqMc,
value: item.bqDm
};
})
return {
label: item.bqMc,
value: item.bqDm
};
})
: [];
} else {
bqLbData.value.bqDl = res
? res.map((item) => {
return {
label: item.bqMc,
value: item.bqDm,
id: item.id
};
})
return {
label: item.bqMc,
value: item.bqDm,
id: item.id
};
})
: [];
}
});
@ -537,12 +447,12 @@ const handleCzjy = (row) => {
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
/** 选中项 */
const selectRows = ref([]);
const handleChooseData = (val) => {
@ -553,7 +463,7 @@ const btnLoading = ref(false);
const exportExcelAll = () => {
btnLoading.value = true;
let params = { ...queryFrom.value };
params.startTime = queryFrom.value.dateTime ? queryFrom.value.dateTime[0]: "";
params.startTime = queryFrom.value.dateTime ? queryFrom.value.dateTime[0] : "";
params.endTime = queryFrom.value.dateTime ? queryFrom.value.dateTime[1] : "";
delete params.dateTime;
qcckPost(params, "/mosty-gsxt/tbYjxx/getBqyjList").then((res) => {
@ -627,7 +537,7 @@ const handleQs = () => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
};
const ys = (item) => {
switch (item.yjjb) {

View File

@ -12,7 +12,7 @@
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
@ -37,12 +37,12 @@
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<el-table-column prop="sffz" width="90" align="center" label="计算分值" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
@ -137,13 +137,13 @@ const pageData = reactive({
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" ,width: 180},
{ label: "预警时间", prop: "yjsj", width: 180 },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" ,width: 180},
{ label: "身份证号", prop: "sfzh", width: 180 },
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width: 90 },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ label: "活动频次", prop: "sfcs", width: 90 },
{ label: "预警分值", prop: "sffz", showSolt: true },
]
});
@ -370,14 +370,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<QueryFormPanel :fields="searchConfiger" @search='onSearch'>
<QueryFormPanel :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn">
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
@ -31,7 +31,7 @@
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系</span>
<span class="primary" @click="chooseJfFun(row)">配置系</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
@ -71,7 +71,7 @@ import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList, yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr'
@ -162,6 +162,7 @@ const onSearch = (val) => {
}
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const changeNo = (val) => {
@ -306,11 +307,12 @@ const handleCzjy = (row) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {

View File

@ -39,10 +39,10 @@ import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_MXGL_MXLX } = proxy.$dict("D_MXGL_MXLX")
const { /* D_MXGL_MXLX */ } = proxy.$dict(/* "D_MXGL_MXLX" */)
// 搜索配置
const searchConfiger = ref([
{ label: "模型类型", prop: 'mxlx', placeholder: "请选择模型类型", showType: "select", options: D_MXGL_MXLX },
{ label: "模型类型", prop: 'mxlx', placeholder: "请选择模型类型", showType: "select", options: [] /* D_MXGL_MXLX */ },
]);
const queryFrom = ref({});

View File

@ -1,46 +1,20 @@
<template>
<el-dialog
:draggable="true"
v-model="showDialog"
:append-to-body="true"
:destroy-on-close="true"
:title="title"
:close-on-click-modal="false"
width="700px"
>
<FormMessage
v-model="listQuery"
:formList="formData"
labelWidth="150px"
ref="elform"
:rules="rules"
>
<el-dialog :draggable="true" v-model="showDialog" :append-to-body="true" :destroy-on-close="true" :title="title"
:close-on-click-modal="false" width="700px">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="150px" ref="elform" :rules="rules">
<template #fkrxm>
<MOSTY.Other
width="100%"
@click="handleChoose('fkrxm')"
clearable
v-model="listQuery.fkrxm"
placeholder="请选择反馈人"
:readonly="true"
/>
<MOSTY.Other width="100%" @click="handleChoose('fkrxm')" clearable v-model="listQuery.fkrxm"
placeholder="请选择反馈人" :readonly="true" />
</template>
</FormMessage>
<template #footer>
<div class="flex just-center">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submitForm" :loading="loading"
>确认</el-button
>
<el-button type="primary" @click="submitForm" :loading="loading">确认</el-button>
</div>
</template>
</el-dialog>
<ChooseUser
v-model="chooseUserVisible"
v-if="chooseUserVisible"
@choosedUsers="handleUserSelected"
:Single="true"
/>
<ChooseUser v-model="chooseUserVisible" v-if="chooseUserVisible" @choosedUsers="handleUserSelected" :Single="true" />
</template>
<script setup>
@ -49,6 +23,7 @@ import emitter from "@/utils/eventBus.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
import * as MOSTY from "@/components/MyComponents/index";
import { getItem } from "@/utils/storage.js"
import { onMounted, reactive, ref, getCurrentInstance, onUnmounted } from "vue";
const emit = defineEmits(["change"]);
const { proxy } = getCurrentInstance();
@ -58,7 +33,9 @@ const { D_BZ_SF, D_ZB_CZCS, D_ZB_CZJG } = proxy.$dict(
"D_ZB_CZCS",
"D_ZB_CZJG"
);
const userIfo = ref('')
const idEntityCard = ref()
const USERNAME = ref()
const elform = ref();
const showDialog = ref(false);
const loading = ref(false);
@ -82,6 +59,7 @@ const formData = ref([
type: "select",
options: D_ZB_CZCS
},
{ label: "处置经过描述", prop: "czjgms", type: "textarea", width: "100%" },
{
label: "是否下发预警信息",
prop: "sfxfyj",
@ -99,20 +77,21 @@ const formData = ref([
type: "department"
},
{ label: "反馈人单位联系电话", prop: "fkrdwlxdh", type: "input" },
{ label: "处置经过描述", prop: "czjgms", type: "textarea", width: "100%" },
{ label: "处置备注", prop: "czbz", type: "textarea", width: "100%" },
{ label: "备注", prop: "bz", type: "textarea", width: "100%" }
]);
const rules = reactive({
czjg: [{ required: true, message: "请选择处置结果", trigger: "change" }],
czsj: [{ required: true, message: "请选择处置时间", trigger: "change" }],
cqcs: [{ required: true, message: "请选择采取措施", trigger: "change" }]
cqcs: [{ required: true, message: "请选择采取措施", trigger: "change" }],
czjgms: [{ required: true, message: "请输入处置经过描述", trigger: "change" }]
});
onMounted(() => {
userIfo.value = getItem('deptId') ? getItem('deptId')[0] : {}
idEntityCard.value = getItem('idEntityCard')
USERNAME.value = getItem('USERNAME')
emitter.on("openZbFkDialog", (val) => {
showDialog.value = true;
title.value = val.type || "反馈";
@ -140,7 +119,8 @@ const submitForm = () => {
elform.value.submit((val) => {
loading.value = true;
const prome = {
...listQuery.value
...listQuery.value,
xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode
};
qcckPost(prome, "/mosty-gsxt/tbYjxx/swyjfk")
.then(() => {

View File

@ -4,72 +4,30 @@
<div ref="searchBox" class="mt10 mb10">
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel
v-model="queryFrom"
:fields="searchConfiger"
ref="searchDom"
@search="onSearch"
>
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search="onSearch"
@collapse="tabHeightFn">
<template #yjCs>
<div>
<el-input
v-model="queryFrom.yjkscs"
type="number"
placeholder="开始次数"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input
v-model="queryFrom.yjjscs"
type="number"
placeholder="结束次数"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input v-model="queryFrom.yjkscs" type="number" placeholder="开始次数" style="width: 130px" clearable
:min="0"></el-input>
<el-input v-model="queryFrom.yjjscs" type="number" placeholder="结束次数" style="width: 130px" clearable
:min="0"></el-input>
</div>
</template>
<template #nl>
<div>
<el-input
v-model="queryFrom.ksnl"
type="number"
placeholder="开始年龄"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input
v-model="queryFrom.jsnl"
type="number"
placeholder="结束年龄"
style="width: 130px"
clearable
:min="0"
></el-input>
<el-input v-model="queryFrom.ksnl" type="number" placeholder="开始年龄" style="width: 130px" clearable
:min="0"></el-input>
<el-input v-model="queryFrom.jsnl" type="number" placeholder="结束年龄" style="width: 130px" clearable
:min="0"></el-input>
</div>
</template>
<template #but>
<el-button type="primary" size="small" @click="exportExl"
>批量导出</el-button
>
<el-button
type="primary"
:loading="btnLoading"
size="small"
@click="exportExcelAll"
>筛选导出</el-button
>
<el-button type="primary" size="small" @click="handleQs"
>批量签收</el-button
>
<el-button type="primary" size="small" @click="handleQs"
>批量分析</el-button
>
<el-button type="primary" size="small" @click="countPeople"
>计算人数</el-button
>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" :loading="btnLoading" size="small" @click="exportExcelAll">筛选导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</div>
@ -83,88 +41,51 @@
</PageTitle> -->
<!-- 表格 -->
<div style="background-color: #fff">
<WarnDataTable
:loading="pageData.tableConfiger.loading"
:tableHeight="pageData.tableHeight"
:data="pageData.tableData"
:columns="pageData.tableColumn"
table-class="warn-table"
@selectionChange="handleChooseData"
>
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag
:value="row.czzt"
:color="row.czzt === '01' ? '#ff2424' : '#1d72e8'"
:tag="false"
:options="D_GSXT_YJXX_CZZT"
/>
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : row.czzt === '02' ? '#1d72e8' : '#000'"
:tag="false" :options="D_GSXT_YJXX_CZZT" style="cursor: pointer" @click="particularsOpen(row)" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag
:value="row.yjJb"
color="#fff"
:tag="false"
:options="D_BZ_YJJB"
/>
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<!-- <template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
</template> -->
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex; justify-content: space-between">
<span
class="primary"
@click="handleQsFk(row)"
v-if="row.czzt == '01'"
>签收</span
>
<span class="primary" @click="handleQsFk(row, '反馈')" v-else
>反馈</span
>
<span class="primary" @click="handleQsFk(row)" v-if="row.czzt == '01'">签收</span>
<span class="primary" @click="handleQsFk(row, '反馈')" v-else>反馈</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span
class="warning"
@click="failWarning(row)"
v-if="row.sfbc != '1'"
>报错</span
>
<span
@click="payAttention(row)"
:class="row.sfgz == 0 ? 'primary' : 'danger'"
>{{ row.sfgz == 0 ? "关注" : "取消关注" }}</span
>
<span class="warning" @click="failWarning(row)" v-if="row.sfbc != '1'">报错</span>
<span @click="payAttention(row)" :class="row.sfgz == 0 ? 'primary' : 'danger'">{{ row.sfgz == 0 ? "关注" :
"取消关注" }}</span>
</div>
</template>
</WarnDataTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars
v-model="particularsShow"
:dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }"
/>
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
<FkDialog @change="getList" lx="05" />
<ZbFkDialog @change="getList" />
@ -182,13 +103,14 @@ import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPan
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick, onUnmounted } from "vue";
import PeopleConut from "./peopleConut.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZbFkDialog from "./ZbFkDialog.vue";
import { getItem } from "@/utils/storage.js"
const { proxy } = getCurrentInstance();
const {
D_BZ_YJLY,
// D_BZ_YJLY,
D_GS_QLZDRLX,
D_GS_ZDR_GJLB,
D_BZ_YJJB,
@ -198,7 +120,7 @@ const {
D_GS_ZDR_RYJB,
D_BZ_SF
} = proxy.$dict(
"D_BZ_YJLY",
// "D_BZ_YJLY",
"D_GS_QLZDRLX",
"D_BZ_YJJB",
"D_BZ_XB",
@ -212,33 +134,6 @@ const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref([
{
key: "dateTime",
label: "预警时间",
type: "datetimerange",
placeholder: "请选择预警时间"
},
{
key: "yjJb",
label: "预警级别",
type: "select",
options: D_BZ_YJJB,
multiple: true,
placeholder: "请选择预警级别"
},
{
key: "ssbmdm",
label: "接收单位",
type: "department",
placeholder: "请选择接收单位"
},
{
key: "sfglyj",
label: "关联预警",
type: "select",
options: D_BZ_SF,
placeholder: "请选择关联预警"
},
{ key: "yjRyxm", label: "姓名", type: "input", placeholder: "请输入姓名" },
{
key: "xbdm",
@ -246,6 +141,36 @@ const searchConfiger = ref([
type: "select",
options: D_BZ_XB,
placeholder: "请选择性别"
}, {
key: "yjRysfzh",
label: "身份证号码",
type: "input",
placeholder: "请输入身份证号码"
}, {
key: "nl",
label: "年龄",
type: "slot",
placeholder: "请输入年龄"
},
{
key: "bqdl",
label: "人员类别",
type: "select",
options: D_GS_QLZDRLX,
placeholder: "请选择人员类别"
}, {
key: "yjbqmc",
label: "人员细类",
type: "input",
placeholder: "请输入人员细类"
}
,
{ key: "bqdl", label: "人员级别", type: "select", options: D_GS_ZDR_RYJB }, {
key: "dateTime",
label: "预警时间",
type: "datetimerange",
placeholder: "请选择预警时间"
},
{
key: "cszt",
@ -254,13 +179,6 @@ const searchConfiger = ref([
options: D_GS_CSZT,
placeholder: "请选择超时状态"
},
{
key: "bqdl",
label: "人员类别",
type: "select",
options: D_GS_QLZDRLX,
placeholder: "请选择人员类别"
},
{
key: "sfgz",
label: "重点关注",
@ -275,18 +193,37 @@ const searchConfiger = ref([
options: D_BZ_SF,
placeholder: "请选择二次指派"
},
{
key: "yjRysfzh",
label: "身份证号码",
type: "input",
placeholder: "请输入身份证号码"
key: "yjJb",
label: "预警级别",
type: "select",
options: D_BZ_YJJB,
multiple: true,
placeholder: "请选择预警级别"
},
{
key: "nl",
label: "年龄",
type: "slot",
placeholder: "请输入年龄"
key: "czzt",
label: "签收状态",
type: "select",
options: D_GSXT_YJXX_CZZT,
placeholder: "请选择签收状态"
}, {
key: "sfglyj",
label: "关联预警",
type: "select",
options: D_BZ_SF,
placeholder: "请选择关联预警"
},
{
key: "ssbmdm",
label: "接收单位",
type: "department",
placeholder: "请选择接收单位"
},
{
key: "yjCs",
@ -294,19 +231,12 @@ const searchConfiger = ref([
type: "slot",
placeholder: "请输入预警次数"
},
{ key: "bqdl", label: "人员级别", type: "select", options: D_GS_ZDR_RYJB },
{ key: "yjLylx", label: "轨迹类别", type: "select", options: D_GS_ZDR_GJLB },
{
key: "yjDz",
label: "活动发生地",
type: "input",
placeholder: "请输入活动发生地"
},
{
key: "yjbqmc",
label: "人员细类",
type: "input",
placeholder: "请输入人员细类"
}
]);
const btnLoading = ref(false);
@ -336,9 +266,11 @@ const pageData = reactive({
{ label: "性别", width: 56, align: "center", slotName: "xbdm" },
{ prop: "nl", label: "年龄", width: 56, align: "center" },
{ label: "预警级别", width: 88, align: "center", slotName: "yjJb" },
{ label: "人员类别", width: 90, align: "center", slotName: "bqdl" },
{ prop: "bqdlmc", label: "人员类别", width: 90, align: "center" },
{ prop: "yjbqmc", label: "人员细类", width: 92 },
{ label: "轨迹类别", width: 92, align: "center", slotName: "yjLylx" },
// { label: "轨迹类别", width: 92, align: "center", slotName: "yjLylx" },
{ prop: "yjLylxmc", label: "轨迹类别", width: 80, align: "center" },
{ prop: "zjfknr", label: "最近反馈", width: 80, align: "center" },
{ prop: "yjDz", label: "活动发生地" },
{ prop: "ssbm", label: "接收单位" },
{ prop: "yjCs", label: "次数", width: 60, align: "center" },
@ -347,10 +279,6 @@ const pageData = reactive({
]
});
onMounted(() => {
tabHeightFn();
getList();
});
// 搜索
const onSearch = (val) => {
@ -362,6 +290,7 @@ const onSearch = (val) => {
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
@ -455,6 +384,7 @@ const handleExportData = (arr) => {
yjLylx_name: "轨迹类别",
yjDz: "活动发生地",
ssbm: "接收单位",
zjfknr: "最近反馈",
yjCs: "次数",
cszt_name: "超时状态"
};
@ -492,7 +422,7 @@ const handleQs = () => {
.$confirm(texy, "警告", { type: "warning" })
.then(() => {
let ids = wqs.map((item) => item.id);
qcckPost({ ids }, "/mosty-gsxt/tbYjxx/batchQs")
qcckPost({ ids, xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode }, "/mosty-gsxt/tbYjxx/batchQs")
.then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
@ -501,7 +431,7 @@ const handleQs = () => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
};
// 详情
const dataPres = ref({});
@ -525,7 +455,7 @@ const handleQsFk = (row, type) => {
proxy
.$confirm("确认要签收该条预警数据吗?", "警告", { type: "warning" })
.then(() => {
qcckPost({ ids: [row.id] }, "/mosty-gsxt/tbYjxx/batchQs")
qcckPost({ ids: [row.id], xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode }, "/mosty-gsxt/tbYjxx/batchQs")
.then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
@ -534,7 +464,7 @@ const handleQsFk = (row, type) => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
}
};
// 关注
@ -560,7 +490,7 @@ const payAttention = (row) => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
})
.catch(() => {});
.catch(() => { });
};
// 人数计算
const searchDom = ref(null);
@ -588,12 +518,36 @@ const countPeople = () => {
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
const userIfo = ref('')
const idEntityCard = ref()
const USERNAME = ref()
const timer = ref(null)
onMounted(() => {
userIfo.value = getItem('deptId') ? getItem('deptId')[0] : {}
idEntityCard.value = getItem('idEntityCard')
USERNAME.value = getItem('USERNAME')
tabHeightFn();
getList();
if (timer.value) {
clearInterval(timer.value);
} else {
timer.value = setInterval(() => {
getList();
}, 1000 * 60 * 5);
}
});
onUnmounted(() => {
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
});
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,472 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container" v-loading="loading">
<div class="three-column-layout">
<!-- 重点人员基本信息页 -->
<div class="column">
<div class="column-header">重点人员基本信息页</div>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="info-label">人员姓名</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">
<DictTag :value="dataForm.xbdm" :tag="false" :options="dict.D_BZ_XB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">{{ dataForm.nl }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">{{ dataForm.yjRysfzh }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">{{ dataForm.hjdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">{{ dataForm.xzdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">{{ dataForm.zdrRkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level" :class="ys()">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_BZ_YJJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">
<DictTag :value="dataForm.bqdl" :tag="false" :options="dict.D_GS_QLZDRLX" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员级别</span>
<span class="info-value">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_GS_ZDR_RYJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">人员细类</span>
<span class="info-value">{{ dataForm.yjbqmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">简要案情</span>
<span class="info-value text-area"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">一标三实</span>
<span class="info-value text-area"></span>
</div>
</div>
</div>
</div>
<!-- 重点人员活动信息页 -->
<div class="column">
<div class="column-header">重点人员活动信息页</div>
<div class="info-section blue-bg">
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">轨迹类别</span>
<span class="info-value">
<DictTag :value="dataForm.yjLylx" :tag="false" :options="dict.D_GS_ZDR_GJLB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">核查时间</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">比对时间</span>
<span class="info-value">{{ dataForm.yjSj }}</span>
</div>
</div>
<!-- <div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动发生地</span>
<span class="info-value">{{ dataForm.xxdz }}</span>
</div>
</div> -->
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动场所</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].xxdz }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动信息</span>
<span class="info-value">{{ dataForm.yjNr }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息提供单位</span>
<span class="info-value">{{ dataForm.jczmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息接收单位</span>
<span class="info-value">{{ dataForm.ssbm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">二次指派单位</span>
<span class="info-value">
<div v-if="dataForm.zpList && dataForm.zpList.length > 0">
<span v-for="(item, index) in dataForm.zpList" :key="item.id">
{{ item.zpbm }}<span v-if="index < dataForm.zpList.length - 1">,</span>
</span>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">签收时限</span>
<span class="info-value">{{ dataForm.qssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈时限</span>
<span class="info-value">{{ dataForm.fksj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置建议</span>
<span class="info-value">
<div v-if="dataForm.czjyList && dataForm.czjyList.length > 0">
<div v-for="(item, index) in dataForm.czjyList" :key="item.id">
<span>{{ `${index + 1}` + item.jynr }}</span>
</div>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value">
<div v-if="dataForm.fkList && dataForm.fkList.length > 0">
<div v-for="(item, index) in dataForm.fkList" :key="item.id">
<span v-if="item.ckczbcxx">{{ `${index + 1}` + item.ckczbcxx }}</span>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item" v-for="(item, index) in dataForm.yjgjList" :key="item.id">
<span class="history-index">{{ `${index + 1}` }}</span>
<span class="history-content">{{ item.yjNr }}</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, getCurrentInstance, watch, ref } from 'vue';
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警详情'
},
width: {
type: String,
default: '90%'
}, dataList: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({})
}
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const loading = ref(false)
let abortController = null
const close = () => {
if (abortController) {
abortController.abort()
abortController = null
}
loading.value = false
emit('update:modelValue', false);
};
const dataForm = ref({});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
getPart(props.dataList.id)
}
}, { deep: true });
const getPart = (id) => {
if (abortController) {
abortController.abort()
}
abortController = new AbortController()
loading.value = true
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${id}`, { signal: abortController.signal }).then(res => {
if (res) {
dataForm.value = res
} else {
dataForm.value = {}
}
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
loading.value = false
})
}
const ys = () => {
switch (dataForm.value.yjJb) {
case '01':
return 'red';
case '02':
return 'orange';
case '03':
return 'yellow';
case '04':
return 'blue';
default:
return '';
}
}
</script>
<style scoped>
.archive-container {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
}
.column-header {
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
padding: 10px;
background: #f0f2f5;
border: 1px solid #e4e7ed;
border-radius: 4px 4px 0 0;
text-align: center;
color: #303133;
}
.column .info-section {
flex: 1;
border-radius: 0 0 4px 4px;
overflow-y: auto;
}
.info-section {
border: 1px solid #e4e7ed;
border-radius: 4px;
padding: 15px;
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f0f8;
border-color: #9ed7ff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
width: 80px;
font-weight: bold;
margin-right: 10px;
white-space: nowrap;
color: #333;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
/* 红 */
.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c !important;
font-weight: bold;
}
/* 橙 */
.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806 !important;
font-weight: bold;
}
/* 黄 */
.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c !important;
font-weight: bold;
}
/* 蓝 */
.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff !important;
font-weight: bold;
}
.history-item {
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
/* align-items: center; */
}
.history-index {
font-weight: bold;
margin-right: 10px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
.demo-tabs {
margin-bottom: 20px;
}
::v-deep .el-tabs__header {
margin-bottom: 20px;
}
::v-deep .el-tabs__content {
min-height: 400px;
}
</style>

View File

@ -3,6 +3,19 @@
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules" :labelWidth="90">
<template #zpbmdm>
<el-cascader
v-model="listQuery.zpbmdm"
:options="deptOptions"
:props="cascaderProps"
clearable
filterable
placeholder="请选择指派部门"
:show-all-levels="false"
style="width: 100%"
@change="handleDeptChange"
/>
</template>
</FormMessage>
</div>
<template #footer>
@ -17,6 +30,8 @@
import { ref, defineProps, defineEmits, reactive, getCurrentInstance } from 'vue';
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { tbYjxxYjzp } from '@/api/yj'
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
@ -40,12 +55,45 @@ const props = defineProps({
default: () => ({})
}
});
const listQuery = ref()
const listQuery = ref({ zpbmdm: '', zpbm: '' })
const formData = ref([
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "department", width: '45%' },
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "slot", width: '45%' },
{ label: "指派原因", prop: "zpyy", type: "textarea", width: '80%' },
])
// 部门级联选择器配置
const deptOptions = ref([])
const cascaderProps = {
children: 'childDeptList',
value: 'orgCode',
label: 'orgName',
checkStrictly: true,
emitPath: false
}
// 部门选择变化
const handleDeptChange = (val) => {
if (val) {
const dept = findDeptByCode(deptOptions.value, val)
listQuery.value.zpbm = dept?.orgName || ''
} else {
listQuery.value.zpbm = ''
}
}
// 根据部门代码查找部门信息
const findDeptByCode = (list, code) => {
for (const item of list) {
if (item.orgCode === code) return item
if (item.childDeptList?.length) {
const found = findDeptByCode(item.childDeptList, code)
if (found) return found
}
}
return null
}
const rules = reactive({
zpbmdm: [{ required: true, message: "请选择指派部门", trigger: "blur" }],
zpyy: [{ required: true, message: "请输入指派原因", trigger: "change" }],
@ -63,14 +111,20 @@ const submit = async () => {
});
});
}
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
elform.value.reset()
elform.value.reset()
emit('update:modelValue', false);
};
// 获取部门数据
const getData = () => {
qcckGet({}, "/mosty-base/deptFeign/selectQzbm").then((res) => {
deptOptions.value = res || []
})
}
getData()
</script>
<style scoped>
</style>
<style scoped></style>

View File

@ -6,6 +6,7 @@
v-model="listQuery"
:fields="searchConfiger"
@search="onSearch"
@collapse="tabHeightFn"
>
<template #but>
<el-button type="primary" @click="exportExl" size="small"
@ -238,8 +239,8 @@ const {
D_GS_QLZDRLX,
D_GS_ZDR_RYJB,
D_GS_ZDR_GJLB,
D_GS_BK_CZYQ,
D_GS_QLZDRYXX
D_GS_BK_CZYQ
// D_GS_QLZDRYXX
} = proxy.$dict(
"D_GSXT_YJXX_CZZT",
"D_GS_SSYJ",
@ -253,8 +254,8 @@ const {
"D_GS_QLZDRLX",
"D_GS_ZDR_RYJB",
"D_GS_ZDR_GJLB",
"D_GS_BK_CZYQ",
"D_GS_QLZDRYXX"
"D_GS_BK_CZYQ"
// "D_GS_QLZDRYXX"
);
// 字典数据集合
@ -447,6 +448,7 @@ const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val, yjLx: val.yjLx.join(",") };
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const reset = () => {
@ -576,12 +578,12 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
const handleChooseData = (val) => {
selectRows.value = val;

View File

@ -4,75 +4,33 @@
<div ref="searchBox" class="mt10 mb10">
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel
v-model="queryFrom"
:fields="searchConfiger"
ref="searchDom"
@search="onSearch"
>
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search="onSearch"
@collapse="tabHeightFn">
<template #yjCs>
<div>
<el-input
v-model="queryFrom.yjkscs"
type="number"
placeholder="开始次数"
style="width: 130px"
clearable
:min="0"
/>
<el-input
v-model="queryFrom.yjjscs"
type="number"
placeholder="结束次数"
style="width: 130px"
clearable
:min="0"
/>
<el-input v-model="queryFrom.yjkscs" type="number" placeholder="开始次数" style="width: 130px" clearable
:min="0" />
<el-input v-model="queryFrom.yjjscs" type="number" placeholder="结束次数" style="width: 130px" clearable
:min="0" />
</div>
</template>
<template #nl>
<div>
<el-input
v-model="queryFrom.ksnl"
type="number"
placeholder="开始年龄"
style="width: 130px"
clearable
:min="0"
/>
<el-input
v-model="queryFrom.jsnl"
type="number"
placeholder="结束年龄"
style="width: 130px"
clearable
:min="0"
/>
<el-input v-model="queryFrom.ksnl" type="number" placeholder="开始年龄" style="width: 130px" clearable
:min="0" />
<el-input v-model="queryFrom.jsnl" type="number" placeholder="结束年龄" style="width: 130px" clearable
:min="0" />
</div>
</template>
<template #but>
<el-button type="primary" size="small" @click="exportExl"
>批量导出</el-button
>
<el-button
type="primary"
:loading="btnLoading"
size="small"
@click="exportExcelAll"
>筛选导出</el-button
>
<el-button type="primary" size="small" @click="handleQs"
>批量签收</el-button
>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" :loading="btnLoading" size="small" @click="exportExcelAll">筛选导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<!-- <el-button type="primary" size="small" @click="handleQs"
>批量分析</el-button
> -->
<el-button type="primary" size="small" @click="countPeople"
>计算人数</el-button
>
<el-button type="primary" size="small" @click="handleRelatedWarning"
>关联预警</el-button
>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
<el-button type="primary" size="small" @click="handleRelatedWarning">关联预警</el-button>
</template>
</QueryFormPanel>
</div>
@ -86,41 +44,25 @@
</PageTitle> -->
<!-- 表格 -->
<div style="background-color: #fff">
<WarnDataTable
:loading="pageData.tableConfiger.loading"
:tableHeight="pageData.tableHeight"
:data="pageData.tableData"
:columns="pageData.tableColumn"
table-class="warn-table"
@selectionChange="handleChooseData"
>
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag
:value="row.czzt"
:color="row.czzt === '01' ? '#ff2424' : '#1d72e8'"
:tag="false"
:options="D_GSXT_YJXX_CZZT"
/>
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : row.czzt === '02' ? '#1d72e8' : '#000'"
:tag="false" :options="D_GSXT_YJXX_CZZT" style="cursor: pointer" @click="particularsOpen(row)" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag
:value="row.yjJb"
color="#fff"
:tag="false"
:options="D_BZ_YJJB"
/>
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_GS_ZDR_GJLB" />
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
@ -132,55 +74,29 @@
</template>
<template #operation="{ row }">
<div style="display: flex; justify-content: space-between">
<span
class="primary"
@click="handleQsSingle(row)"
v-if="row.czzt == '01'"
>签收</span
>
<span class="success" v-else @click="handleQsFk(row, '反馈')"
>反馈</span
>
<span class="primary" @click="handleQsSingle(row)" v-if="row.czzt == '01'">签收</span>
<span class="success" v-else @click="handleQsFk(row, '反馈')">反馈</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span
class="warning"
v-if="row.sfbc != '1'"
@click="failWarning(row)"
>报错</span
>
<span
:class="row.sfgz == 0 ? 'primary' : 'danger'"
@click="payAttention(row)"
>{{ row.sfgz == 0 ? "关注" : "取消关注" }}
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span :class="row.sfgz == 0 ? 'primary' : 'danger'" @click="payAttention(row)">{{ row.sfgz == 0 ? "关注" :
"取消关注" }}
</span>
</div>
</template>
</WarnDataTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars
v-model="particularsShow"
:dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }"
/>
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
<SelectDataDialog
v-model="selectDataVisible"
title="关联预警"
@confirm="handleSelectConfirm"
:currentRelatedRow="currentRelatedRow"
/>
<SelectDataDialog v-model="selectDataVisible" title="关联预警" @confirm="handleSelectConfirm"
:currentRelatedRow="currentRelatedRow" />
<FkDialog @change="getList" lx="05" />
</template>
@ -195,18 +111,19 @@ import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPan
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick, onUnmounted } from "vue";
import peopleConut from "./peopleConut.vue";
import SelectDataDialog from "../../YjData/SelectDataDialog.vue";
import { getItem } from "@/utils/storage.js"
const { proxy } = getCurrentInstance();
import emitter from "@/utils/eventBus.js";
const {
D_BZ_YJLY,
// D_BZ_YJLY,
D_GS_QLZDRLX,
D_GS_ZDR_GJLB,
D_BZ_YJJB,
D_GS_CSZT,
D_GS_QLZDRYXX,
// D_GS_QLZDRYXX,
D_BZ_XB,
D_GSXT_YJXX_CZZT,
D_GS_ZDR_RYJB,
@ -214,10 +131,10 @@ const {
D_BZ_QBLY,
D_BZ_QBLYJB
} = proxy.$dict(
"D_BZ_YJLY",
// "D_BZ_YJLY",
"D_GS_QLZDRLX",
"D_BZ_YJJB",
"D_GS_QLZDRYXX",
// "D_GS_QLZDRYXX",
"D_BZ_XB",
"D_GSXT_YJXX_CZZT",
"D_GS_ZDR_RYJB",
@ -232,12 +149,43 @@ const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref([
{ key: "yjRyxm", label: "姓名", type: "input", placeholder: "请输入姓名" },
{
key: "xbdm",
label: "性别",
type: "select",
options: D_BZ_XB,
placeholder: "请选择性别"
},
{
key: "yjRysfzh",
label: "身份证号码",
type: "input",
placeholder: "请输入身份证号码"
},
{
key: "nl",
label: "年龄",
type: "slot",
placeholder: "请输入年龄"
}, {
key: "dateTime",
label: "预警时间",
type: "datetimerange",
placeholder: "请选择预警时间"
}, {
key: "bqdl",
label: "人员类别",
type: "select",
options: D_GS_QLZDRLX,
placeholder: "请选择人员类别"
}, {
key: "yjbqmc",
label: "人员细类",
type: "input",
placeholder: "请输入人员细类"
},
{
key: "yjJb",
label: "预警级别",
@ -245,6 +193,12 @@ const searchConfiger = ref([
options: D_BZ_YJJB,
multiple: true,
placeholder: "请选择预警级别"
}, {
key: "czzt",
label: "签收状态",
type: "select",
options: D_GSXT_YJXX_CZZT,
placeholder: "请选择签收状态"
},
{
key: "ssbmdm",
@ -259,14 +213,7 @@ const searchConfiger = ref([
options: D_BZ_SF,
placeholder: "请选择关联预警"
},
{ key: "yjRyxm", label: "姓名", type: "input", placeholder: "请输入姓名" },
{
key: "xbdm",
label: "性别",
type: "select",
options: D_BZ_XB,
placeholder: "请选择性别"
},
{
key: "cszt",
label: "超时状态",
@ -274,13 +221,7 @@ const searchConfiger = ref([
options: D_GS_CSZT,
placeholder: "请选择超时状态"
},
{
key: "bqdl",
label: "人员类别",
type: "select",
options: D_GS_QLZDRLX,
placeholder: "请选择人员类别"
},
{
key: "sfgz",
label: "重点关注",
@ -295,18 +236,6 @@ const searchConfiger = ref([
options: D_BZ_SF,
placeholder: "请选择二次指派"
},
{
key: "yjRysfzh",
label: "身份证号码",
type: "input",
placeholder: "请输入身份证号码"
},
{
key: "nl",
label: "年龄",
type: "slot",
placeholder: "请输入年龄"
},
{
key: "yjCs",
@ -322,12 +251,7 @@ const searchConfiger = ref([
type: "input",
placeholder: "请输入活动发生地"
},
{
key: "yjbqmc",
label: "人员细类",
type: "input",
placeholder: "请输入人员细类"
},
{
key: "qbly",
label: "情报来源",
@ -343,7 +267,9 @@ const searchConfiger = ref([
placeholder: "请选择情报来源级别"
}
]);
const queryFrom = ref({});
const queryFrom = ref({
qbly: "02"
});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
@ -365,15 +291,16 @@ const pageData = reactive({
{ label: "预警状态", width: 80, align: "center", slotName: "status" },
{ prop: "yjSj", label: "预警时间", width: 125 },
{ prop: "yjRyxm", label: "人员姓名", width: 80 },
{ prop: "yjRysfzh", label: "身份证号", width: 158 },
{ prop: "yjRysfzh", label: "身份证号" },
{ label: "性别", width: 55, align: "center", slotName: "xbdm" },
{ prop: "nl", label: "年龄", width: 55, align: "center" },
{ label: "预警级别", width: 80, align: "center", slotName: "yjJb" },
{ label: "人员类别", width: 80, align: "center", slotName: "bqdl" },
{ prop: "bqdlmc", label: "人员类别", width: 80, align: "center" },
{ prop: "yjbqmc", label: "人员细类", width: 80 },
{ label: "轨迹类别", width: 80, align: "center", slotName: "yjLylx" },
{ prop: "yjDz", label: "活动发生地", width: 100 },
{ prop: "ssbm", label: "接收单位" },
{ prop: "yjLylxmc", label: "轨迹类别", width: 80, align: "center" },
{ prop: "yjDz", label: "发生地", width: 80, },
{ prop: "ssbm", label: "接收单位", width: 100 },
{ prop: "zjfknr", label: "最近反馈", align: "center" },
{ label: "情报来源", width: 80, align: "center", slotName: "qbly" },
{ label: "来源级别", width: 80, align: "center", slotName: "qblyjb" },
{ prop: "yjCs", label: "次数", width: 55, align: "center" },
@ -382,14 +309,11 @@ const pageData = reactive({
]
});
onMounted(() => {
tabHeightFn();
getList();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(",") || "" };
console.log(val);
queryFrom.value = { ...val, yjJb: Array.isArray(val.yjJb) ? val.yjJb.join(",") : "", qbly: val.qbly ? val.qbly : "02" };
queryFrom.value.startTime = val.dateTime ? val.dateTime[0] : "";
queryFrom.value.endTime = val.dateTime ? val.dateTime[1] : "";
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
@ -397,6 +321,7 @@ const onSearch = (val) => {
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList();
nextTick(tabHeightFn);
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
@ -410,10 +335,11 @@ const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
qbly: queryFrom.value.qbly ? queryFrom.value.qbly : "02",
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
};
promes.yjJb = queryFrom.value.yjJb ? queryFrom.value.yjJb.join(",") : "";
promes.yjJb = Array.isArray(queryFrom.value.yjJb) ? queryFrom.value.yjJb.join(",") : (queryFrom.value.yjJb || "");
delete promes.times;
delete promes.dateTime;
qcckPost(promes, "/mosty-gsxt/tbYjxx/getQlzdrPageList")
@ -460,6 +386,7 @@ const handleExportData = (arr) => {
yjLylx_name: "轨迹类别",
yjDz: "活动发生地",
ssbm: "接收单位",
zjfknr: "最近反馈",
qbly_name: "情报来源",
qblyjb_name: "来源级别",
yjCs: "次数",
@ -539,7 +466,7 @@ const handleQs = () => {
.$confirm(texy, "警告", { type: "warning" })
.then(() => {
let ids = wqs.map((item) => item.id);
qcckPost({ ids }, "/mosty-gsxt/tbYjxx/batchQs")
qcckPost({ ids, xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode }, "/mosty-gsxt/tbYjxx/batchQs")
.then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
@ -548,14 +475,13 @@ const handleQs = () => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
};
// 详情
const dataPres = ref({});
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row;
particularsShow.value = true;
};
// 单条签收
@ -568,7 +494,7 @@ const handleQsSingle = (row) => {
proxy
.$confirm("确认要签收该条预警数据吗?", "警告", { type: "warning" })
.then(() => {
qcckPost({ ids: [row.id] }, "/mosty-gsxt/tbYjxx/batchQs")
qcckPost({ ids: [row.id], xm: USERNAME.value, sfzh: idEntityCard.value, ssbmdm: userIfo.value.deptCode }, "/mosty-gsxt/tbYjxx/batchQs")
.then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
@ -577,7 +503,7 @@ const handleQsSingle = (row) => {
proxy.$message({ type: "error", message: "失败" });
});
})
.catch(() => {});
.catch(() => { });
};
// 关注
const payAttention = (row) => {
@ -602,7 +528,7 @@ const payAttention = (row) => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
})
.catch(() => {});
.catch(() => { });
};
// 人数计算
const searchDom = ref(null);
@ -654,12 +580,36 @@ const countPeople = () => {
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
const userIfo = ref('')
const idEntityCard = ref()
const USERNAME = ref()
const timer = ref(null)
onMounted(() => {
userIfo.value = getItem('deptId') ? getItem('deptId')[0] : {}
idEntityCard.value = getItem('idEntityCard')
USERNAME.value = getItem('USERNAME')
tabHeightFn();
getList();
if (timer.value) {
clearInterval(timer.value);
} else {
timer.value = setInterval(() => {
getList();
}, 1000 * 60 * 5);
}
});
onUnmounted(() => {
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
})
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,472 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container" v-loading="loading">
<div class="three-column-layout">
<!-- 重点人员基本信息页 -->
<div class="column">
<div class="column-header">重点人员基本信息页</div>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="info-label">人员姓名</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">
<DictTag :value="dataForm.xbdm" :tag="false" :options="dict.D_BZ_XB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">{{ dataForm.nl }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">{{ dataForm.yjRysfzh }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">{{ dataForm.hjdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">{{ dataForm.xzdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">{{ dataForm.zdrRkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level" :class="ys()">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_BZ_YJJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">
<DictTag :value="dataForm.bqdl" :tag="false" :options="dict.D_GS_QLZDRLX" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员级别</span>
<span class="info-value">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_GS_ZDR_RYJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">人员细类</span>
<span class="info-value">{{ dataForm.yjbqmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">简要案情</span>
<span class="info-value text-area"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">一标三实</span>
<span class="info-value text-area"></span>
</div>
</div>
</div>
</div>
<!-- 重点人员活动信息页 -->
<div class="column">
<div class="column-header">重点人员活动信息页</div>
<div class="info-section blue-bg">
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">轨迹类别</span>
<span class="info-value">
<DictTag :value="dataForm.yjLylx" :tag="false" :options="dict.D_GS_ZDR_GJLB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">核查时间</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">比对时间</span>
<span class="info-value">{{ dataForm.yjSj }}</span>
</div>
</div>
<!-- <div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动发生地</span>
<span class="info-value">{{ dataForm.xxdz }}</span>
</div>
</div> -->
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动场所</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].xxdz }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动信息</span>
<span class="info-value">{{ dataForm.yjNr }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息提供单位</span>
<span class="info-value">{{ dataForm.jczmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息接收单位</span>
<span class="info-value">{{ dataForm.ssbm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">二次指派单位</span>
<span class="info-value">
<div v-if="dataForm.zpList && dataForm.zpList.length > 0">
<span v-for="(item, index) in dataForm.zpList" :key="item.id">
{{ item.zpbm }}<span v-if="index < dataForm.zpList.length - 1">,</span>
</span>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">签收时限</span>
<span class="info-value">{{ dataForm.qssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈时限</span>
<span class="info-value">{{ dataForm.fksj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置建议</span>
<span class="info-value">
<div v-if="dataForm.czjyList && dataForm.czjyList.length > 0">
<div v-for="(item, index) in dataForm.czjyList" :key="item.id">
<span>{{ `${index + 1}` + item.jynr }}</span>
</div>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value">
<div v-if="dataForm.fkList && dataForm.fkList.length > 0">
<div v-for="(item, index) in dataForm.fkList" :key="item.id">
<span v-if="item.ckczbcxx">{{ `${index + 1}` + item.ckczbcxx }}</span>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item" v-for="(item, index) in dataForm.yjgjList" :key="item.id">
<span class="history-index">{{ `${index + 1}` }}</span>
<span class="history-content">{{ item.yjNr }}</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, getCurrentInstance, watch, ref } from 'vue';
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警详情'
},
width: {
type: String,
default: '90%'
}, dataList: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({})
}
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const loading = ref(false)
let abortController = null
const close = () => {
if (abortController) {
abortController.abort()
abortController = null
}
loading.value = false
emit('update:modelValue', false);
};
const dataForm = ref({});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
getPart(props.dataList.id)
}
}, { deep: true });
const getPart = (id) => {
if (abortController) {
abortController.abort()
}
abortController = new AbortController()
loading.value = true
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${id}`, { signal: abortController.signal }).then(res => {
if (res) {
dataForm.value = res
} else {
dataForm.value = {}
}
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
loading.value = false
})
}
const ys = () => {
switch (dataForm.value.yjJb) {
case '01':
return 'red';
case '02':
return 'orange';
case '03':
return 'yellow';
case '04':
return 'blue';
default:
return '';
}
}
</script>
<style scoped>
.archive-container {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
}
.column-header {
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
padding: 10px;
background: #f0f2f5;
border: 1px solid #e4e7ed;
border-radius: 4px 4px 0 0;
text-align: center;
color: #303133;
}
.column .info-section {
flex: 1;
border-radius: 0 0 4px 4px;
overflow-y: auto;
}
.info-section {
border: 1px solid #e4e7ed;
border-radius: 4px;
padding: 15px;
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f0f8;
border-color: #9ed7ff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
width: 80px;
font-weight: bold;
margin-right: 10px;
white-space: nowrap;
color: #333;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
/* 红 */
.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c !important;
font-weight: bold;
}
/* 橙 */
.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806 !important;
font-weight: bold;
}
/* 黄 */
.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c !important;
font-weight: bold;
}
/* 蓝 */
.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff !important;
font-weight: bold;
}
.history-item {
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
/* align-items: center; */
}
.history-index {
font-weight: bold;
margin-right: 10px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
.demo-tabs {
margin-bottom: 20px;
}
::v-deep .el-tabs__header {
margin-bottom: 20px;
}
::v-deep .el-tabs__content {
min-height: 400px;
}
</style>

View File

@ -3,6 +3,10 @@
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules" :labelWidth="90">
<template #zpbmdm>
<el-cascader v-model="listQuery.zpbmdm" :options="deptOptions" :props="cascaderProps" clearable filterable
placeholder="请选择指派部门" :show-all-levels="false" style="width: 100%" @change="handleDeptChange" />
</template>
</FormMessage>
</div>
<template #footer>
@ -17,6 +21,7 @@
import { ref, defineProps, defineEmits, reactive, getCurrentInstance } from 'vue';
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { tbYjxxYjzp } from '@/api/yj'
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
@ -40,12 +45,46 @@ const props = defineProps({
default: () => ({})
}
});
const listQuery = ref()
const listQuery = ref({ zpbmdm: '', zpbm: '' })
const formData = ref([
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "department", width: '45%' },
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "slot", width: '45%' },
{ label: "指派原因", prop: "zpyy", type: "textarea", width: '80%' },
])
// 部门级联选择器配置
const deptOptions = ref([])
const cascaderProps = {
children: 'childDeptList',
value: 'orgCode',
label: 'orgName',
checkStrictly: true, // 单选模式下可选择任意一级
emitPath: false // 只返回最后一级的值
}
// 部门选择变化
const handleDeptChange = (val) => {
if (val) {
const dept = findDeptByCode(deptOptions.value, val)
console.log('找到的部门:', dept)
// 根据接口实际字段名获取部门名称
listQuery.value.zpbm = dept?.orgName || ''
} else {
listQuery.value.zpbm = ''
}
}
// 根据部门代码查找部门信息
const findDeptByCode = (list, code) => {
for (const item of list) {
if (item.orgCode === code) return item
if (item.childDeptList?.length) {
const found = findDeptByCode(item.childDeptList, code)
if (found) return found
}
}
return null
}
const rules = reactive({
zpbmdm: [{ required: true, message: "请选择指派部门", trigger: "blur" }],
zpyy: [{ required: true, message: "请输入指派原因", trigger: "change" }],
@ -66,11 +105,15 @@ const submit = async () => {
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
elform.value.reset()
elform.value.reset()
emit('update:modelValue', false);
};
const getData = () => {
qcckGet({}, "/mosty-base/deptFeign/selectQzbm").then((res) => {
deptOptions.value = res || []
})
}
getData()
</script>
<style scoped>
</style>
<style scoped></style>

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn">
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
@ -80,14 +80,22 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import Pagination from "./components/particulars.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_GS_CSZT } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_GS_CSZT")
const { D_GSXT_YJXX_CZZT,
// D_GS_QLZDRLX,
D_BZ_YJJB, D_BZ_YJLYXT,
// D_BZ_YJLY,
D_BZ_XB, D_GS_CSZT } = proxy.$dict("D_GSXT_YJXX_CZZT",
// 'D_GS_QLZDRLX',
"D_BZ_YJJB", "D_BZ_YJLYXT",
// "D_BZ_YJLY",
"D_BZ_XB", "D_GS_CSZT")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
@ -186,6 +194,7 @@ const onSearch = (val) => {
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : ''
getList()
nextTick(tabHeightFn);
}
const changeNo = (val) => {
@ -354,11 +363,12 @@ const pushWarning = (val) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
// 详情
const paginationOpen = ref(false)
const openBox = (val) => {

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn">
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
@ -46,8 +46,8 @@
</el-image>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : row.czzt === '02' ? '#1d72e8' : '#000'"
:tag="false" :options="D_GSXT_YJXX_CZZT" style="cursor: pointer" @click="particularsOpen(row)" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
@ -143,7 +143,7 @@ import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import Particulars from "./components/particulars.vue";
import { bqYs } from '@/utils/tools.js'
@ -151,7 +151,7 @@ const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT,
D_BZ_YJLY, D_BZ_XB, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_BZ_SF, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ',
D_BZ_YJLY, D_BZ_XB, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_BZ_SF, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX',
"D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT",
"D_GS_CSZT", "D_BZ_SF", "D_GS_ZDR_RYJB", "D_GS_ZDR_GJLB", "D_GS_BK_CZYQ")
const searchBox = ref(); //搜索框
@ -165,6 +165,7 @@ const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ key: "czzt", label: "签收状态", type: "select", options: D_GSXT_YJXX_CZZT, placeholder: "请选择签收状态" },
{ label: "布控开始时间", key: 'bkkssj', type: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", key: 'bkjssj', type: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", key: 'startTime', type: "datetimerange", placeholder: "请选择预警时间" },
@ -223,7 +224,7 @@ const pageData = reactive({
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "相似度", width: 50, align: 'center', slotName: 'xsd' },
{ label: "预警内容", prop: "yjNr", width: 70, align: 'center' },
{ label: "所属部门", prop: "ssbm", width: 70, align: 'center'},
{ label: "所属部门", prop: "ssbm", width: 70, align: 'center' },
{ label: "数据来源", width: 70, align: 'center', slotName: 'yjLylx' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
@ -261,6 +262,7 @@ const onSearch = (val) => {
// listQuery.value.sfgz = val.sfgz?.join(',') || ''
// listQuery.value.sfzp = val.sfzp?.join(',') || ''
getList()
nextTick(tabHeightFn);
}
const changeNo = (val) => {
@ -436,11 +438,12 @@ const openBox = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
</script>
<style lang="scss" scoped>
.el-loading-mask {

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' @collapse="tabHeightFn">
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
@ -119,7 +119,7 @@ import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/seve
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import Pages from "@/components/aboutTable/Pages.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import Particulars from './components/particulars.vue'
import { bqYs } from '@/utils/tools.js'
const ORDIMG = 'https://89.40.7.122:38496/image'
@ -128,7 +128,7 @@ const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX,
D_BZ_XB,
D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_GS_BKZT, D_BZ_SF,
D_BZ_YJLY, D_GS_CSZT, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_GS_BKZT", "D_BZ_SF",
D_BZ_YJLY, D_GS_CSZT, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX', "D_GS_BKZT", "D_BZ_SF",
"D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BK_CZYQ")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
@ -218,6 +218,7 @@ const onSearch = (val) => {
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
getList()
nextTick(tabHeightFn);
}
const changeNo = (val) => {
@ -396,11 +397,12 @@ const openBox = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
nextTick(() => {
if (!searchBox.value) return;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
});
};
window.addEventListener('resize', tabHeightFn);
</script>
<style lang="scss" scoped>

View File

@ -24,33 +24,15 @@
<div v-if="postTitle" class="post-title">{{ postTitle }}</div>
<div v-if="bodySource" class="post-text-wrap">
<div class="post-text">{{ displayBody }}</div>
<span
v-if="showFullLink"
class="full-text-link"
@click.stop="handleClick"
>全文</span
>
<span v-if="showFullLink" class="full-text-link" @click.stop="handleClick">全文</span>
</div>
<!-- 图片展示 -->
<div
class="post-images"
v-if="post.images && post.images.length > 0"
:class="{ 'is-three': post.images.length >= 3 }"
>
<div
v-for="(img, index) in post.images"
:key="index"
class="image-item"
@click.stop
>
<el-image
:preview-teleported="true"
:src="img"
fit="cover"
:preview-src-list="post.images"
:initial-index="index"
>
<div class="post-images" v-if="post.images && post.images.length > 0"
:class="{ 'is-three': post.images.length >= 3 }">
<div v-for="(img, index) in post.images" :key="index" class="image-item" @click.stop>
<el-image :preview-teleported="true" :src="img" fit="cover" :preview-src-list="post.images"
:initial-index="index">
<template #error>
<div class="image-error">
<el-icon>
@ -147,11 +129,9 @@ const handleClick = () => {
position: absolute;
top: 14px;
right: 14px;
background: linear-gradient(
180deg,
rgba(0, 227, 255, 0.35) 0%,
rgba(0, 100, 180, 0.45) 100%
);
background: linear-gradient(180deg,
rgba(0, 227, 255, 0.35) 0%,
rgba(0, 100, 180, 0.45) 100%);
color: #fff;
padding: 3px 10px;
border-radius: 2px;

View File

@ -20,37 +20,18 @@
<div class="post-time">{{ post.publishTime }}</div>
</div>
<div class="post-content" v-if="postTitle || bodySource">
<div v-if="postTitle" class="post-title">{{ postTitle }}</div>
<div v-if="bodySource" class="post-text-wrap">
<div class="post-text">{{ displayBody }}</div>
<span
v-if="showFullLink"
class="full-text-link"
@click.stop="handleClick"
>全文</span
>
<div class="post-content" v-if="props.post.title || bodySource">
<div v-if="props.post.title" class="post-title">{{ props.post.title }}</div>
<div v-if="bodySource" class="post-text-wrap" :class="{ 'has-more': showFullLink }">
<span class="post-text">{{ props.post.content }}</span><span v-if="showFullLink" class="full-text-link" @click.stop="handleClick">...全文</span>
</div>
<!-- 图片展示 -->
<div
class="post-images"
v-if="post.images && post.images.length > 0"
:class="{ 'is-three': post.images.length >= 3 }"
>
<div
v-for="(img, index) in post.images"
:key="index"
class="image-item"
@click.stop
>
<el-image
:preview-teleported="true"
:src="img"
fit="cover"
:preview-src-list="post.images"
:initial-index="index"
>
<div class="post-images" v-if="post.images && post.images.length > 0"
:class="{ 'is-three': post.images.length >= 3 }">
<div v-for="(img, index) in post.images" :key="index" class="image-item" @click.stop>
<el-image :preview-teleported="true" :src="img" fit="cover" :preview-src-list="post.images"
:initial-index="index">
<template #error>
<div class="image-error">
<el-icon>
@ -70,13 +51,8 @@
</el-icon>
<span>{{ post.commentCount || 0 }}</span>
</div>
<button
v-if="!post.isPremium"
type="button"
class="post-pin-btn"
:disabled="pinning"
@click.stop="handlePinTop"
>
<button v-if="!post.isPremium" type="button" class="post-pin-btn" :disabled="pinning"
@click.stop="handlePinTop">
置顶
</button>
</div>
@ -97,7 +73,7 @@ const props = defineProps({
required: true
}
});
{ { props.post } }
const emit = defineEmits(["like", "click", "pin"]);
const pinning = ref(false);
@ -122,14 +98,14 @@ const EXCERPT_LEN = 160;
const rawContent = computed(() => (props.post.content || "").trim());
const postTitle = computed(() => {
const t = rawContent.value;
if (!t) return "";
const idx = t.indexOf("\n");
if (idx === -1) return "";
const first = t.slice(0, idx).trim();
return first.length > 0 ? first : "";
});
// const postTitle = computed(() => {
// const t = rawContent.value;
// if (!t) return "";
// const idx = t.indexOf("\n");
// if (idx === -1) return "";
// const first = t.slice(0, idx).trim();
// return first.length > 0 ? first : "";
// });
const bodySource = computed(() => {
const t = rawContent.value;
@ -184,11 +160,9 @@ const handleClick = () => {
cursor: pointer;
border: none;
border-radius: 3px;
background: linear-gradient(
135deg,
$lt-bar-blue-start 0%,
$lt-bar-blue-end 100%
);
background: linear-gradient(135deg,
$lt-bar-blue-start 0%,
$lt-bar-blue-end 100%);
box-shadow: 0 1px 5px lt-blue(0.2);
transition: opacity 0.2s ease, transform 0.15s ease;
@ -207,11 +181,9 @@ const handleClick = () => {
position: absolute;
top: 14px;
right: 14px;
background: linear-gradient(
135deg,
$lt-bar-blue-start 0%,
$lt-bar-blue-end 100%
);
background: linear-gradient(135deg,
$lt-bar-blue-start 0%,
$lt-bar-blue-end 100%);
color: #fff;
padding: 3px 10px;
border-radius: 2px;
@ -294,6 +266,11 @@ const handleClick = () => {
line-height: 1.65;
color: $lt-text-dim;
word-break: break-word;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.post-text {
@ -301,10 +278,10 @@ const handleClick = () => {
}
.full-text-link {
margin-left: 4px;
color: $lt-bar-blue-end;
font-weight: 500;
cursor: pointer;
white-space: nowrap;
&:hover {
text-shadow: 0 0 8px lt-blue(0.35);

View File

@ -1,40 +1,19 @@
<template>
<el-dialog
v-model="dialogVisible"
class="luntan-tech-dialog"
title="发布帖子"
width="60%"
:before-close="handleClose"
:append-to-body="true"
>
<el-dialog v-model="dialogVisible" class="luntan-tech-dialog" title="发布帖子" width="60%" :before-close="handleClose"
:append-to-body="true">
<div style="overflow: auto; height: 60vh">
<el-form :model="form" :rules="rules" ref="formRef" label-width="80px">
<el-form-item label="标题" prop="title">
<el-input
v-model="form.title"
placeholder="请输入帖子标题"
maxlength="50"
show-word-limit
/>
<el-input v-model="form.title" placeholder="请输入帖子标题" maxlength="50" show-word-limit />
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input
v-model="form.content"
type="textarea"
:rows="6"
placeholder="请输入帖子内容"
maxlength="500"
show-word-limit
/>
<el-input v-model="form.content" type="textarea" :rows="6" placeholder="请输入帖子内容" maxlength="1000"
show-word-limit />
</el-form-item>
<el-form-item label="表情">
<V3Emoji
:options-name="optionsName"
@click-emoji="onEmojiClick"
:recent="true"
/>
<V3Emoji :options-name="optionsName" @click-emoji="onEmojiClick" :recent="true" />
</el-form-item>
<el-form-item label="图片">

View File

@ -6,7 +6,7 @@
</div> -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch">
<el-button type="primary" size="small" @click="addItemMenu" >
<el-button type="primary" size="small" @click="addItemMenu">
<el-icon>
<CirclePlus />
</el-icon>
@ -56,7 +56,7 @@
<el-tag v-else type="warning">未知</el-tag>
</template>
</el-table-column>
<el-table-column sortable prop="bz" show-overflow-tooltip label="备注"></el-table-column>
<el-table-column sortable prop="bz" show-overflow-tooltip label="图标"></el-table-column>
<el-table-column sortable prop="qxbs" label="权限标识" show-overflow-tooltip align="center"
width="140px"></el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="220">
@ -124,8 +124,8 @@
<el-input v-model="dialogForm.menuCode" show-word-limit maxlength="50" placeholder="权限标识对应路由name"
autocomplete="off"></el-input>
</el-form-item>
<el-form-item class="one" label="选择图标" prop="iconName" label-width="140px">
<ChooseIcon width="400" :limit="13" :isImg="false" clearable="" v-model="dialogForm.iconName"></ChooseIcon>
<el-form-item class="one" label="选择图标" prop="bz" label-width="140px">
<ChooseIcon width="400" :limit="13" :isImg="false" clearable="" v-model="dialogForm.bz"></ChooseIcon>
</el-form-item>
<el-form-item class="one" label="排序" prop="orderNo" label-width="140px">
<el-input-number v-model="dialogForm.orderNo" class="mx-4" :min="1" :max="100" controls-position="right" />
@ -136,10 +136,10 @@
<el-option label="注销" value="1"></el-option>
</el-select>
</el-form-item>-->
<el-form-item class="one" label="备注" label-width="140px">
<!-- <el-form-item class="one" label="备注" label-width="140px">
<el-input v-model="dialogForm.bz" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" show-word-limit
maxlength="200"></el-input>
</el-form-item>
</el-form-item> -->
</el-form>
</div>
</div>
@ -215,7 +215,7 @@ const dialogFormVisible = ref(false);
const formLabelWidth = "140px";
// 获取数据的方法
const getListData = async () => {
const params = {...listQuery.value,ssxt:'sgxt'};
const params = { ...listQuery.value, ssxt: 'sgxt' };
loading.value = true
const res = await getSystemMeny(params);
tableData.value = res?.records;
@ -284,12 +284,12 @@ const onSave = () => {
buttonLoading.value = true;
updateSysMenu({
...dialogForm.value,
ssxt:'sgxt'
ssxt: 'sgxt'
})
.then((res) => {
dialogFormVisible.value = false;
ElMessage.success("修改成功");
getListData();
getListData();
buttonLoading.value = false;
})
.finally(() => {
@ -309,12 +309,12 @@ const onAdd = () => {
addSysMenu({
...dialogForm.value,
parentId: id.value,
ssxt:'sgxt'
ssxt: 'sgxt'
})
.then((res) => {
dialogFormVisible.value = false;
ElMessage.success("新增成功");
getListData();
getListData();
})
.finally(() => {
buttonLoading.value = false;

View File

@ -0,0 +1,257 @@
<template>
<el-dialog
v-model="visible"
title="管理用户"
width="1000px"
destroy-on-close
@closed="handleClosed"
>
<div class="user-dialog-content">
<div class="searchBox">
<el-form :model="listQuery" :inline="true">
<el-form-item label="用户名">
<el-input
placeholder="请输入用户名"
v-model="listQuery.userName"
clearable
></el-input>
</el-form-item>
<el-form-item label="电话号码">
<el-input
placeholder="请输入电话号码"
v-model="listQuery.phone"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
</el-form-item>
<el-form-item>
<el-button @click="reset()">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="action-bar">
<el-button type="primary" @click="showChooseUser">添加用户</el-button>
<el-button type="danger" @click="unbundleRole()">批量取消授权</el-button>
</div>
<el-table
ref="multipleTableRef"
:data="tableData"
border
:height="400"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="loginName" align="center" label="用户名" />
<el-table-column prop="userName" align="center" label="用户昵称" />
<el-table-column prop="mobile" width="120px" label="移动电话" />
<el-table-column prop="xtZhxgsj" align="center" label="录入时间">
<template #default="{ row }">
{{ $filters.dateFilter(row.xtLrsj) }}
</template>
</el-table-column>
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-popconfirm
confirm-button-text=""
cancel-button-text=""
icon-color="red"
title="确定要删除?"
@confirm="unbundleRole(row)"
>
<template #reference>
<el-button type="danger" size="small">取消授权</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrap">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="listQuery.page"
:page-sizes="[10, 20, 50, 100]"
:page-size="listQuery.size"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
/>
</div>
</div>
<ChooseUserDialog
v-model="chooseUserVisible"
:roleId="roleId"
@choosedUsers="saveUsers"
/>
</el-dialog>
</template>
<script setup>
import { ref, watch, computed } from 'vue'
import { ElMessage } from 'element-plus'
import {
getRoleUserList,
batchUnboundUserRole,
grantUserToRole
} from '@/api/user-manage'
import ChooseUserDialog from './ChooseUserDialog.vue'
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
roleId: {
type: [String, Number],
default: ''
}
})
const emit = defineEmits(['update:modelValue'])
const visible = computed({
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
})
const listQuery = ref({
page: 1,
size: 20,
userName: '',
phone: ''
})
const total = ref(0)
const tableData = ref([])
const multipleSelection = ref([])
const multipleTableRef = ref(null)
const chooseUserVisible = ref(false)
// 获取列表数据
const getListData = async () => {
if (!props.roleId) return
const params = { ...listQuery.value }
params.current = params.page
params.roleId = props.roleId
const res = await getRoleUserList(params)
tableData.value = res?.records || []
total.value = Number(res.total) || 0
}
// 监听弹窗打开
watch(visible, (val) => {
if (val && props.roleId) {
listQuery.value = {
page: 1,
size: 20,
userName: '',
phone: ''
}
getListData()
}
})
const handleFilter = () => {
listQuery.value.page = 1
getListData()
}
const reset = () => {
listQuery.value = {
page: 1,
size: 20,
userName: '',
phone: ''
}
getListData()
}
const handleSizeChange = (currentSize) => {
listQuery.value.size = currentSize
getListData()
}
const handleCurrentChange = (currentPage) => {
listQuery.value.page = currentPage
getListData()
}
const handleSelectionChange = (val) => {
multipleSelection.value = val
}
// 取消授权
const unbundleRole = (row) => {
const params = {
roleId: props.roleId,
ids: []
}
if (row) {
params.ids.push(row.id)
} else {
if (multipleSelection.value.length <= 0) {
ElMessage.warning('请先选择要取消授权的用户')
return
}
multipleSelection.value.forEach((item) => {
params.ids.push(item.id)
})
}
batchUnboundUserRole(params).then(() => {
ElMessage.success('操作成功')
handleFilter()
})
}
// 显示选择用户弹窗
const showChooseUser = () => {
chooseUserVisible.value = true
}
// 批量添加用户
const saveUsers = (users) => {
if (users.length > 0) {
const userIds = users.map((item) => item.id)
const params = {
roleId: props.roleId,
userIds: userIds
}
grantUserToRole(params).then(() => {
ElMessage.success('添加成功')
handleFilter()
})
}
}
const handleClosed = () => {
tableData.value = []
multipleSelection.value = []
}
</script>
<style lang="scss" scoped>
.user-dialog-content {
.searchBox {
margin-bottom: 15px;
}
.action-bar {
margin-bottom: 15px;
}
.pagination-wrap {
margin-top: 15px;
display: flex;
justify-content: flex-end;
}
}
</style>

View File

@ -0,0 +1,183 @@
<template>
<el-dialog
title="选择用户"
v-model="visible"
width="1200px"
destroy-on-close
append-to-body
>
<div>
<el-form :model="listQuery" :inline="true">
<el-form-item label="所属部门">
<MOSTY.Department width="200px" clearable v-model="listQuery.ssbmdm" />
</el-form-item>
<el-form-item label="用户名">
<el-input
placeholder="请输入用户名"
v-model="listQuery.loginName"
clearable
/>
</el-form-item>
<el-form-item label="电话号码">
<el-input
placeholder="请输入电话号码"
v-model="listQuery.phone"
clearable
/>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
<el-button @click="reset">重置</el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleUserRef"
:data="tableData"
border
:row-key="getRowKey"
height="400"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column prop="loginName" align="center" label="用户名" width="150" />
<el-table-column prop="idEntityCard" align="center" label="身份证号" />
<el-table-column prop="deptName" align="center" label="部门" />
<el-table-column prop="inDustRialId" align="center" width="150" label="警号" />
<el-table-column prop="mobile" width="150" align="center" label="电话" />
<el-table-column prop="sex" align="center" label="性别" width="80">
<template #default="{ row }">
{{ row.sex == 1 ? '男' : '女' }}
</template>
</el-table-column>
</el-table>
<div style="margin-top: 15px; display: flex; justify-content: flex-end;">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="listQuery.current"
:page-sizes="[10, 20, 50, 100]"
:page-size="listQuery.size"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
/>
</div>
</div>
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="onConfirm">确认</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref, computed, watch, nextTick } from 'vue'
import * as MOSTY from '@/components/MyComponents/index'
import { selectUserDeptPage } from '@/api/user-manage'
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
roleId: {
type: [String, Number],
default: ''
}
})
const emit = defineEmits(['update:modelValue', 'choosedUsers'])
const visible = computed({
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
})
const listQuery = ref({
current: 1,
size: 20,
loginName: '',
phone: '',
ssbmdm: ''
})
const total = ref(0)
const tableData = ref([])
const multipleUserRef = ref(null)
const multipleSelectionUser = ref([])
// 监听弹窗打开
watch(visible, (val) => {
if (val) {
nextTick(() => {
getListData()
})
}
})
const getListData = () => {
selectUserDeptPage(listQuery.value).then((res) => {
tableData.value = res?.records || []
total.value = Number(res.total) || 0
})
}
const handleFilter = () => {
listQuery.value.current = 1
getListData()
}
const reset = () => {
listQuery.value = {
current: 1,
size: 20,
loginName: '',
phone: '',
ssbmdm: ''
}
getListData()
}
const handleSizeChange = (currentSize) => {
listQuery.value.size = currentSize
getListData()
}
const handleCurrentChange = (currentPage) => {
listQuery.value.current = currentPage
getListData()
}
const getRowKey = (row) => row.id
const handleSelectionChange = (val) => {
multipleSelectionUser.value = val
}
const onConfirm = () => {
const userList = multipleSelectionUser.value
// 去重
const list = []
const listId = []
userList.forEach((val) => {
if (listId.indexOf(val.id) === -1) {
list.push(val)
listId.push(val.id)
}
})
emit('choosedUsers', list)
handleClose()
}
const handleClose = () => {
multipleSelectionUser.value = []
if (multipleUserRef.value && tableData.value.length > 0) {
tableData.value.forEach(item => {
multipleUserRef.value.toggleRowSelection(item, false)
})
}
emit('update:modelValue', false)
}
</script>

View File

@ -7,7 +7,7 @@
:destroy-on-close="true"
@close="closed"
>
<div class="treeCnt">
<div class="treeCnt" v-loading="loading" element-loading-text="加载中...">
<el-tree
ref="treeRef"
:data="allPermission"
@ -21,7 +21,7 @@
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<el-button type="primary" @click="onComfirm">保存</el-button>
<el-button type="primary" @click="onComfirm" :loading="saveLoading">保存</el-button>
</div>
</template>
</el-dialog>
@ -30,12 +30,13 @@
<script setup>
import { ElMessage } from "element-plus";
import { defineProps, watch, ref, nextTick } from "vue";
import { watch, ref, nextTick } from "vue";
import {
saveRoleMenuInfo,
getRoleMenuIds,
getMenuTree
} from "@/api/user-manage";
const props = defineProps({
modelValue: {
type: Boolean,
@ -48,6 +49,10 @@ const props = defineProps({
});
const emits = defineEmits(["update:modelValue", "updateRole"]);
const loading = ref(false);
const saveLoading = ref(false);
const closed = () => {
emits("update:modelValue", false);
};
@ -55,33 +60,6 @@ const closed = () => {
// 控制父子关联:操作时关联,回显时不关联
const checkStrictly = ref(false);
// 递归收集所有子节点id
const getAllChildKeys = (node) => {
let keys = [];
if (node.sysMenuList && node.sysMenuList.length) {
node.sysMenuList.forEach((child) => {
keys.push(child.id);
keys = keys.concat(getAllChildKeys(child));
});
}
return keys;
};
// 递归收集所有祖先节点id
const getAllParentKeys = (nodeId, tree, parentKeys = []) => {
for (const node of tree) {
if (node.id === nodeId) return parentKeys;
if (node.sysMenuList && node.sysMenuList.length) {
const result = getAllParentKeys(nodeId, node.sysMenuList, [
...parentKeys,
node.id
]);
if (result) return result;
}
}
return null;
};
// 提交:选中的节点 + 所有祖先节点都传给后端
const onComfirm = () => {
const checkedKeys = treeRef.value.getCheckedKeys();
@ -92,10 +70,15 @@ const onComfirm = () => {
roleId: Number(props.roleId),
menuIds: submitKeys.map((item) => Number(item))
};
saveRoleMenuInfo(params).then((res) => {
ElMessage.success("操作成功");
});
closed();
saveLoading.value = true;
saveRoleMenuInfo(params)
.then(() => {
ElMessage.success("操作成功");
closed();
})
.finally(() => {
saveLoading.value = false;
});
};
//所有权限
@ -127,10 +110,15 @@ watch(
() => props.modelValue,
async (val) => {
if (val && props.roleId) {
loading.value = true;
checkStrictly.value = false;
treeRef.value?.setCheckedKeys([]);
await getPermissionList();
getRolePermission();
try {
await getPermissionList();
await getRolePermission();
} finally {
loading.value = false;
}
}
}
);

View File

@ -241,6 +241,10 @@
v-model="privilegesDialogVisible"
:roleId="currentRow.id"
></PrivilegesDialog>
<AllocationUserDialog
v-model="allocationUserVisible"
:roleId="currentRow.id"
/>
</div>
</template>
@ -248,6 +252,7 @@
import * as rule from "@/utils/rules.js";
import * as MOSTY from "@/components/MyComponents/index";
import PrivilegesDialog from "./conponents/PrivilegesDialog.vue";
import AllocationUserDialog from "./conponents/AllocationUserDialog.vue";
import { ElMessage } from "element-plus";
import { ref, onMounted, getCurrentInstance, onUnmounted } from "vue";
const { proxy } = getCurrentInstance();
@ -258,7 +263,6 @@ import {
updateSysRole,
deleteSysRole
} from "@/api/user-manage";
import { useRouter } from "vue-router";
const searchBox = ref(null); // 搜索盒子
const keyCount = ref(0); //tabel组件刷新值
const tableHeight = ref(); // 表格高度
@ -342,6 +346,7 @@ const updateDict = (row) => {
/**privileges 分配权限 */
const privilegesDialogVisible = ref(false);
const allocationUserVisible = ref(false);
const privilegesHanlder = (row) => {
privilegesDialogVisible.value = true;
currentRow.value = { ...row };
@ -419,10 +424,9 @@ const closeDialog = () => {
};
//分配用户
const router = useRouter();
const allocationUser = (row) => {
//
router.push(`/user/allocationUser/${row.id}`);
currentRow.value = { ...row };
allocationUserVisible.value = true;
};
// 高度计算
const tabHeightFn = () => {

60
src/views/error/401.vue Normal file
View File

@ -0,0 +1,60 @@
<template>
<div class="error-page">
<div class="error-content">
<h1>401</h1>
<h2>无访问权限</h2>
<p>您没有权限访问此页面请联系管理员申请相关权限</p>
<el-button type="primary" @click="goBack">返回上一页</el-button>
<el-button @click="goHome">返回首页</el-button>
</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
const goBack = () => {
router.go(-1)
}
const goHome = () => {
router.push('/')
}
</script>
<style scoped>
.error-page {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.error-content {
text-align: center;
color: #fff;
}
.error-content h1 {
font-size: 120px;
margin: 0;
font-weight: 700;
}
.error-content h2 {
font-size: 32px;
margin: 20px 0;
}
.error-content p {
font-size: 16px;
margin-bottom: 30px;
}
.error-content .el-button {
margin: 0 10px;
}
</style>

64
src/views/error/404.vue Normal file
View File

@ -0,0 +1,64 @@
<template>
<div class="error-page">
<div class="error-content">
<h1>404</h1>
<h2>无权限访问</h2>
<p>您没有权限访问此页面请联系上级部门添加相关权限</p>
<el-button type="primary" @click="goHome">返回首页</el-button>
<el-button @click="logout">退出登录</el-button>
</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
import { useStore } from 'vuex'
const router = useRouter()
const store = useStore()
const goHome = () => {
router.push('/')
}
const logout = () => {
store.dispatch("user/logout")
}
</script>
<style scoped>
.error-page {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
}
.error-content {
text-align: center;
color: #333;
}
.error-content h1 {
font-size: 120px;
margin: 0;
font-weight: 700;
color: #667eea;
}
.error-content h2 {
font-size: 32px;
margin: 20px 0;
}
.error-content p {
font-size: 16px;
margin-bottom: 30px;
color: #666;
}
.error-content .el-button {
margin: 0 10px;
}
</style>

View File

@ -103,34 +103,34 @@ const router = useRouter();
const { proxy } = getCurrentInstance();
const {
D_GS_ZDR_CZZT,
D_GS_BK_SQLX,
// D_GS_BK_SQLX,
D_GS_ZDQT_FXDJ,
D_GS_ZDR_RYJB,
D_GS_ZDQT_LB,
D_GS_ZDR_BK_ZT,
D_GS_BQ_LX,
// D_GS_BQ_LX,
D_GS_ZDQT_ZT,
D_BZ_SF,
D_BZ_XB,
D_GS_XS_LY,
D_BZ_SSZT,
D_GS_XS_LX,
D_GS_XS_QTLX
// D_BZ_SF,
// D_BZ_XB,
// D_GS_XS_LY,
// D_BZ_SSZT,
// D_GS_XS_LX,
// D_GS_XS_QTLX
} = proxy.$dict(
"D_GS_ZDR_CZZT",
"D_GS_BK_SQLX",
// "D_GS_BK_SQLX",
"D_GS_ZDQT_FXDJ",
"D_GS_ZDR_RYJB",
"D_GS_ZDQT_LB",
"D_GS_ZDR_BK_ZT",
"D_GS_BQ_LX",
"D_GS_ZDQT_ZT",
"D_BZ_SF",
"D_BZ_XB",
"D_GS_XS_LY",
"D_BZ_SSZT",
"D_GS_XS_LX",
"D_GS_XS_QTLX"
// "D_GS_BQ_LX",
"D_GS_ZDQT_ZT"
// "D_BZ_SF",
// "D_BZ_XB",
// "D_GS_XS_LY",
// "D_BZ_SSZT",
// "D_GS_XS_LX",
// "D_GS_XS_QTLX"
); //获取字典数据
const props = defineProps({
modelValue: {

View File

@ -146,17 +146,17 @@ const {
D_BZ_XZQHDM,
D_GS_ZDR_BK_ZT,
D_GS_ZDR_CZZT,
D_GS_BQ_ZL,
D_GS_BQ_LB,
D_GS_BQ_LX,
D_GS_ZDR_YJDJ,
D_GS_BK_SSJZ,
D_GS_BK_SQLX,
D_BZ_SF,
D_GS_XS_LY,
D_BZ_SSZT,
D_GS_XS_LX,
D_GS_XS_QTLX
// D_GS_BQ_ZL,
// D_GS_BQ_LB,
// D_GS_BQ_LX,
// D_GS_ZDR_YJDJ,
// D_GS_BK_SSJZ,
// D_GS_BK_SQLX,
// D_BZ_SF,
// D_GS_XS_LY,
// D_BZ_SSZT,
// D_GS_XS_LX,
// D_GS_XS_QTLX
} = proxy.$dict(
"D_GS_ZDQT_ZT",
"D_GS_ZDR_RYJB",
@ -164,18 +164,18 @@ const {
"D_BZ_MZ",
"D_BZ_XZQHDM",
"D_GS_ZDR_BK_ZT",
"D_GS_ZDR_CZZT",
"D_GS_BQ_ZL",
"D_GS_BQ_LB",
"D_GS_BQ_LX",
"D_GS_ZDR_YJDJ",
"D_GS_BK_SSJZ",
"D_GS_BK_SQLX",
"D_BZ_SF",
"D_GS_XS_LY",
"D_BZ_SSZT",
"D_GS_XS_LX",
"D_GS_XS_QTLX"
"D_GS_ZDR_CZZT"
// "D_GS_BQ_ZL",
// "D_GS_BQ_LB",
// "D_GS_BQ_LX",
// "D_GS_ZDR_YJDJ",
// "D_GS_BK_SSJZ",
// "D_GS_BK_SQLX",
// "D_BZ_SF",
// "D_GS_XS_LY",
// "D_BZ_SSZT",
// "D_GS_XS_LX",
// "D_GS_XS_QTLX"
);
const obj = ref({});
const props = defineProps({

View File

@ -60,7 +60,29 @@ import { timeValidate } from '@/utils/tools.js'
const route = useRoute()
const router = useRouter()
const { proxy } = getCurrentInstance()
const { D_GS_BQ_DJ, JQLB, JQLX, JQXL, JQZL, D_BZ_JQLY, D_BZ_JQFL, JQLB_DP, D_BZ_JQBQ, D_GS_SSYJ } = proxy.$dict('D_GS_BQ_DJ', "JQLB", 'JQLX', 'JQXL', 'JQZL', 'D_BZ_JQLY', 'D_BZ_JQFL', 'JQLB_DP', 'D_BZ_JQBQ', 'D_GS_SSYJ'); //获取字典数据
const {
D_GS_BQ_DJ,
JQLB,
// JQLX,
// JQXL,
// JQZL,
// D_BZ_JQLY,
// D_BZ_JQFL,
// JQLB_DP,
// D_BZ_JQBQ,
// D_GS_SSYJ
} = proxy.$dict(
'D_GS_BQ_DJ',
"JQLB"
// 'JQLX',
// 'JQXL',
// 'JQZL',
// 'D_BZ_JQLY',
// 'D_BZ_JQFL',
// 'JQLB_DP',
// 'D_BZ_JQBQ',
// 'D_GS_SSYJ'
); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,

View File

@ -76,10 +76,12 @@ import Pages from "@/components/aboutTable/Pages.vue";
import { xxcjXfxsSelectPage } from "@/api/xxcj.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_SF, D_GS_XS_SJLY, D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ, D_GS_XS_CZZT } =
const { D_BZ_SF,
// D_GS_XS_SJLY,
D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ, D_GS_XS_CZZT } =
proxy.$dict(
"D_BZ_SF",
"D_GS_XS_SJLY",
// "D_GS_XS_SJLY",
"D_GS_XS_ZLLX",
"D_GS_ZDQT_FXDJ",
"D_GS_XS_CZZT"

View File

@ -78,8 +78,8 @@ import Pages from "@/components/aboutTable/Pages.vue";
import { xxcjQbcjSelectPage, xxcjXfxsSelectPage } from "@/api/xxcj.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_XS_CZZT, D_GS_XS_LY, D_GS_XS_LX, D_BZ_XSSHZT } = proxy.$dict(
"D_GS_XS_CZZT",
const { /* D_GS_XS_CZZT, */ D_GS_XS_LY, D_GS_XS_LX, D_BZ_XSSHZT } = proxy.$dict(
/* "D_GS_XS_CZZT", */
"D_GS_XS_LY",
"D_GS_XS_LX",
"D_BZ_XSSHZT"

View File

@ -23,11 +23,7 @@
<!-- <KeyPpersonneltypes /> -->
<MyCase />
</div>
<div
class="commom-aside"
@mouseenter="mouseEnter"
@mouseleave="mouseLeave"
>
<div class="commom-aside" @mouseenter="mouseEnter" @mouseleave="mouseLeave">
<div class="relative-full-height">
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="reversalPushShow" class="flip-wrapper">
@ -46,11 +42,7 @@
<div class="commom-aside-big">
<Calendar />
</div>
<div
class="commom-aside-big"
@mouseenter="mouseEnter"
@mouseleave="mouseLeave"
>
<div class="commom-aside-big" @mouseenter="mouseEnter" @mouseleave="mouseLeave">
<transition name="flip" mode="out-in">
<div :key="'qb'" v-if="reversalShow" class="flip-wrapper">
<Experience @reversalPush="reversal"></Experience>
@ -80,17 +72,8 @@
</el-icon>
</div>
<div class="icon-button notification-button">
<el-tooltip
class="item"
effect="dark"
:content="showNotification ? '通知关闭' : '通知打开'"
placement="bottom"
>
<el-icon
:size="20"
@click="handleOpenNotification"
class="icon-top"
>
<el-tooltip class="item" effect="dark" :content="showNotification ? '通知关闭' : '通知打开'" placement="bottom">
<el-icon :size="20" @click="handleOpenNotification" class="icon-top">
<Open v-if="showNotification" />
<TurnOff v-else />
</el-icon>
@ -108,18 +91,11 @@
</div>
<div class="search-container">
<div class="search-icon">
<el-icon
:size="20"
@click="showSeatch = !showSeatch"
class="icon-top"
>
<el-icon :size="20" @click="showSeatch = !showSeatch" class="icon-top">
<Search />
</el-icon>
</div>
<div
:style="{ width: showSeatch ? '270px' : '0' }"
class="trnsitinForm"
>
<div :style="{ width: showSeatch ? '270px' : '0' }" class="trnsitinForm">
<el-input v-model="searchText" placeholder="请输入身份证" clearable>
<template #append>
<el-button type="primary" @click="handleSearch">搜索</el-button>
@ -172,6 +148,9 @@
</template>
<script setup>
defineOptions({
name: 'HomePage'
});
import QxsqDialog from "./components/qxsqDialog.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted, getCurrentInstance } from "vue";
@ -517,7 +496,7 @@ const handleCloseYp = () => {
// 自动刷新定时器逻辑
// ============================================
const refreshTimer = ref(null);
const IDLE_TIMEOUT = 15 * 60 * 1000;
const IDLE_TIMEOUT = 30 * 60 * 1000;
const resetRefreshTimer = () => {
if (refreshTimer.value) {
@ -753,7 +732,7 @@ const MapCenter = () => {
}
/* 收缩时只显示第一个图标,隐藏其他内容 */
.badge-content:not(.expanded) > :not(:first-child) {
.badge-content:not(.expanded)> :not(:first-child) {
opacity: 0;
max-height: 0;
margin: 0;

View File

@ -75,7 +75,8 @@
<div class="flex align-center">
<img class="mr10" src="@/assets/images/icon_046.png" alt="" />
<div class="f14 user-info">
<div :style="{ color: isRed ? '#ff5500' : '#fff', fontWeight: isRed ? 'bold' : 'normal' }">{{ userName }}</div>
<div :style="{ color: isRed ? '#ff5500' : '#fff', fontWeight: isRed ? 'bold' : 'normal' }">{{ userName }}
</div>
<div class="dept-text" :title="dept">{{ dept }}</div>
</div>
@ -111,6 +112,7 @@ import { timeValidate, weekValidate } from "@/utils/tools.js";
import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router";
import { useStore } from "vuex";
import { getUserIsRed } from "@/api/sys.js"
import { ElMessage } from 'element-plus'
const icon1 = require("@/assets/images/icon_048.png"); //晴天
const icon2 = require("@/assets/images/icon_049.png"); //小雨
const icon3 = require("@/assets/images/icon_050.png"); //高温
@ -180,29 +182,59 @@ function getIsRed() {
}
// 按钮切换
const handleBtns = (val) => {
console.log('[head.vue] 按钮点击:', val, '时间:', Date.now());
btnsActive.value = val;
// 获取用户权限
const menusPermission = getItem('menusPermission') || []
// 权限检查映射
const permissionMap = {
"数据整合": "mpvPeo",
"实战支撑": "InfoCollection",
"分析研判": "ResearchHome",
"安全监控": "resourceMonitoring"
}
// 检查权限
const checkPermission = (name) => {
const permission = permissionMap[name]
if (permission && !menusPermission.includes(permission)) {
ElMessage.warning('您没有访问权限,请联系管理员')
return false
}
return true
}
switch (val) {
case "数据整合":
router.push("/mpvPeo");
if (checkPermission("数据整合")) {
router.push("/mpvPeo")
}
break;
case "实战支撑":
router.push("/InfoCollection");
if (checkPermission("实战支撑")) {
router.push("/InfoCollection");
}
break;
case "分析研判":
router.push("/ResearchHome");
if (checkPermission("分析研判")) {
router.push("/ResearchHome");
}
break;
case "安全监控":
if (checkPermission("安全监控")) {
router.push("/resourceMonitoring");
}
break;
case "后台":
if (props.defDay) {
router.push("/YjData");
router.push("/forumPost");
} else {
router.push("/");
}
break;
case "安全监控":
router.push("/resourceMonitoring");
break;
case "退出登录":
store.dispatch("user/logout");
break;

View File

@ -20,7 +20,7 @@ import * as MOSTY from "@/components/MyComponents/index";
import CheckBox from "@/components/checkBox/index.vue";
import { ref ,reactive, onMounted,getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();
const {D_GS_ZDQT_LB,D_BZ_YJJB} =proxy.$dict('D_GS_ZDQT_LB','D_BZ_YJJB')
const { /* D_GS_ZDQT_LB, D_BZ_YJJB */ } = proxy.$dict(/* 'D_GS_ZDQT_LB', 'D_BZ_YJJB' */)
const checkData = reactive({
list: ["人员", "车辆"],
hasChoose: ["人员", "车辆"],

View File

@ -66,8 +66,46 @@ import { useRoute,useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const { proxy } = getCurrentInstance()
const { D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
proxy.$dict("D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_ZDR_YJDJ", "D_GS_BK_SSJZ", "D_GS_BK_SQLX", "D_BZ_SF", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX");
const {
D_GS_ZDQT_ZT,
D_GS_ZDR_RYJB,
D_BZ_XB,
D_BZ_MZ,
D_BZ_XZQHDM,
D_GS_ZDR_BK_ZT,
D_GS_ZDR_CZZT,
// D_GS_BQ_ZL,
// D_GS_BQ_LB,
// D_GS_BQ_LX,
// D_GS_ZDR_YJDJ,
// D_GS_BK_SSJZ,
// D_GS_BK_SQLX,
// D_BZ_SF,
// D_GS_XS_LY,
// D_BZ_SSZT,
// D_GS_XS_LX,
// D_GS_XS_QTLX
} =
proxy.$dict(
"D_GS_ZDQT_ZT",
"D_GS_ZDR_RYJB",
"D_BZ_XB",
"D_BZ_MZ",
"D_BZ_XZQHDM",
"D_GS_ZDR_BK_ZT",
"D_GS_ZDR_CZZT"
// "D_GS_BQ_ZL",
// "D_GS_BQ_LB",
// "D_GS_BQ_LX",
// "D_GS_ZDR_YJDJ",
// "D_GS_BK_SSJZ",
// "D_GS_BK_SQLX",
// "D_BZ_SF",
// "D_GS_XS_LY",
// "D_BZ_SSZT",
// "D_GS_XS_LX",
// "D_GS_XS_QTLX"
);
const props = defineProps({
modelValue: {
type: Boolean,