This commit is contained in:
lcw
2026-04-21 17:01:37 +08:00
13 changed files with 165 additions and 90 deletions

View File

@ -216,6 +216,7 @@ const getLoginAccountInfo =() =>{
// 加入会议
const openInit = (it,type) =>{
log(it,type,'=======加入会议');
modleType.value = type;
if(type == '会议'){
//判断是否有会议号
@ -241,6 +242,7 @@ const openInit = (it,type) =>{
onMounted(()=>{
console.log('组件挂载了');
jsonData.value = require('./components/zh_CN.json');
nextTick(()=>{
Init();

View File

@ -9,7 +9,7 @@
<el-select v-if="item.showType === 'select'" v-model="searchObj[item.prop]" :multiple="item.multiple"
:clearable="item.clearable" :filterable="item.filterable" :placeholder="item.placeholder" collapse-tags
collapse-tags-tooltip class="control-select">
<el-option v-for="obj in getOptions[item.prop]" :key="obj.value" :label="obj.label || obj.lable"
<el-option v-for="obj in (getOptions[item.prop] || [])" :key="obj.value" :label="obj.label || obj.lable"
:value="obj.value" />
</el-select>
<!-- input -->
@ -412,12 +412,12 @@ const cascaderLazyProps = reactive({
}
});
// 获取到传过来的参数
let getArr = reactive([]);
let getArr = ref([]);
const submit = () => {
emit("submit", searchObj);
};
const reset = () => {
getArr.forEach((item) => {
getArr.value.forEach((item) => {
searchObj[item.prop] = item.defaultVal;
});
emit("reset", true);
@ -430,63 +430,63 @@ defineExpose({
submit,
reset
});
// 优化 watchEffect 为 watch避免因 reactive 内部状态变化导致频繁重新执行
// 监听 searchArr 变化,同时监听内部 options 的异步更新
watch(() => props.searchArr, (newArr) => {
loadingPage.value = true;
// 使用 try-catch 防止解析失败导致崩溃
try {
let arr = JSON.parse(JSON.stringify(newArr));
getArr = arr.map((item) => {
switch (item.showType) {
// 不再深拷贝,保留响应式引用
getArr.value = newArr.map((item) => {
const itemCopy = { ...item }; // 浅拷贝即可
switch (itemCopy.showType) {
case "select":
item = { ...selectDefault, ...item };
item.options = reactive(item.options);
getOptions[item.prop] = item.options;
Object.assign(itemCopy, { ...selectDefault, ...itemCopy });
// 直接引用原 options,保持响应式
getOptions[itemCopy.prop] = itemCopy.options || [];
break;
case "input":
item = { ...inputDefault, ...item };
Object.assign(itemCopy, { ...inputDefault, ...itemCopy });
break;
case "daterange":
item = { ...daterangeDefault, ...item };
if (item.defaultShortcuts) item.shortcuts = shortcuts;
Object.assign(itemCopy, { ...daterangeDefault, ...itemCopy });
if (itemCopy.defaultShortcuts) itemCopy.shortcuts = shortcuts;
break;
case "date":
item = { ...defaultDate, ...item };
if (item.defaultShortcuts) {
item.shortcuts = dateShortcuts;
Object.assign(itemCopy, { ...defaultDate, ...itemCopy });
if (itemCopy.defaultShortcuts) {
itemCopy.shortcuts = dateShortcuts;
}
break;
case "checkbox":
item = reactive({ ...defaultCheckbox, ...item });
item.checkboxValueArr = item.options.map((obj) => {
Object.assign(itemCopy, { ...defaultCheckbox, ...itemCopy });
itemCopy.checkboxValueArr = (itemCopy.options || []).map((obj) => {
return obj.value;
});
break;
case "cascader":
item = { ...defaultCascader, ...item };
if (item.lazy) {
cascaderLazyProps.checkStrictly = item.checkStrictly;
item.props = { ...cascaderLazyProps, ...(item.props || {}) };
delete item.options;
Object.assign(itemCopy, { ...defaultCascader, ...itemCopy });
if (itemCopy.lazy) {
cascaderLazyProps.checkStrictly = itemCopy.checkStrictly;
itemCopy.props = { ...cascaderLazyProps, ...(itemCopy.props || {}) };
delete itemCopy.options;
} else {
item.props = {
itemCopy.props = {
...defaultCascader.props,
...(item.props || {}),
...{ checkStrictly: item.checkStrictly }
...(itemCopy.props || {}),
...{ checkStrictly: itemCopy.checkStrictly }
};
getOptions[item.prop] = reactive(item.options);
getOptions[itemCopy.prop] = itemCopy.options || [];
}
break;
}
loadingPage.value = false;
searchObj[item.prop] = item.defaultVal;
return item;
searchObj[itemCopy.prop] = itemCopy.defaultVal;
return itemCopy;
});
} catch (e) {
console.error('Search组件初始化失败:', e);
console.error('Search组件解析searchArr失败:', e);
} finally {
loadingPage.value = false;
}
}, { immediate: true, deep: false });
}, { immediate: true, deep: true }); // 开启深度监听,检测 options 变化
</script>
<style scoped lang="scss">

View File

@ -75,10 +75,10 @@ const handleClick = () => {
xxlx: ""
}
queryWdxxPageList({ ...promes, xxlx: 100 }).then((res) => {
xxListData.xtxxNumber = res.total
xxListData.xtxxNumber = res?.total || 0
});
queryWdxxPageList({ ...promes, xxlx: 200 }).then((res) => {
xxListData.tztgNumber = res.total
xxListData.tztgNumber = res?.total || 0
});
}

View File

@ -10,7 +10,6 @@
<div class="form_cnt">
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px" ref="elform"
:rules="rules">
</FormMessage>
</div>
</div>
@ -124,9 +123,9 @@ const getDataById = (id) => {
// 提交
const submit = () => {
elform.value.submit((data) => {
data.fjdz = data.fjdz?.join(",");
let url = title.value == "新增" ? "/mosty-gsxt/tbGsxtZdcl/add" : "/mosty-gsxt/tbGsxtZdcl/update";
let params = { ...data };
params.fjdz = data.fjdz?.join(",");
loading.value = true;
qcckPost(params, url).then(() => {
loading.value = false;

View File

@ -193,8 +193,8 @@ const pageData = reactive({
{ label: "车架号", prop: "clCjh" },
{ label: "车辆颜色", prop: "clYs", showOverflowTooltip: true },
{ label: "车辆所有人", prop: "clSyr" },
{ label: "管辖单位", prop: "gxSsbmmc", showSolt: true },
{ label: "管控民警姓名", prop: "gkMjXm", showSolt: true },
{ label: "管辖单位", prop: "gxSsbmmc"},
{ label: "管控民警姓名", prop: "gkMjXm"},
// { label: "状态", prop: "xtSjzt", showSolt: true },
// { label: "审核状态", prop: "zdrZt", showSolt: true },
]

View File

@ -58,24 +58,17 @@
</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="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>
<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">上报区厅</el-link>
<el-link
v-if="isShowBtn('送审', row) && qxkz.deptLevel == '01'"
: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="row.lczt == '04'">上报区厅</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'"
@ -87,31 +80,29 @@
<!-- 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.xldshzt == '02'&&row.lczt == '02')">上报</el-link>
<el-link v-if="isShowBtn('上报') && qxkz.deptLevel == '03' && row.lczt == '04'" size="small" type="primary" @click="appearNewspapers(row)" :disabled="row.lczt != '01'">上报</el-link>
<el-link v-else-if="isShowBtn('上报') && row.lczt == '04'" size="small" type="primary" @click="appearNewspapers(row)" :disabled="!(row.xldshzt == '02'&&row.lczt == '02')">上报</el-link>
<!-- && row.lczt != '02' -->
<el-link v-if="isShowBtn('分组')" size="small" type="primary" @click="opneMsg(row)"
<el-link v-if="isShowBtn('分组') && row.lczt == '04'" size="small" type="primary" @click="opneMsg(row)"
:disabled="row.sldshzt != '02'">分组</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)" size="small" type="primary"
@click="addEdit('followUpReport', row)">续报</el-link>
<el-link v-if="isShowBtn('修改', row) && row.lczt == '04'" 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('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)"
:disabled="row.sldshzt != '02'">转线索</el-link>
<el-link v-if="isShowBtn('转线索') && row.lczt == '04'" size="small" type="primary" @click="FollowUpOnLeads(row)" :disabled="row.sldshzt != '02'">转线索</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'" :disabled="row.sldshzt != '02'" size="small" type="primary" @click="FollowUpOnDept(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('打标签')" 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>
<el-link v-if="isShowBtn('打标签') && row.lczt == '04'" size="small" type="primary" @click="openCustomTag(row)" :disabled="row.sldshzt != '02'">打标签</el-link>
<el-link v-if="row.lczt == '04'" size="small" type="primary" @click="handleAttention(row)">{{ row.sfgz == '1' ? '取消关注':'关注'}}</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -190,7 +181,7 @@ import Configuration from '../components/configuration.vue'
import transferMerchant from "./components/transferMerchant.vue";
import { Edit } from "@element-plus/icons";
const { proxy } = getCurrentInstance();
const { 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_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)
@ -221,6 +212,8 @@ const searchConfiger = ref([
{ 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: [],

View File

@ -70,6 +70,30 @@ const searchConfiger = ref([
showType: "select",
// options: Object.keys(jflylxTypes).map(key => ({ label: jflylxTypes[key], value: key }))
},
{
label: "编号",
prop: "baseNo",
placeholder: "请输入编号",
showType: "input",
},
{
label: "类型名称",
prop: "typeName",
placeholder: "请输入类型名称",
showType: "input",
},
{
label: "标题",
prop: "title",
placeholder: "请输入标题",
showType: "input",
},
{
label: "上报单位",
prop: "reportUnitName",
placeholder: "请输入上报单位",
showType: "input",
},
]);
const searchBox = ref(); //搜索框
const pageData = reactive({

View File

@ -629,7 +629,7 @@ const submit = () => {
bklx = "02";
}
let params = { ...listQuery.value, bklx: bklx };
params.bkfj = params.bkfj ? params.bkfj.join(",") : "";
params.bkfj = params.bkfj ? JSON.stringify(params.bkfj) : "";
params.bkdxList = params.bkdxList ? params.bkdxList : [];
params.bkdxList.forEach((item) => {
if (Array.isArray(item.fjZp)) {
@ -640,10 +640,7 @@ const submit = () => {
});
loading.value = true;
let url =
title.value == "新增"
? "/mosty-gsxt/tbGsxtBk/save"
: "/mosty-gsxt/tbGsxtBk/update";
let url = title.value == "新增" ? "/mosty-gsxt/tbGsxtBk/save" : "/mosty-gsxt/tbGsxtBk/update";
qcckPost(params, url)
.then((res) => {
proxy.$message({ type: "success", message: "布控成功" });
@ -772,7 +769,18 @@ const changeXzqh = (val) => {
// 根据id获取详情
const getDataById = (id) => {
qcckGet({}, "/mosty-gsxt/tbGsxtBk/selectVoById/" + id).then((res) => {
res.bkfj = res.ossList || [];
// 兼容处理:优先使用 ossList为空则解析 bkfj JSON 字符串
if (res.ossList && res.ossList.length > 0) {
res.bkfj = res.ossList;
} else if (res.bkfj) {
try {
res.bkfj = JSON.parse(res.bkfj);
} catch (e) {
res.bkfj = [];
}
} else {
res.bkfj = [];
}
listQuery.value = res || {};
dataOrge.value = res;
if (res.bkqyList) {

View File

@ -177,6 +177,7 @@ const pageData = reactive({
{ label: "开始时间", prop: "bkSjKs", showOverflowTooltip: true },
{ label: "结束时间", prop: "bkSjJs", showOverflowTooltip: true },
{ label: "申请人", prop: "bkfqrXm" },
{ label: "身份证号", prop: "bkfqrSfzh" },
{ label: "布控状态", prop: "bkZt", showSolt: true },
]
});
@ -196,9 +197,28 @@ const createProcess = (row) => {
onMounted(() => {
getList();
tabHeightFn();
if(route.name == 'PrivateSurveillance'){
// 临时布控
searchConfiger.value = [
...searchConfiger.value,
{
label: "姓名",
prop: "bkfqrXm",
placeholder: "请输入姓名",
showType: "input"
},
{
label: "身份证号",
prop: "bkfqrSfzh",
placeholder: "请输入身份证号",
showType: "input"
}
]
}
});
// 搜索
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
@ -229,7 +249,7 @@ const getList = () => {
};
qcckGet(data, "/mosty-gsxt/tbGsxtBk/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;

View File

@ -384,7 +384,7 @@ const submit = () => {
bklx = '02'
}
let params = { ...listQuery.value, bklx: bklx };
params.bkfj = params.bkfj ? params.bkfj.join(',') : '';
params.bkfj = params.bkfj ? JSON.stringify(params.bkfj) : "";
params.bkdxList = params.bkdxList ? params.bkdxList : [];
params.bkdxList.forEach(item => {
if (Array.isArray(item.fjZp)) {
@ -523,7 +523,18 @@ const changeXzqh = (val) => {
// 根据id获取详情
const getDataById = (id) => {
qcckGet({}, '/mosty-gsxt/tbGsxtBk/selectVoById/' + id).then(res => {
res.bkfj = res.ossList || [];
// 兼容处理:优先使用 ossList为空则解析 bkfj JSON 字符串
if (res.ossList && res.ossList.length > 0) {
res.bkfj = res.ossList;
} else if (res.bkfj) {
try {
res.bkfj = JSON.parse(res.bkfj);
} catch (e) {
res.bkfj = [];
}
} else {
res.bkfj = [];
}
listQuery.value = res || {}
dataOrge.value = res
if (res.bkqyList) {

View File

@ -74,9 +74,6 @@
<DetailForm ref="detailDiloag" @updateDate="getList" />
<RoomDetail />
<ConferenceRoom v-model="conferenceRoomVisible" titleValue="会议详情" />
<!-- 音视频会议窗口 -->
<MeetingView ref="refMeetingView" :update="updateItem"></MeetingView>
@ -107,7 +104,6 @@ import ViewFeedback from "./components/ViewFeedback.vue";
import { useRoute, useRouter } from 'vue-router';
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import ConferenceRoom from "./components/Communications/conferenceRoom.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import Information from "@/views/home/model/information.vue";
import { isShiQingZhi } from "@/utils/auth.js"
@ -262,11 +258,6 @@ const tabHeightFn = () => {
};
};
// 会议详情弹窗
const conferenceRoomVisible = ref(false);
const seedFqzl = () => {
semdFqzlRef.value.getsendFqzl()
}

View File

@ -16,6 +16,12 @@
<span v-else class="placeholder-text">请选择关联线索</span>
</div>
</template>
<template #fjzd>
<div>
<MOSTY.Upload :showBtn="true" :limit="10" :isImg="false" :isAll="true" v-model="listQuery.fjzd" />
<div class="upload-tip">支持pngjpgjpeg文件上传</div>
</div>
</template>
</FormMessage>
</div>
<div v-if="title == '详情'" class="timeline-container">
@ -49,6 +55,7 @@
<script setup>
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 { useRouter } from 'vue-router'
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick ,watch} from "vue";
@ -79,7 +86,7 @@ watch(() => props.dic, (newVal) => {
{ label: "主送单位", prop: "zsdw", type: "department" },
{ label: "抄送单位", prop: "csdw", type: "department" },
{ label: "指令内容", prop: "zlnr", type: "textarea", width: '100%' },
{ label: "附件", prop: "fjzd", type: "upload", width: '100%' },
{ label: "附件", prop: "fjzd", type: "slot", width: '100%' },
]
}
},{deep: true})
@ -133,6 +140,17 @@ const submit = () => {
let params = { ...data }
loading.value = true;
params.fjzd = params.fjzd ? params.fjzd.join(',') : ''
// 将主送单位和抄送单位转换为下发部门列表
let xfbmList = [];
const zsdwArr = Array.isArray(params.zsdw) ? params.zsdw : (params.zsdw ? [params.zsdw] : []);
zsdwArr.forEach(code => {
xfbmList.push({ ssbmdm: code });
});
const csdwArr = Array.isArray(params.csdw) ? params.csdw : (params.csdw ? [params.csdw] : []);
csdwArr.forEach(code => {
xfbmList.push({ ssbmdm: code });
});
params.xfbmList = xfbmList;
qcckPost(params, url).then((res) => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
@ -161,7 +179,6 @@ defineExpose({ init });
height: 32px;
border-radius: 4px;
border: 1px solid #e9e9e9;
padding-left: 10px;
}
// 新增类样式
@ -180,7 +197,11 @@ defineExpose({ init });
}
.placeholder-text {
color: #b8b8b8;
color: #fff;
display: inline-block;
padding-right: 4px;
padding-left: 4px;
background: #409eff;
}
.timeline-container {
@ -266,4 +287,10 @@ defineExpose({ init });
// white-space: pre-wrap;
}
}
.upload-tip {
font-size: 12px;
color: #909399;
line-height: 1.5;
}
</style>

View File

@ -331,7 +331,7 @@ const delDictItem = (row) => {
id: Number(row.id)
}).then((res) => {
ElMessage.success("删除成功");
handleFilter();
getListData()
});
};